ATX 给 Appium 用户看的 ATX 指南 (Android 篇)

codeskyblue · 2018年06月30日 · 最后由 Sean Pan 回复于 2020年12月30日 · 5747 次阅读

前言

ATX 的 QQ 群里的新人经常会提一些问题,像 “Appium 是这样用的,ATX 该怎么实现呢?”。为了省去每次新人入群都要回答一遍的麻烦,所以写了这么一篇文章。

为什么不用 Appium,要用 ATX 了?

群里面的人这样说的

  1. 运行速度快,比 Appium 运行速度快了好多。(用户表示不知道 ATX 为什么快,PS(作者): 我其实也不知道 appium 为什么这么慢)
  2. 部署和使用比较简单(当初就是朝着这个方向开发的)

    最开始笔者在部署 appium 的时候,花了一整天的时间,最终还是部署好了。但后来还是放弃了,因为想到要部署这么多台机器,还不如自己开发一个测试框架来的方便(当时的需求也比较简单)

ATX 发展史

一开始的 atx 只是一个简单的 python 库,功能简单,还有不少的 bug,用户也不多。然而就是有这么一批死党,经常性的提 Issue,提 PR,还有社区的鼓励和宣传。让这个项目不断的向前。bug 也来越少,功能也越来越多。从原有的只支持 Android,后来又支持了 iOS。从原有的需要借助 uiautomatorviewer 来查看视图,后来又有了自己的 weditor 视图分析工具。从原有的需要借助 USB 才能连接手机,到现在可以支持无线连接手机。从原有的只能单机操作,到现在的支持远程控制,集群处理。
atx 的功能的越来越强,也终于让我们有底气出了这么一篇文章。

使用限制

Appium 基本上什么安卓版本都支持,各种语言的客户端。
ATX 只支持 Android 4.4+,仅 Python 语言。

Appium 支持的语言多,既是优势但同时也是包袱。每一个功能的新增或修改都可能要涉及到修改所有的客户端代码,维护成本实在是高。
ATX 选择 Python 最大的原因还是因为写起来方便,因为只维护一个语言版本,更新起来非常方便。

安装区别

提到安装首先需要先理解下 Appium 的架构

Appium, 其中的 Appium Server 是运行在 PC 端的

ATX,其中的 ATX-Agent 则是运行在手机端的。

appium的安装通常为以下几步

  • npm i -g appium 或者直接下载 Appium Desktop客户端
  • 下载安装 Java
  • 安装 AndroidSDK
  • 设置环境变量
  • pip install Appium-Python-Client

之后把手机接到电脑上,appium 会自动把各种程序安装到手机上(PS: 每次自动化的时候安装,感觉好奇怪)。

atx的将安装步骤精简了不少

  • 安装 adb
  • pip install --pre -U uiautomator2 # atx 经常更新,所以用这个命令安装最新版

手机接到电脑上之后,需要先运行一下命令 python -m uiautomator2 init将需要的程序部署到手机上,以便后续的自动化(PS:每个手机初始化一次就够了)。

参考:https://github.com/openatx/uiautomator2#installation

appium desktop 与 atx weditor

Appium Desktop 是一个单独的安装包,自带了一个 NodeJS 写的客户端作为 Inspector,可以方便的看到当前 UI 的布局信息,用来方便的写自动化代码。

ATX Weditor 是一个 python 库,命令行安装 pip install --pre weditor , 命令行启动(PS: windows 可以双击 weditor 快捷方式),会自动打开一个网页,用网页作为其 Inspector
如图所示

连接设备

appium 需要构造一个 desiredCapabilities,其中的 udid 字段通常对应设备的序列号。
以一个常见的配置文件为例

{
  "platformName": "Android",
  "deviceName": "vivo",
  "udid": "cff37bce3",
  "appPackage": "com.netease.cloudmusic",
  "appActivity": ".activity.LoadingActivity",
  "noReset": false,
  "unicodeKeyboard": true,
  "resetKeyboard": true
}

atx 没有这类配置文件,必需的字段只有一个就是设备的序列号。其他的都是可选的。对于是否启动应用给用户提供了的选择权。
将其翻译为完整的 atx 代码为。

import uiautomator2 as u2

d = u2.connect("cff37bce3")
d.set_fastinput_ime(True)
s = d.session("com.netease.cloudmusic")

这里省略了 appActivity,因为 atx 会自动解析出来相应的 appActivity。fastinput_ime是专门为自动化定制的输入法,支持中文的输入,和一些特殊的指令如搜索,清空。
d.session 函数对应于 appium 的 session 机制,每次运行相关代码的时候都会先检测一下应用是否存活。

注:atx 连接的时候可以填手机的序列号或者 ip 地址。因为测试代码最终是与手机上的一个服务的 atx-agent 通信,所以也支持填写 IP,但是需要运行代码的电脑跟手机在同一个网段。

控件的选择与操作

appium 常用定位元素的方法为find_element_by_xpath, find_element_by_id, find_element_by_text
一种常见的写法为

driver.implicitly_wait(10) # 设置元素的查找时间10s
element = driver.find_element_by_text("Settings")
if element:
    element.click()

转化成 atx 代码为

d(text="Settings").click(timeout=10)

atx 通常来说不推荐用 xpath,因为要 dump 所有的 hierarchy,速度比较慢。推荐用的时候各种查询条件混合一起使用。
典型的用法为

d(className="android.widget.Button", textContains="登录").click()
# using xpath
d.xpath('//android.widget.Button[contains(@text, "登录")]').click()

参考: https://github.com/openatx/uiautomator2#selector

弹框的处理

