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

codeskyblue · 2018年06月30日 · 最后由 a379611523 回复于 2018年09月21日 · 3907 次阅读

前言

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就可以了。

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

mark。 两个都用

来晚了,只能坐板凳了

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

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

成功吸引到了我...😁

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

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

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

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

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

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

920152261 回复

host是啥,port是啥

codeskyblue 回复

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

仅楼主可见
920152261 回复

init有报什么错吗?

codeskyblue 回复

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

仅楼主可见
17楼 已删除

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

hu_qingen 回复

地址呢

920152261 回复

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

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

赞,楼主画得真好

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

b_88 回复

靠你们了

执行“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'

mark,打卡sully

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

准备把appium改成ui2😁

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