背景

测试版本警告,目前功能这个功能刚写出来没多久,并不保证稳定。

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 运行

Yaml 文件的好处

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

yaml 具体配置

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,可能功能还不完善,欢迎大家提意见,我们来一起把它完善了。


↙↙↙阅读原文可查看相关链接,并与作者交流