ATX 浅谈自动化测试工具 python-uiautomator2

codeskyblue · 2017年12月24日 · 最后由 bianwancheng 回复于 2019年01月03日 · 30002 次阅读
本帖已被设为精华帖!

前言

首先是看了这篇文章浅谈自动化测试工具 发现文章写的结构很合理,理解起来也很容易。本着学习的心态,模仿其结构再写一篇😀

简单介绍

python-uiautomator2是一个自动化测试开源工具,仅支持Android平台的原生应用测试。

支持平台及语言

python-uiautomator2封装了谷歌自带的uiautomator2测试框架,提供便利的python接口。他允许测试人员直接在PC上编写Python的测试代码,操作手机应用,完成自动化,大大提高了自动化代码编写的效率。

工作原理

以下图片使用Windows画图软件

如图所示,python-uiautomator2主要分为两个部分,python客户端,移动设备

  • python端: 运行脚本,并向移动设备发送HTTP请求
  • 移动设备:移动设备上运行了封装了uiautomator2的HTTP服务,解析收到的请求,并转化成uiautomator2的代码。

整个过程

  1. 在移动设备上安装atx-agent(守护进程), 随后atx-agent启动uiautomator2服务(默认7912端口)进行监听
  2. 在PC上编写测试脚本并执行(相当于发送HTTP请求到移动设备的server端)
  3. 移动设备通过WIFI或USB接收到PC上发来的HTTP请求,执行制定的操作

安装工具

  • Python2或者Python3均可。(也可以尝试使用Android上Python客户端:QPython)
  • 移动设备

环境搭建

安装adb

如命令行可以执行adb devices,则跳过此步骤
从谷歌官网下载Android Platform Tools https://developer.android.com/studio/releases/platform-tools.html,解压,并加包含adb.exe的目录加入到系统的PATH中。

安装python-uiautomator2

pip install --pre -U uiautomator2

设备安装atx-agent

首先设备连接到PC,并能够adb devices发现该设备。

# github下载atx-agent文件,并推送到手机。在手机上安装包名为`com.github.uiautomator`的apk
$ python -m uiautomator2 init
success

最后提示success,代表atx-agent初始化成功。

应用及操作

调用uiautomator2的过程

  1. 配置手机设备参数,设置具体操作的是哪一台手机
  2. 抓取手机上应用的控件,制定对应的控件来进行操作
  3. 对抓取到的控件进行操作,比如点击、填写参数等。

配置手机设备参数

python-uiautomator2连接手机的方式有两种,一种是通过WIFI,另外一种是通过USB。两种方法各有优缺点。
WIFI最便利的地方要数可以不用连接数据线,USB则可以用在PC和手机网络不在一个网段用不了的情况。

  1. 使用WIFI连接

    手机获取到手机的IP,并确保电脑可以PING通手机。手机的IP可以在设置-WIFI设置里面获取到。
    比如手机的IP是192.168.0.100,连接设备的代码为

    import uiautomator2 as u2
    d = u2.connect('192.168.0.100')
  2. 使用USB连接

    手机的序列号可以通过adb devices获取到,假设序列号是123456f,连接代码为

    import uiautomator2 as u2
    d = u2.connect_usb('123456f')

抓取手机上应用的控件

虽然很想用Android SDK内置工具uiautomatorviewer.bat,但是运行uiautomator2的时候,uiautomatorviewer.bat运行不起来,两者之间冲突太严重。
于是参考着uiautomatorviewer的界面,我又写了一个weditor,调用python-uiautomator2的两个接口screenshotdump_hierarchy这样就不会有冲突问题了

注:weditor依然处于开发期,功能可能会跟文中描述的有所不同

安装方法: pip install --pre weditor

使用方法:
首先运行python -m weditor,之后浏览器会自动打开一个网页 http://atx.open.netease.com (注:这个网址仅提供一个前端,而python -mweditor这个命令则本地开放了HTTP的接口,前端去跟本地的服务去通信)

下图为网页的截图

重点说下这个部分

先忽略iOSNeco这两个,直接选择Android。输入框中可以写设备的IP或者设备的Serial(序列号),跟上面提到的配置手机设备参数用法一致。之后点击Connect,如果一切正常就会出现一个绿色的叶子。

页面刷新时,点击蓝色的Reload按钮重新刷新。

