APP自动化工具uiautomator2

一、介绍

uiautomator2是uiautomator的升级版,uiautomator是Google开发的一款用来做安卓自动化测试的Java库,uiautomator2则是将uiautomator中的接口封装成了Python库。因此它支持的语言为Python

优点主要概括如下:

  环境搭建简单方便
  执行速度很快
  UI元素定位便捷好用、可视化好
  获取toast非常简单

二、环境部署

1、安装adb并配置环境变量(这个就不多讲了,安装很简单)
2、安装python的uiautomator2库

pip install uiautomator2

3、安装atx-agent

python-m uiautomator2 init
这一步的目的是从github上下载atx-agent,推送到手机,作为服务端,因此先要保证adb可以链接到手机或者模拟器
安装成功后,可以看到模拟器桌面出现一个小汽车图标,这个就是atx.apk
如果安装失败,可以手动安装
这是网上找的一个教程:https://blog.csdn.net/qq_24741027/article/details/118052075

4、安装weditor

pip3 install weditor
weditor是基于浏览器的UI元素查看器

如果安装报错,官网解决方案为:
通过git将weditor文件拉到本地安装,经过测试并未安装成功
git clone https://github.com/openatx/weditor
pip3 install -e weditor
通过多次测试原因是python版本和weditor版本不一致
我用的python是3.9.6,weditor目前最新版本是0.6.7
使用weditor==0.6.4版本安装成功
pip install weditor==0.6.4
安装好后,在命令行输入 python -m weditor 会自动打开浏览器,在页面上输入模拟器的设备序列号,点击Connect,然后点击Dump Hierarchy刷新,可以看到模拟器的界面
注意:(个人遇到的问题)
安装好启动命令行会有编码问题,site-packages\weditor\web\handlers下的shell.py文件,根据相应的报错将byte转换为字符串

三、操作示例

链接手机或者模拟器(链接方式有多种,ip、端口、或者设备号)

import uiautomator2 as u2
d = u2.connect("127.0.0.1:62001")

connect("10.0.0.1:7912")
connect("10.0.0.1") # use default 7912 port
connect("http://10.0.0.1")
connect("http://10.0.0.1:7912")
connect("cff1123ea") # adb device serial number

检测是否链接成功,打印d.info可以获得设备信息代表链接成功


打开app,然后打印d.info,得到的结果里的currentPackageName即是包名

启动指定的app,其语法是:

d.app_start("指定的包名")
默认的这种方法是先通过atx-agent解析apk包的mainActivity,然后调用am start -n $package/$activity启动
d.app_start("指定的包名", use_monkey=True)
当第一种方式打不开app时,使用第二种打开方式
使用 monkey -p com.example.hello_world -c android.intent.category.LAUNCHER 1 启动
这种方法有个副作用,它自动会将手机的旋转锁定给关掉

打开weditor UI查看器

python -m weditor
鼠标移动到搜索点击一下,可以看到有多种定位方式可选择,例:resourceId、xpath、text

隐性等待语法

d.implicitly_wait(等待时长) 单位是s,默认20秒
每一步操作需要加上等待时间,因为下一步的元素控件并不会立即出现
隐性等待只需要加一次,全局通用,在等待时长内元素出现就会进行下一步操作,而不像强制等待一直要等够设置的时长。因此隐性等待相对比较节约时间

元素定位方式示例

resourceId定位方式
d(resourceId='com.xxx.client.android:id/xxx').click()
xpath定位方式
d.xpath('//*[@resource-id="com.xxx.client.android:id/xxx"]').click()
根据文本内容定位
d(text="关注").click()
然后可以使用get_text()方法拿到文本值,使用assert进行断言
assert d(text="关注").get_text() == "关注"
点击定位
d.click(0.341, 0.188)
输入内容
d.send_keys("大米")
获取屏幕尺寸
d.window_size()

滑屏操作

d.swipe(sx,sy,ex,ey,0.5)
滑屏操作在uiautomator2中是swipe()方法,和appium类似,sx, ex和sy,ey分别表示起点和终点的坐标

比如我们要向下滑5次,因此可以写个for循环。这里有几点需要注意下:
为了提高屏幕滑动的稳定性,需要加入强制等待,等待(根据情况自行设定)s
滑动距离尽量大点,比如y轴起点终点可以设置系数分别为0.9, 0.1,如果你设置为0.9,0.5,很可能会出现滑动距离太小,导致没有滑过去的情况

uiautomator2还提供了一个扩展的滑动功能,swipe_ext(),不需要坐标,只需提供方向如"left",“right”,“up”,“down”。经过试验,感觉不太稳定,因此还是采用常规的方法

停止app并清理环境,这里使用app_stop()和app_clear()方法

d.app_stop("com.xxx.client.android")
d.app_clear("com.xxx.client.android")

语法总结

你可能感兴趣的:(androidpython)