当前位置: 首页 > 后端技术 > Python

App自动化,为什么Appium要用UiAutomator2?

时间:2023-03-25 20:29:38 Python

1.什么是UiAutomator2?许多人可能对UiAutomator2和UiAutomator感到困惑。UiAutomator是Google开发的一款运行在Android设备上的UI自动化测试工具。它基于JAVA语言。使用有一个限制,就是必须打包成APK。或者JAR,然后上传到设备上运行。其实UiAutomator2也有JAVA和Python版本。今天我们说的是Python版的UiAutomator2。至于JAVA版本可以参考之前写的文章:点我查看Python版本的UiAutomator2项目地址:https://github.com/openatx/ui...2.Appium和UiAutomator2是鼻祖移动自动化。Appium的早期版本基于UiAutomator和Bootstrap.jar。Bootstrap在初始化时被推送到Appium。在Android设备上,负责监听Appium发送的请求,转换后发送给UiAutomator进行处理,完成自动化操作。最新版Appium增加了对UiAutomator2的支持,更新了原理,功能和稳定性更加完善。原理图可参考:三、准备工作在使用UiAutomator2之前,需要做以下准备工作1、PC端配置Android开发环境2、使用pip安装uiautomator2依赖#安装依赖pip3install-Uuiautomator2#如果需要截屏,需要安装pillowpip3installpillow3,在手机上安装网上的atx-agent应用ps:atx-agent作为服务器,一直在后台运行类似于DeskTop,它可以模拟点击、滑动操作,生成操作源码等功能。首先通过pip安装weditor依赖包#基于浏览器查看App的界面元素pip3install-Uweditor然后在命令行输入weditor,会在浏览器中自动打开,然后通过ip连接到对应的设备,即可以在设备端获取到当前界面的控制信息。信息内容包括:控件??的层级关系、控件ID、文本内容、坐标值等。4.实战下面以闲鱼搜索商品为例,说说UiAutomator2的使用1.使用UiAutomator2连接设备连接设备有三种方式,分别是:局域网设备IP地址USB连接+设备序列号ADB+IP+端口号importuiautomator2asu2#方法一:局域网设备ip地址device=u2.connect(手机ip地址)#方法二:USB+设备序列号device=u2.connect(手机序列号)#方法三:ADB+#首先用USB线为设备连接PC,输入命令:adbtcpipportnumberformapping#拔掉USB线,通过ip地址+端口号连接device=u2.connect_adb_wifi(手机ip地址:端口号)2.打开闲鱼APP,调用上面的设备对象app_start()方法,应用程序包名称作为参数传入以打开应用程序。需要注意的是,如果方法中的第二个参数传入True,则可以冷启动App。默认为False#打开应用device.app_start(PACKAGE_NAME,stop=True)3.点击搜索栏进入搜索界面首先全局设置一个隐式等待,保证搜索元素时,避免卡顿导致的异常andnetworks#隐式等待20s,确保控件加载完毕device.implicitly_wait(20)然后,使用WEditor定位搜索入口控件的基本信息。UiAutomator2常用的定位方式有6种,分别是:ID定位Text文本定位Description定位ClassName定位Xpath定位组合定位例如:#常用6种定位方式#方式一:ID定位d(resourceId=elementID).click()#方法二:Text文本位置d(text="公众号:AirPython").click()#方法三:描述值位置d(description="AirPython").click()#方法四:ClassName定位d(className="安卓d.widget.TextView").click()#方法五:Xpath定位d.xpath("//*[@content-desc='AirPython']")#方法六:组合定位d(className="android.widget.ListView",resourceId=elementID)需要指出的是,当界面属性值不唯一时,组合定位非常实用,本例直接使用ID查找元素,然后点击跳转到搜索界面#点击进入搜索页面device(resourceId="com.taobao.idlefish:id/search_bg_img_front",).click()4.搜索UiAutomator2提供了send_keys()方法,用于设置里面的文字输入框。注意:参数clearif如果设置为True,输入内容前会清空输入框,默认为False#输入内容device.send_keys("Python",clear=True)#点击搜索按钮device(text="Search").click()5.SwipeUiAutomator2为滑动界面提供了两个方法,分别是:swipe_ext(滑动方向)swipe(起始x轴,起始y轴,结束x轴,结束y轴值,滑动时间)经测试发现滑动操作,swipe_ext()效果不稳定,建议对范围内的i使用swipe()函数(5):print('swipeonce')swipe_custom(device,0.5,0.8,0.5,0.2,1.2)另外,为了保证兼容不同分辨率的设备,建议按屏幕百分比自定义滑动方式defswipe_custom(device,start_x_percent,start_y_percent,end_x_percent,end_y_percent,during=1.0,interval=1):"""自定义滑动,更具适应性:paramdevice::paramstart_x_percent::paramstart_y_percent::paramend_x_percent::paramend_y_percent::paramduring::return:"""#获取屏幕的宽高width,height=device.window_size()device.swipe(start_x_percent*width,start_y_percent*height,end_x_percent*width,end_y_percent*height,during)ifinterval>0:sleep(interval)6.关闭应用完成自动化操作后,可以调用app_stop()方法强制关闭应用#StopAppdevice.app_stop(PACKAGE_NAME)当然也可以使用UiAutomator2在每次操作后提供方法app_clear()清除App数据#ClearAppdata#device.app_clear(PACKAGE_NAME)5.最后通过上面的例子,我们发现UiAutomator2有一个更简洁易懂的语法比Appium,代码量少很多。但是由于Uiautomator2只适用于Android端,Appium具有多语言和跨平台的特点。企业级自动化一般选择后者。我把所有源码都上传到了文章le到后台,后台回复“uiauto2”获取全部源码。如果您觉得文章还不错,请点赞、分享、留言,因为这将是我继续输出更多优质文章的最强大动力!