定位方式

  1. ResourceId定位: d(resourceId="com.smartisanos.clock:id/text_stopwatch").click()
  2. Text定位 d(text="秒表").click()
  3. Description定位 d(description="..").click()
  4. ClassName定位 d(className="android.widget.TextView").click()

xpath定位并不支持,一开始打算做支持的,但是发现不用也能搞定。就是代码写的长一点而已。

操作控件

# click
d(text="Settings").click()

# long click
d(text="Settings").long_click()

# 等待元素的出现
d(text="Settings").wait(timeout=10.0)

九宫格解锁:以前文章写过 https://testerhome.com/topics/11034

中文字符的输入
如果可以定位到元素,直接通过set_text就可以输入中文

d(text="Settings").set_text("你好")

如果定位不到元素需要使用send_keys方法,以及切换输入法

d.set_fastinput_ime(True)
d.send_keys("你好 Hello")
d.set_fastinput_ime(False) # 输入法用完关掉

截图:d.screenshot("home.jpg")
获取图层信息:xml = d.dump_hierarchy()

还有太多太多的操作,我就不写了。更多更详细的API接口文档,直接去Github上看文档吧, 记得留下你的Star

https://github.com/openatx/uiautomator2

搞定收工

^_^

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

火钳 占楼

不支持xpath的话 有的app是不是不好找控件呢?就楼主说的这4个元素,还是不能满足需求的样子

张全蛋 回复

查询条件还有很多,后面我留了一个链接

张全蛋 回复

不支持xpath 可以支持text textContains

这么多方法,总有一款适合你

仅楼主可见
zangtian2 回复

你可以把报错信息打出来,我这还没见过AndroidO的设备

支持移动端webview吗

ice 回复

webview用selenium就好了

还有太多太多的操作,我就不写了。看Github上的文档吧,绝对比我现在写的要好和全
这个我不是十分赞同。

github上就没介绍weditor……

思寒_seveniruby 将本帖设为了精华贴 12月26日 22:55
huj 回复

没init

不错,之前看着uiautomator2仅支持java,我的头就大了。因为写着Java效率太低。

小马 ubuntu16.04 ATX 使用记录 中提及了此贴 01月25日 17:23
16楼 已删除

执行python -m weditor时会报错,求助!!

C:\Users\Administrator>python -m weditor
listen port 17310
[I 180205 11:22:46 web:2087] 304 GET /api/v1/version (::1) 1.00ms
SN -
[E 180205 11:22:56 web:1614] Uncaught exception GET /api/v1/devices/-/screenshot
(::1)
HTTPServerRequest(protocol='http', host='localhost:17310', method='GET', uri
='/api/v1/devices/-/screenshot', version='HTTP/1.1', remote_ip='::1')
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\tornado\web.py", line 1534, in execut
e
result = method(*self.path_args, **self.path_kwargs)
File "C:\Python27\lib\site-packages\weditor__main
_.py", line 134, in get

d.screenshot().convert("RGB").save(buffer, format='JPEG')
AttributeError: 'NoneType' object has no attribute 'screenshot'

蔡瑞淳 回复

找到原因了,我忘了connect手机😂

HTTPConnectionPool(host='10.155.238.243', port=7912): Read timed out. (read timeout=10)
链接超时,为啥捏


请问楼主ImportError: No module named cv2是怎么回事啊?

miaohaidong 回复

小bug,多谢反馈,已经修复 . pip install --pre -U weditor 重新试试

codeskyblue 回复


能够弹出网页了,但是依旧提示Local server not started

之前有同事无意卸载了手机里面的uiautomator.apk,最后查看了你的代码实现才发现必须要通过python -m uiautomator2 init重新安装才行。
这块还是注明一下吧。
另外,你报错还是要友好点,希望能把这些问题比如http端口没有正常映射以及发送http请求时候的错误做一些简单的封装。
总体来说,很好的weditor

陈雷 回复

多谢反馈,会渐渐完善的

多设备并行执行的时候不如appium稳定。经常出现服务断开的现象、

chunyong 回复

单个设备很稳定?

