测试版本警告,目前功能这个功能刚写出来没多久,并不保证稳定。
ATX 中的python-uiautomator2目前来说还是以纯 Python 为主, 基本上都是过程式的写法,判断逻辑也都比较简单。
前段时间学习了思寒 @seveniruby 大佬的 appcrawler,发现用 yaml 写测试脚本获取是个很好的方法。
不了解 yaml 的看这里 YAML 教程
本地的 uiautomator2 库先升级到最新。
要实现的功能:打开网易云音乐,搜索周杰伦,播放布拉格广场,验证播放按钮存在
原生 Python 写法
import uiautomator2 as u2
d = u2.connect()
d.set_fastinput_ime(True)
d = d.session("com.netease.cloudmusic")
if d(text="跳过").exists(timeout=5):
d.click(text="跳过")
d(description="搜索").click()
d.send_keys("周杰伦")
d.press("enter")
d(textContains="布拉格广场").click()
assert d(description="播放暂停").exists(timeout=5)
保存成文件test.py
然后 python test.py
运行测试
Yaml 格式写法
---
title: 网易云音乐测试
packageName: com.netease.cloudmusic
steps:
- q: //*[@content-desc="搜索"]
- text: 周杰伦
- q: 布拉格广场
- q: 播放暂停
action: assertExists
watchers:
- q: 跳过
保存成文件test.yml
,然后python -m uiautomator2.cli runyaml test.yml
运行
使用非常少的接口dump_hierarchy
, click
。稳定性更好。
先通过dump_hierarchy
接口获取界面 xml,然后通过 lxml 库分析所有组件的位置,调用 click 完成操作。
脚本运行的时候顺便输出日志,方便调试
性能数据、执行截图可以顺便一起做了(当前现在还没实现)
Yaml 用例运行时的日志输出
[I 180904 16:38:57 runyaml:119] Test begins: 网易云音乐测试
[I 180904 16:38:57 runyaml:120] launch app: com.netease.cloudmusic
[I 180904 16:39:02 runyaml:128] ==> {'query': '//*[@content-desc="搜索"]'}
[I 180904 16:39:02 runyaml:87] click: (940, 1602)
[I 180904 16:39:02 runyaml:56] trigger watcher: {'timeout': 0, 'query': '跳过'}
[I 180904 16:39:04 runyaml:87] click: (1008, 156)
[I 180904 16:39:04 runyaml:128] ==> {'text': '周杰伦'}
[I 180904 16:39:05 runyaml:45] input text: 周杰伦
[I 180904 16:39:07 runyaml:128] ==> {'q': '布拉格广场'}
[I 180904 16:39:08 runyaml:87] click: (123, 1194)
[I 180904 16:39:09 runyaml:128] ==> {'q': '//*[@content-desc="播放暂停"]'}
[I 180904 16:39:10 runyaml:87] click: (540, 1773)
[I 180904 16:39:11 runyaml:130] Finished
title 随便写
packageName 写了之后会调用session
函数启动应用
steps 包含每一个操作步骤
点击操作的完整的写法如下
- action: click
query: //*[@resource-id="tvb"]
timeout: 10
因为 action 默认就是 click,timeout 默认 10s,query 可以简写成q
, 所以可以简写成
- q: //*[@resource-id="tvb"]
如果 q 以/
开头代表代表 xpath, 如果是字符串,则会按照正则匹配没有元素的 text 字段
实现输入的写法
- text: 要输入的内容
运行 Python 代码的写法
- action: python
code: |-
print("Hello world")
断言的写法
- action: assertExists
q: 天气
watchers 这个字段的存在是为了方便点击弹窗,写法跟 steps 类似,区别就是 query 字段在这里是必须的,timeout 默认 0s
在每次操作 step 之前,都会先将 hierarchy 经过 watchers 处理。
目前还只是 Beta 版,可以会有 Bug,可能功能还不完善,欢迎大家提意见,我们来一起把它完善了。