前言
之前有一篇appium 自动化的介绍 (https://blog.csdn.net/weixin_42277380/article/details/102911460)
这里还有另外一个自动化测试工具,是一个大佬改写,本人用过很是牛逼
简介
python-uiautomator2是一个自动化测试开源工具,仅支持Android平台的原生应用测试,它封装了谷歌自带的uiautomator2测试框架,提供便利的python接口。他允许测试人员直接在PC上编写Python的测试代码,操作手机应用,完成自动化,大大提高了自动化代码编写的效率。
工作原理
python-uiautomator2主要分为两个部分,python客户端,移动设备
- python端: 运行脚本,并向移动设备发送HTTP请求
- 移动设备:移动设备上运行了封装了uiautomator2的HTTP服务,解析收到的请求,并转化成uiautomator2的代码。
整个过程
- 在移动设备上安装
atx-agent
(守护进程), 随后atx-agent
启动uiautomator2服务(默认7912端口)进行监听 - 在PC上编写测试脚本并执行(相当于发送HTTP请求到移动设备的server端)
- 移动设备通过WIFI或USB接收到PC上发来的HTTP请求,执行制定的操作
安装工具
- Python2或者Python3均可。(也可以尝试使用Android上Python客户端:QPython)
- 移动设备安装atx-agent
环境搭建
1、安装adb :https://blog.csdn.net/weixin_42277380/article/details/102894252
2、安装python-uiautomator2
pip install --pre -U uiautomator2
3、设备安装atx-agent
首先设备连接到PC,并能够adb devices
发现该设备。
# 从github下载atx-agent文件,并推送到手机。在手机上安装包名为`com.github.uiautomator`的apk
$ python -m uiautomator2 init
success
最后提示success,代表atx-agent初始化成功。
4.安装方法weditor
pip install --pre weditor
运行: python -m weditor
应用及操作
调用uiautomator2的过程
- 配置手机设备参数,设置具体操作的是哪一台手机
- 抓取手机上应用的控件,制定对应的控件来进行操作
- 对抓取到的控件进行操作,比如点击、填写参数等。
配置手机设备参数
python-uiautomator2连接手机的方式有两种,一种是通过WIFI,另外一种是通过USB。两种方法各有优缺点。
WIFI最便利的地方要数可以不用连接数据线,USB则可以用在PC和手机网络不在一个网段用不了的情况。
-
使用WIFI连接
手机获取到手机的IP,并确保电脑可以PING通手机。手机的IP可以在设置-WIFI设置里面获取到。
比如手机的IP是192.168.0.100
,连接设备的代码为import uiautomator2 as u2 d = u2.connect('192.168.0.100')
-
使用USB连接
手机的序列号可以通过
adb devices
获取到,假设序列号是123456f
,连接代码为import uiautomator2 as u2 d = u2.connect_usb('123456f')
如右图:
定位方式
- ResourceId定位:
d(resourceId="com.smartisanos.clock:id/text_stopwatch").click()
- Text定位
d(text="秒表").click()
- Description定位
d(description="..").click()
- ClassName定位
d(className="android.widget.TextView").click()
其他具体操作可看文档:https://github.com/openatx/uiautomator2
扩展
九宫格解锁:
import uiautomator2 as u2
u = u2.connect() # 手机连接到PC即可
u.swipe_points([(0.235, 0.456), (0.503, 0.449), (0.509, 0.601), (0.777, 0.603), (0.771, 0.763), (0.222, 0.75)], 0.2)
其中(0.235, 0.456)
代表 X(23.5%) Y(45.6%). 这里用绝对坐标也可以。
最后的0.2代表每一次滑动的时间。
基本操作 - 整理补充
import uiautomator2 as u2
d = u2.connect("--serial-here--") # 只有一个设备也可以省略参数
d = u2.connect() # 一个设备时
d = u2.connect("10.1.2.3") # 通过设备的IP连接(需要在同一局域网且设备上的atx-agent已经安装并启动)
d.app_current() # 获取前台应用 packageName, activity
d.app_start("com.example.app") # 启动应用
d.app_start("com.example.app", stop=True) # 启动应用前停止应用
d.app_stop("com.example.app") # 停止应用
app = d.session("com.example.app") # 启动应用并获取session
# session的用途是操作的同时监控应用是否闪退,当闪退时操作,会抛出SessionBrokenError
app.click(10, 20) # 坐标点击
# 无session状态下操作
d.click(10, 20) # 坐标点击
d.swipe(10, 20, 80, 90) # 从(10, 20)滑动到(80, 90)
d.swipe_ext("right") # 整个屏幕右滑动
d.swipe_ext("right", scale=0.9) # 屏幕右滑,滑动距离为屏幕宽度的90%
d.press("back") # 模拟点击返回键
d.press("home") # 模拟Home键
d.send_keys("hello world") # 模拟输入,需要光标已经在输入框中才可以
d.clear_text() # 清空输入框
# 执行shell命令
output, exit_code = d.shell("ps -A", timeout=60) # 执行shell命令,获取输出和exitCode
output = d.shell("pwd").output # 这样也可以
exit_code = d.shell("pwd").exit_code # 这样也可以
# 元素操作
d.xpath("立即开户").wait() # 等待元素,最长等10s(默认)
d.xpath("立即开户").wait(timeout=10) # 修改默认等待时间
# 常用配置
d.settings['wait_timeout'] = 20 # 控件查找默认等待时间(默认20s)
# xpath操作
d.xpath("立即开户").click() # 包含查找等待+点击操作,匹配text或者description等于立即开户的按钮
d.xpath("//*[@text='私人FM']/../android.widget.ImageView").click()
d.xpath('//*[@text="私人FM"]').get().info # 获取控件信息
for el in d.xpath('//android.widget.EditText').all():
print("rect:", el.rect) # output tuple: (left_x, top_y, width, height)
print("bounds:", el.bounds) # output tuple: (left, top, right, bottom)
print("center:", el.center())
el.click() # click operation
print(el.elem) # 输出lxml解析出来的Node
# 监控弹窗(在线程中监控)
d.watcher.when("跳过").click()
d.watcher.start()