请问支持android 7.1.1系统的设备吗,例如vivo X20,我总是连接失败
Traceback (most recent call last):
File "C:\Python\Python35\lib\site-packages\weditor_main.py", line 297, in post
ret = eval(code, {'d': d})
File "", line 1, in
File "C:\Python\Python35\lib\site-packages\uiautomator2__init
.py", line 1218, in inner
return fn(self, *args, **kwargs)
File "C:\Python\Python35\lib\site-packages\uiautomator2__init
.py", line 1261, in click
self.session.click(x, y)
File "C:\Python\Python35\lib\site-packages\uiautomator2__init
.py", line 996, in click
ret = self.jsonrpc.click(x, y)
File "C:\Python\Python35\lib\site-packages\uiautomator2__init
.py", line 322, in __call_
return self.server.jsonrpc_retry_call(jsonrpc_url, self.method, params, http_timeout)
File "C:\Python\Python35\lib\site-packages\uiautomator2_init.py", line 329, in jsonrpc_retry_call
return self.jsonrpc_call(*args, **kwargs)
File "C:\Python\Python35\lib\site-packages\uiautomator2__init
_.py", line 373, in jsonrpc_call
raise err
uiautomator2.JsonRpcError: -32001 Server error: java.lang.SecurityException
[Finished in 1.259s]

话说,我如果想用uiautomator2把本地硬盘里的APK装到手机上,应该怎么做呢?

蔡瑞淳 uiautomator2 知识点滴记录 中提及了此贴 03月23日 12:03
xtt python+atx+uiautomator2 (codeskyblue )--学习心得 中提及了此贴 03月24日 11:02
xtt python+atx+uiautomator2 (codeskyblue )--学习心得 中提及了此贴 03月24日 11:02
linpengcheng ATX-uiautomator2 实现 webview 的操作 中提及了此贴 03月29日 21:08

请问下楼主,atx-agent经常返回502是怎么回事?

零飞飞 回复

uiautomator 这个Apk可能经常退出,不行就提个issue

我使用stf机器执行uia2 init的时候会报一个错误,这是怎么回事儿呢?

xiaqing 回复

网络错误,github被强了吧

codeskyblue 回复

我直接用源码调试就可以顺利执行,命令行就不行。

1、不能使用stf的设备远程连接使用weditor吗?

[W 180411 17:48:06 web:2063] 430 GET /api/v1/devices/1739cdba-b03c-4ee5-8966-423a0ad3944d/screenshot (::1) 24.20ms
SN 1739cdba-b03c-4ee5-8966-423a0ad3944d
Traceback (most recent call last):
File "/usr/local/lib/python2.7/site-packages/weditor/__main__.py", line 134, in get
d.screenshot().convert("RGB").save(buffer, format='JPEG')
File "/usr/local/lib/python2.7/site-packages/uiautomator2/__init__.py", line 748, in screenshot
r = requests.get(self.server.screenshot_uri)
File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 72, in get
return request('get', url, params=params, **kwargs)
File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 58, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 502, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 612, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python2.7/site-packages/requests/adapters.py", line 490, in send
raise ConnectionError(err, request=request)
ConnectionError: ('Connection aborted.', BadStatusLine("''",))
xiaqing 回复

应该跟stf不冲突的,你这个问题好像是因为init的失败的问题

我的andriod连接成功后,显示手机屏幕的窗口很小,而且没法拖动窗口,请问这个是兼容
性问题,还是配置问题?

RuntimeWarning: uiautomator2 is down, restart
如何重启?

飞狐 回复

这个意思是自己正在重启中,不用管

XG2 回复

换成chrome就没事了

请问,我安装好了。uiautomator2。再去执行python -m uiautomator2 init这条语句报以下错误是什么原因:
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='github-production
-release-asset-2e65be.s3.amazonaws.com', port=443): Max retries exceeded with ur
l: /53296967/aaffc180-23bf-11e8-8860-55319ef04337?X-Amz-Algorithm=AWS4-HMAC-SHA2
56&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20180420%2Fus-east-1%2Fs3%2Faws4_requ
est&X-Amz-Date=20180420T064358Z&X-Amz-Expires=300&X-Amz-Signature=302e0be75f8b2c
40cc3da27d748ee8636659a1c532038d5e82925f3ac9e2a655&X-Amz-SignedHeaders=host&acto
r_id=0&response-content-disposition=attachment%3B%20filename%3Dapp-uiautomator.a
pk&response-content-type=application%2Fvnd.android.package-archive (Caused by Ne
wConnectionError(' 0003F1E5F8>: Failed to establish a new connection: [Errno 10060] ',))

