可能不少人对 UiAutomator2 和 UiAutomator 傻傻分不清楚python
UiAutomator 是 Google 开发的一款运行在 Android 设备上的 UI 自动化测试工具,基于JAVA语言,使用它有一个限制,就是必须打包成 APK 或 JAR,而后上传到设备,才能运行android
事实上,UiAutomator2 一样有 JAVA和 Python 版,今天咱们聊的是 Python 版本的 UiAutomator2git
至于 JAVA 版本的能够参考以前写的文章:点我查看github
Python 版本的 UiAutomator2 项目地址:小程序
https://github.com/openatx/uiautomator2微信小程序
做为移动端自动化的鼻祖,早期版本的 Appium 是基于 UiAutomator 和 Bootstrap.jar浏览器
其中,Bootstrap 在 Appium初始化的时候,被推送到 Android 设备上,负责监听 Appium 发过来的请求,并转换后发送给 UiAutomator 去处理,完成自动化操做微信
最新版本的 Appium 加入了对 UiAutomator2 的支持,原理进行了更新,功能和稳定性更加完善网络
原理图能够参考:app
在使用 UiAutomator2 以前,须要作以下准备
一、在 PC 端配置 Android 开发环境
二、使用 pip 安装 uiautomator2 依赖
# 安装依赖 pip3 install -U uiautomator2 # 若是须要截屏,须要安装pillow pip3 install pillow
三、在手机上安装 atx-agent 应用
ps:atx-agent 做为服务端,一直运行在后台
# 安装apk服务到手机上 python -m uiautomator2 init
四、安装 weditor
WEditor 经过 ip 链接手机,便可以实时查看 App 的界面元素信息
和 Appium DeskTop 相似,能够模拟点击、滑动操做、生成操做源码等功能
首先,经过 pip 安装 weditor 依赖包
# 基于浏览器查看 App 的界面元素 pip3 install -U weditor
而后,在命令行输入 weditor,会自动在浏览器中打开,接着经过 ip 链接对应的设备,便可以获取设备端当前界面的控件信息
信息内容包含:控件的层级关系、控件 ID、文本内容、坐标值等内容
仍是以闲鱼搜索商品为例,聊聊 UiAutomator2 的使用
一、链接设备
使用 UiAutomator2 链接设备有 3 种方式,分别是:
局域网设备 IP 地址
USB 链接 + 设备序列号
ADB + IP + 端口号
import uiautomator2 as u2 # 方式一:局域网设备ip地址 device = u2.connect(手机ip地址) # 方式二:USB + 设备序列号 device = u2.connect(手机序列号) # 方式三:ADB+ # 首先,设备用USB线链接PC,输入命令:adb tcpip 端口号进行映射 # 拔掉USB线,经过ip地址+端口号进行链接 device = u2.connect_adb_wifi(手机ip地址:端口号)
二、打开闲鱼 APP
调用上面 device 对象中 app_start() 方法,传入应用的包名做为参数能够打开应用
须要注意的是,方法中的第二个参数若是传入 True,能够冷启动 App,默认值为 False
# 打开应用 device.app_start(PACKAGE_NAME, stop=True)
三、点击搜索栏进入搜索界面
首先,全局设置一个隐式等待,保证查找元素的时候避免由于卡顿、网络致使的异常
# 隐式等待20s,保证控件加载完成 device.implicitly_wait(20)
而后,经过 WEditor 定位到搜索入口控件的基本信息
经常使用的 UiAutomator2 定位方式有 6 种,分别是:
ID 定位
Text 文本定位
Description 定位
ClassName 定位
Xpath 定位
组合定位
例如:
# 经常使用的6种定位方式 # 方式一:ID定位 d(resourceId=元素ID).click() # 方式二:Text文本定位 d(text="公众号:AirPython").click() # 方式三:Description值定位 d(description="AirPython").click() # 方式四:ClassName定位 d(className="android.widget.TextView").click() # 方式五:Xpath定位 d.xpath("//*[@content-desc='AirPython']") # 方式六:组合定位 d(className="android.widget.ListView", resourceId=元素ID)
须要指出的是,当界面属性值不惟一的时候,组合定位就显得很实用
本例直接使用 ID 去找到元素,而后执行点击操做,跳转到搜索界面
# 点击到搜索页面 device(resourceId="com.taobao.idlefish:id/search_bg_img_front",).click()
四、搜索
UiAutomator2 中提供了 send_keys() 方法,用于向输入框中设置文本
注意:参数 clear 若是设置为 True,则在输入内容以前,会先清空输入框,默认值为 False
# 输入内容 device.send_keys("Python", clear=True) # 点击搜索按钮 device(text="搜索").click()
五、滑动
UiAutomator2 提供了两个方法用于滑动界面,分别是:
swipe_ext( 滑动方向 )
swipe( 开始 x 轴,开始 y 轴,结束 x 轴,结束 y 轴值,滑动时间 )
通过测试发现,滑动操做,swipe_ext() 使用效果不稳定,建议使用 swipe() 函数
for i in range(5): print('滑动一次') swipe_custom(device, 0.5, 0.8, 0.5, 0.2, 1.2)
另外,为了保证兼容不一样分辨率的设备,建议经过屏幕百分比自定义滑动方法
def swipe_custom(device, start_x_percent, start_y_percent, end_x_percent, end_y_percent, during=1.0, interval=1): """ 自定义滑动,适配性更高 :param device: :param start_x_percent: :param start_y_percent: :param end_x_percent: :param end_y_percent: :param during: :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) if interval > 0: sleep(interval)
六、关闭应用
在完成自动化操做后,就能够调用 app_stop() 方法强制关闭应用
# 中止App device.app_stop(PACKAGE_NAME)
固然,能够在每次操做完,使用 UiAutomator2 提供的方法 app_clear() 清除 App 数据
# 清除App数据 # device.app_clear(PACKAGE_NAME)
经过上面的实例,咱们发现 UiAutomator2 相比 Appium,语法更简洁易懂,代码量也少了不少
可是因为 Uiautomator2 仅适用于 Android 端,Appium 拥有多语言、跨平台的特性,企业级自动化通常会选择后者
我已经将文中所有源码上传到后台,关注公众号「 AirPython 」后回复「 uiauto2 」便可得到所有源码
若是你以为文章还不错,请你们 点赞、分享、留言下,由于这将是我持续输出更多优质文章的最强动力!
推荐阅读