基于ATX的安卓自动化测试实践
ATX是包含了设备管理、基于web的控件分析和使用Python编写测试的一整套相对成熟的自动化解决方式。
由于包含的控件较多,梳理下方便学习和应用。
ATX介绍
大致经历了以下阶段:
- adb服务的HTTP接口封装
- openstf 的Go重写:atx-server
- atx-agent的开发,支持设备无线连接
- atx-server2:Python重写
各主要组件的分工如下:
atx-agent
目的:屏蔽安卓机差异,提供统一的HTTP接口供uiautomator2调用。支持WiFi连接。
- Go开发
- 日志文件: /sdcard/atx-agent.log
adb push atx-agent /data/local/tmp
adb shell chmod 755 /data/local/tmp/atx-agent
# 启动常驻模式, 默认端口 7912
adb shell /data/local/tmp/atx-agent server -d
uiautomator2
UI自动化的python实现。分为2部分:
- python客户端:向移动设备发送HTTP请求
- 移动设备:运行封装了uiautomator2的HTTP服务,解析请求并执行
注:iOS的支持是通过facebook-wda库。
命令行使用
uiautomator2 --help
# 安装设备端需要的应用
# minicap, minitouch
# atx-agent
# uiautomator-v2 (uiautomator-server)
uiautomator2 init
# 当前应用
uiautomator2 current
# 截屏
uiautomator2 screenshot
python接口
具体使用文档参考 uiautomator2.
-
Shell命令
-
Key Events
-
Selector
-
支持for 循环
-
支持部分执行调试
import uiautomator2 as u2
# 支持USB或WiFi连接
d = u2.connect('your_device_ip')
d = u2.connect_usb('your_device_sn')
# Key Events
d.screen_on() # turn on/off
d.info.get('screenOn') # 当前屏幕状态
d.press("home")
d.unlock() # unlock screen
d.swipe_ext("up")
# 等待某元素出现
d(text="Settings").wait(timeout=3.0) # 返回布尔值,默认超时20s
# 弹窗处理
d.xpath.when(...).click(...)
d.xpath.watch_backgroud()
atxserver2
设备管理平台的服务端,默认地址为http://localhost:4000
其他组件:
- 安卓Provider (连接设备的机器)
- 客户端 atxserver2-python-client
rethinkdb --bind all &
export RDB_HOST=192.168.0.5
export RDB_PORT=28015
export RDB_USER=admin
export RDB_PASSWD=
export RDB_DBNAME=atxserver2
python3 main.py
adbutils
adb交互库,官方adb shell的封装,支持cli或python接口调用。
python -m adbutils -i *.apk # 支持远程文件存储
weditor
基于web的图层分析,类似于安卓自带的uiautomator viewer。
# 启动
python -m weditor
# 会打开 http://localhost:17310/
其他辅助
下面两个工具来自开源的STF,基于C++开发,性能更好。也是基于web管理的基础组件。
- minicap :实时屏幕投屏/截图
- minitouch :实时设备控制
使用
环境部署
# 1. 启动RethinkDB
docker run -it -p 28015:28015 d863
# 2. 启动android-provider
python main.py --server localhost:4000
# 3. 启动weditor
# python -m weditor
# 4. 启动atxserver2
python main.py
启动日志
atxserver2
PS D:\coding\github\atxserver2> python main.py
Namespace(auth='simple', auth_conf_file=None, debug=False, no_xheaders=False, port=4000)
[I 201026 10:39:28 main:70] listen on port http://10.100.251.46:4000
[I 201026 10:39:28 web:2161] 101 GET /websocket/heartbeat (::1) 0.00ms
[I 201026 10:39:28 provider:42] new websocket connected: ::1
[D 201026 10:39:29 provider:79] A new provider is online pyclient ID:78601648-1734-11eb-a063-f48e388155ad
android-provider
PS D:\coding\github\atxserver2-android-provider> python main.py --server localhost:4000
[I 201026 10:38:04 main:299] Owner: None
[I 201026 10:38:04 main:314] ProviderURL: http://10.100.251.46:3500
>>> Bundle atx-agent verison: 0.9.5
Downloading atx-agent-386.tar.gz 4453385 / 4453385 [Done]
Downloading atx-agent-amd64.tar.gz 4632088 / 4632088 [Done]
Downloading atx-agent-armv6.tar.gz 4353956 / 4353956 [Done]
Downloading atx-agent-armv7.tar.gz 4348419 / 4348419 [Done]
>>> Zip created vendor/atx-agent-0.9.5.zip
>>> app-uiautomator.apk verison: 2.3.1
Downloading app-uiautomator.apk 2165152 / 2165152 [Done]
>>> app-uiautomator-test.apk verison: 2.3.1
Downloading app-uiautomator-test.apk 1212676 / 1212676 [Done]
Downloading WhatsInput-1.0.apk 265471 / 265471 [Done]
Downloading stf-binaries-0.2.1.zip 5400734 / 5400734 [Done]
[W 201026 10:38:18 heartbeat:121] WS connect error: [Errno 10061] Unknown error, reconnect after 2s
参考
ATX作者文章
官方网站
其他
- scrcpy :minitouch替代方案