飞狐 JAVA 版 ATX-Client 中提及了此贴 04月24日 19:12


楼主,发现一个bug,win10系统,连接手机成功,但是界面不显示,不过可以进行点击操作,代码也显示

Whsnd 回复

手机型号也说下

codeskyblue 回复

三星s8 安卓版本8.0

codeskyblue 回复


vivo 安卓版本4.4 也不显示界面

codeskyblue 回复


界面430

本人弄了一台PC A,连接手机,然后再从另外一台PC B 通过SSH 登录到PC A上,然后运行”python -m uiautomator2 init”,就会提示连接超时,log如下。但是我如果直接在PC A上运行就可以正常的初始化成功。麻烦楼主帮忙看看问题

[root@e2e ~]# python -m uiautomator2 init
2018-05-22 17:55:30,921 - main.py:269 - INFO - Detect pluged devices: [u'c3718c7c']
2018-05-22 17:55:30,921 - main.py:286 - INFO - Device(c3718c7c) initialing ...
2018-05-22 17:55:31,214 - main.py:113 - INFO - install minicap
2018-05-22 17:55:31,385 - main.py:120 - INFO - install minitouch
2018-05-22 17:55:31,626 - main.py:137 - INFO - apk(1.0.12) already installed, skip
2018-05-22 17:55:31,679 - main.py:175 - INFO - atx-agent(0.2.1) already installed, skip
2018-05-22 17:55:31,842 - main.py:212 - INFO - launch atx-agent daemon
Traceback (most recent call last):
File "/usr/lib64/python2.7/runpy.py", line 162, in run_module_as_main
"
main", fname, loader, pkg_name)
File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code
exec code in run_globals
File "/usr/lib/python2.7/site-packages/uiautomator2/
main.py", line 348, in
main()
File "/usr/lib/python2.7/site-packages/uiautomator2/
main.py", line 344, in main
fire.Fire(MyFire)
File "/usr/lib/python2.7/site-packages/fire/core.py", line 127, in Fire
component_trace = _Fire(component, args, context, name)
File "/usr/lib/python2.7/site-packages/fire/core.py", line 366, in _Fire
component, remaining_args)
File "/usr/lib/python2.7/site-packages/fire/core.py", line 542, in _CallCallable
result = fn(*varargs, **kwargs)
File "/usr/lib/python2.7/site-packages/uiautomator2/
main.py", line 273, in init
ignore_apk_check)
File "/usr/lib/python2.7/site-packages/uiautomator2/
main.py", line 295, in _init_with_serial
ins.launch_and_check()
File "/usr/lib/python2.7/site-packages/uiautomator2/
main_.py", line 225, in launch_and_check
'http://localhost:%d/version' % lport, timeout=3)
File "/usr/lib/python2.7/site-packages/requests/api.py", line 72, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python2.7/site-packages/requests/api.py", line 58, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 508, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python2.7/site-packages/requests/sessions.py", line 618, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python2.7/site-packages/requests/adapters.py", line 521, in send
raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPConnectionPool(host='localhost', port=52630): Read timed out. (read timeout=3)

@codeskyblue 每次连接都不行,是网络超时导致的还是连接的问题?


连接不是是为什么,网络正常、安卓上也装了对应服务,楼主求解答

linpengcheng 基于 ATX-Server 的 UI 自动化测试框架 中提及了此贴 06月18日 22:20
异彩飞天 回复

uiautomator2 定位元素,怎么实现啊,d 是java语言吧

python-uiautomator2,请问下楼主,python语言写脚本的花,用uiautomator2捕捉到元素后,怎么用python语言现实啊,d(className="android.view.View", instance=44) 这个是java语言现实的吧 😱

arsenalley 回复

后端是java的uiautomator2,这个是python做的封装

codeskyblue 回复

具体步骤是如何实现的,可以告诉我这个菜鸟吗 ?😱

为啥有的控件找起来非常非常慢,用resourceId定位的,要等好几分钟才有返回,有时又找不到,都是同一个界面

判断子选择器存在不存在是不能用用exists么,
如果不存在不会返回false,是报错了

使用USB连接

手机的序列号可以通过adb devices获取到,假设序列号是123456f,连接代码为

import uiautomator2 as u2
d = u2.connect_usb('123456f') 这段连接代码 在什么地方写啊

墨语 回复

在代码编辑器里面写 :)