现在高版本的手机基本都会有一些权限确认窗口或者安装确认框。如果处理不好会非常影响自动化。

看到一个帖子说是可以配置一下就可以解决弹框了(PS:应该是只针对 iOS 的)https://testerhome.com/topics/14513

driver.switch_to.alert.accept()

atx 的方法更自由一点,你可以自由选择处理什么内容的弹窗,以及怎么处理。一个常见的自动点击安装按钮的方法

d.watcher("INSTALL").when(text="安装").click()
d.watcher("NEXT").when(text="下一步").click()
d.watchers.watched = True

Toast 的支持

appium 获取 toast 内容的代码我暂时没有搜索到,验证是否存在的倒是有

WebDriverWait wait = new WebDriverWait(androidDriver, 3);
WebElement toastView = wait.until(ExpectedConditions.presenceOfElementLocated(
          By.xpath(".//*[contains(@text,'" + toast + "')]")));

atx 是通过 accessibility 捕获到的 toast 内容,然后通过接口直接获取 toast 内容,至于怎么验证,交给脚本编写者来弄。
代码

# show toast action
message = d.toast.get_message()
assert "Success" in message

除了捕获 toast,还可以显示 toast d.toast.show("Hello world")

后续阅读

上面说的很多内容都被我一笔带过,说的不是很详细。其实这篇文章就只是想让你初步的了解一下 appium 与 atx 之间使用的区别。
想真的的用起来,我还是推荐你把 atx 中 uiautomator2 首页的文档通读一遍(如果你天资够好,10 分钟应该就够了)https://github.com/openatx/uiautomator2

贡献代码

atx 是一个全开源的项目,发展的现在已经接收了很多人的贡献。有的人喜欢提 Issue,有的人提 PR(Pull Request)比如 xpath 的支持,常见的 bug 修复。联想手机的支持,等等。
贡献代码其实很简单,Fork 一下项目,把觉得有问题的地方修复,或者想新增一些功能,git push 上去,然后 github 界面上点击下 pull request 就可以了。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 39 条回复 时间 点赞

进群后,咨询问题有人答复吗

QQ: 499563266

请问一下,群号是多少,我也想加群

洛神红茶 回复

版本低,升级下 uiautomator 2

d(text="复制链接").click()
message = d.toast.get_message()
assert "链接已复制到剪贴板" in message

楼主您好!使用示例代码获取 toast 我始终不能成功,请问是为什么呢?
报错:

uiautomator2.exceptions.JsonRpcError: -32601 Method not found: <Method not found> data: , method: getLastToast
阿凯 ATX 学习 (二)-Atx Weditor 中提及了此贴 05月11日 09:45

楼主 Weditor 点击 reload 报这个错误时什么原因啊。

codeskyblue 专栏文章:2018年 终总结 中提及了此贴 02月18日 10:26
codeskyblue 回复

请问楼主, ATX iOS 有 toast 相关 api 吗?

边万成 回复

兼容是兼容了,我最近也遇到个奇怪的问题。一截图 adb 就显示 offline 你可以 adb devices 看看设备还正常不

weditor 有没有兼容 win10 呢

12楼 已删除

楼主花图用的什么软件

我也准备 appium 转移 atx 了😁

准备把 appium 改成 ui2😁

ATX 非常好用,把图形识别跟 应用自动化原件都封装的很好。 代码简洁效率高,不过还是建议年轻同学多研究研究底层的东西,不要偏离底层实现原理😀

执行 “python -m weditor” 报错

C:\Users\Administrator>python -m weditor
Traceback (most recent call last):
File "E:\Python\lib\runpy.py", line 193, in run_module_as_main
"
main", mod_spec)
File "E:\Python\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "E:\Python\lib\site-packages\weditor__main
_.py", line 19, in
import StringIO
ModuleNotFoundError: No module named 'StringIO'

Droid roll 回复

靠你们了

讲真,atx 比 appium 好用多了。楼主呀,加油宣传!

赞,楼主画得真好

这个工具真的超级棒了。多谢楼主

.chao 回复

我也遇到了。。有解决吗。。

CC 回复

地址呢

谁说只有 python 版 atx,我这边已经写好了 java 版 atx,有兴趣可以用用我这边 atx 版的 java 版客户端,已经开源出来了,也顺带支持了 xpath 方式

27楼 已删除
仅楼主可见
codeskyblue 回复

没有哦。。success 的😂 还有大佬,感觉 weditor 上显示的有点看不清楚,是和手机分辨率有关系吗

.chao 回复

init 有报什么错吗?

仅楼主可见
codeskyblue 回复

哦,那就是采用封装 adb 命令搞咯

.chao 回复

host 是啥,port 是啥

HTTPConnectionPool(host='xx', port=xx): Max retries exceeded with url: /screenshot/0 (Caused by NewConnectionError(': Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。',))

大佬,知道这个怎么解决么

appium driver.get(url) 使用浏览器打开 url,这个 atx 怎么处理?

@codeskyblue 成立 atx 基金会 招人搞 ios 方向 ios 集群管理方向。。。。

早在半年前就已经从 appium 转向 atx

v5, 就是觉得 appium client 启停太啰嗦,还失败率高,果断转战用 u2。

成功吸引到了我...😁

非常不错,目前已经将公司项目从 appium 迁移至 atx
atx 吸引到我的地方就是两点:
1.启动速度快,比 appium 快了 2 倍不止
2.公司 app 的动态页面在网上找了各种方法都无法 dump 到布局文件,用 weditor 成功获取到!

希望此项目能持续保持维护,造福广大 tester

来晚了,只能坐板凳了

mark。 两个都用

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册