codeskyblue 回复

我有个疑问,就是我用python开发工具p cha r m进行开发导入uiautomator 总是无法导入,提示没有模块

codeskyblue 回复

请问,现在支持多台设备同时执行脚本吗?
哪里有sample可以看?

lina 回复

我也碰到这个问题,很奇怪,不知道你的解决了么?

这个提示我就很迷茫, 我不是用了python -m weditor吗

还有一点, 我昨天也是, 但是不知道怎么就好了..

我输入python -m weditor后并没有自动打开一个网页 http://atx.open.netease.com,出现了如下图:

有没有大佬知道什么原因啊

70楼 已删除
陈立志 回复

现在改成本地的了,就是这个网页,没错的

仅楼主可见

我在进行到

就卡住了,提示如下error

用的是安卓sdk的虚拟机,版本是4.4

发现使用Android 9手机调试,解锁状态下无法运行测试脚本,总是在初始化的时候报错。
运行到u = u2.connect_usb(‘HM8LDA8LRCDA8SEA’),或者u.healthcheck()这句就会卡住。reset_uiautomator()时提示 "Uiautomator started failed. Find solutions in https://github.com/openatx/uiautomator2/wiki/Common-issues",在该网页没能找到解决的方法。
但手动熄屏之后运行脚本,可以跑起来。所以每次都是跑起来再给机器解锁,使用Android8.1不会有这种现象。
请问有大佬知道怎么解决吗?

wujiajing 回复

问题不清楚,但是解决方法是有的,你可以使用adb判断当前是否是亮屏状态,然后再发送电源键给手机就好了

使用 weditor 可以连接,显示界面,点击响应。 但是没有元素抓取, 只有屏幕坐标, 好痛苦, 是那里不对呢?

系统信息
PC: win10 64位, anaconda+py3.5
安装的 uiautomator2 (pip install --pre uiautomator2)
安装的 weditor (pip install --pre weditor)

手机:华为 荣耀7, android 6.0

现在都是重启手机后直接运行 weditor, 就这样。 用uiautomatorviewer 可以获得元素内容!
也重新执行过 python -m uiautomator2 init 这句, 问题依旧。

仅楼主可见
Montion912 回复

升级

codeskyblue 回复

拜托大佬能不能说的详细点,升级什么?怎么升级?万分感谢

Montion912 回复
pip install -U --pre uiautomator2
python -m uiautomator2 init
仅楼主可见
codeskyblue 回复

大佬我弄好了 谢谢你的解答 感谢

sudo python -m uiautomator2 init 只后报错EnvironmentError: package com.github.uiautomator not installed


请问一下大家 这个问题是怎么回事。使用电脑连接安卓模拟器,adb的连接什么的都没问题,可是在执行了 python -m weditor之后就一直这样。

之前手机安装还好好的,今天两台荣耀手机使用python -m uiautomator2 init --mirror全报502的错误了,uiautomator2是0.1.7的版本

simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44

请教一个问题,当id和classname都不唯一的时候,这个控件的位置需要如何定位呢?

xpath

@Whsnd win10系统,连接手机成功,但是界面不显示,不过可以进行点击操作,代码也显示。。。这个问题解决了吗

请问支持IOS自动化测试吗

click按下没有抬起的事件,导致再click该按钮的时候无法点击

yu 回复

d.touch.up()

codeskyblue 回复

但是我发现我下载的uiautomator2运行xpath方法的时候提示不支持,有点不是很懂。并且我还有几个疑问麻烦楼主帮忙看下:
1.如果实现原理是手机中封装了uiautomator2的HTTP服务,可以解析PC端发过来的HTTP请求(故需要PC和手机在一个网络下),那么如果是使用qpython的话,是在手机端自行触发的,这样就不需要PC并且也不需要这个网络环境了?

陈立志 回复

这个问题解决了吗 ?我的也是和你的一样啊 OPPO A57

代码贴出来看看

1、使用python -m weditor启动了,报了个403错误。请问大佬这个是什么情况,ui2已经用的最新版本。并提示init成功。
2、我是genymotion模拟器起的6.0版本

500 GET /api/v1/devices/98d26007-e512-44de-aefa-fa71669c427a/screenshot,,这是什么原因

simple [精彩盘点] TesterHome 社区 2018年 度精华帖 中提及了此贴 01月07日 12:08
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册