ATX 在 Android 手机内执行 UI 自动化测试

不二家 · 2017年10月09日 · 最后由 Elsie 回复于 2019年02月28日 · 4559 次阅读
本帖已被设为精华帖!

前言

前一段时间,已经完成借助ATX执行 UI 的一系列操作,然后得到我们所需的数据和结果,最后展示。

完成部署之后,一直觉得脚本的触发和执行比较依赖 Jenkins,特别是跑步性能测试经常需要跑 4 个小时左右,在这个时间段内会占用 Jenkins 某个 Slave 的使用,最重要的是,我们 Jenkins 会无缘无故的出现问题,如果模拟跑步没有执行完毕,那么本次执行的 Job 就不能正常收集到。

这个时候,我们老大提醒我,如果让 Python 脚本脱离 PC,直接运行在手机端内,是不是更好?

由于我们的脚本特别简单,上一帖子已经有过介绍,然后需要再次感谢@codeskyblue,atx-agent 真的是一个非常好用的库。用 Go 语言实现的类似一个服务端,Push 安装到手机内,接收一系列命令执行 UI 方面的动作。

这个时候有两个思路,

  • Busybox,然后通过 curl 命令组装的 shell 脚本实现对 UI 的操作,

  • QPython 或者 PythonForAndroid,由于 PythonForAndroid 找不到最新的 APK,QPython 社区更新时间比较近。选择 QPython。

那么站在巨人的肩膀上,通过 QPython 实现在手机端执行跑步性能测试所需的 UI 自动化动作。

QPython

QPython 是一个能让安卓手机运行和编写 Python 的 APP,到网上下载 APK 安装或者在 GOOGLE PLAY 搜索安装即可,我在 Github 找到下载链接

下载qpython-release.apk,然后使用 adb install 安装即可。

安装好之后,由于 uiautomator2 的库依赖 huamanize 和 requests,打开 QPython,点击 QPYPI,然后点击 INSTALL WITH PYTHON'S PYPI,分别执行:

pip install requests
pip install humanize

手机端 QPython 中 script 的路径

经过观察 QPython 中脚本路径在这个下面:

/storage/emulated/legacy/qpython/scripts

由于 uiautomator2 的库很简单,我就直接复制放在整个脚本执行目录里面,这样就不用安装了。

代码结构如下:

由于还未知道如何在 QPython 内执行 Nose 测试框架,重改了一下之前的 UI 自动化的部分代码,只是作为一个 demo,所以特别简单:

#coding=utf-8

import uiautomatorX as uiautomator2

import time

packagename = 'com.xx'
activity = 'com.xxx'
packagename_gps = 'com.xxxxx'
activity_gps = 'com.xxxxx'

uiautomator2.DEBUG = True

driver = uiautomator2.connect('http://localhost:7912')
driver.app_start(packagename_gps, activity=activity_gps)
time.sleep(5)
driver.app_start(packagename, activity=activity)
time.sleep(5)


def teardown():
    exit_run_module()

    driver.app_stop(packagename)
    driver.app_stop(packagename_gps)

def exit_run_module():
    driver(resourceId='running_button_change_mode_to_normal').click()

    driver(resourceId='pause_button').long_click()

    if driver(resourceId='finish_button').exists:
        driver(resourceId='finish_button').click()
    else:
        raise Exception(u"出错了,没有结束按钮")

    # print self.driver.dump_view()
    driver(text=u'确定').click()

def test_run():
    time.sleep(5)

    if driver(text=u'暂不升级').exists:
        driver(text=u'暂不升级').click()
    driver(text=u'运动').click()
    driver(text=u'户外跑').click()

    if driver(resourceId='running_button_change_mode_to_normal').exists:
        driver(resourceId='running_button_change_mode_to_normal').click()
    else:
        raise Exception(u"出错了,不在跑步地图界面")
    time.sleep(30)

    driver.screenshot('run_end.png')

if __name__ == '__main__':
    test_run()
    teardown()

先将代码通过执行 adb push xxx /storage/emulated/legacy/qpython/scripts。

这样在 QPython 内,点击文件,点击 scripts,然后执行。如图所示。

写在最后

QPython 给了我们实现 UI 自动化更多的可能,也能更大程度的提高 UI 执行的稳定性。

后续很多细节需要完善。

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

请问楼主 可以不要这个界面吗 然后通过远程的方式启动测试脚本?

simple [精彩盘点] TesterHome 社区 2018 年 度精华帖 中提及了此贴 01月07日 12:08
simple 专栏文章:[精华帖] 社区历年精华帖分类归总 中提及了此贴 12月13日 14:44

有成功安装运行的吗?怎么各种错误,太脆弱了

莲蓬1 回复

你要确认下复制是否成功,且复制后文件目录是否正确,我用华为手机的时候,它会在外面自动加一层同名字的目录,然后导致导入模块时会不成功,总之,你复制后要去确认下复制后的结果

云敛晴空 回复

老铁,我直接从 PC 端把整个 uiautomator2、retry 文件夹复制到 android 的 site-packages 里了,但是不行,你知不知道为啥?

不二家 回复

可以了,谢谢,是我在 push 成功的时候并不是连同 uiautomator2 这个文件夹 push 进去的,而是 Push 其文件夹下面的所有文件,导致找不到这个模块,我创建一个名字为 uiautomator2 的文件夹,然后再 push 到/storage/emulated/0/qpythonb/python2.7/site-packages/uiautomator2 下就 OK 了,还有 retry 这个模块也是要在电脑上安装,然后用同样的方法 push

不二家 回复

谢谢回复,请问是哪个文件?

云敛晴空 回复

我之前设置的时候,没有预先 root,uiautomator2 不是很大,就是一个文件,你可以将整个库放入你的代码中,直接引用

我将 uiautomator2 push 到/storage/emulated/0/qpythonb/python2.7/site-packages
后,明明显示 push 成功了,但在 QPython 的文件里就是找不到 uiautomator2 然后运行脚本时就会提示找不到 uiautomator2 这个模块,然后我再 Push 到/storage/emulated/0/qpythonb/python2.7 也是一样的结果,请问,是否要先获取 root 权限?

这个如果最后希望独立在手机上定时执行这个脚本怎么做呢?(不连接 PC)
我试了 TashBomb,直接调用 Qpython,会导致 Qpython Crash。
又尝试了 SL4A 和 Python for Android;
但是 Python for Android 内置库没有 uiautomator2,
即使我手动将 uiautomator 库 copy 到 Python for Android 下面对应的库路径,还是会报 Import Error。

昨天刚把 uiautomator2 发布到 pypi,当前 uiautomator2 版本是0.0.1.dev37,提供一个方便的安装方法

pip install pbr six
pip install --pre uiautomator2
不二家 回复

能通过坐标,很赞,谢谢大神~~

niky 回复

赞 👍

不二家 回复

可以运行了,但是貌似不能通过坐标定位元素😂 ,我这边的竟品的元素信息什么都抓取不到,只能通过坐标的形式

niky 回复

你是放在同一目录下的吗?你可以尝试在 qpython 里面断点调试一下

vegetableBird 回复

不好意思 已经修改

老铁 打错字了
pip install huamanize

应该是 humanize

niky 回复

uiautomator2 库 push 到 QPython script 目录下了?

求教大神,为啥我在电脑上运行 python 文件可以,但是在手机上运行 demo.py 就不行,提示我 uiautomator2 库找不到,可是我的目录结构跟电脑上是一样的

vegetableBird 回复

872489864

能否给个联系方式 QQ、微信什么的咨询下问题

lb 回复
git clone https://github.com/openatx/uiautomator2
cd uiautomator2
pip install -e .
不二家 回复

我这边安装 uiautomator2,报错了;
菜鸟一枚,求楼主指点;
使用 python setup.py install 安装,报如下错误:
Exception: Versioning for this project requires either an sdist tarball, or acce
ss to an upstream git repository. It's also possible that there is a mismatch be
tween the package name in setup.cfg and the argument given to pbr.version.Versio
nInfo. Project name uiautomator2 was given, but was not able to be found.
error in setup command: Error parsing E:\l18192\uiautomator2-master\setup.cfg: E
xception: Versioning for this project requires either an sdist tarball, or acces
s to an upstream git repository. It's also possible that there is a mismatch bet
ween the package name in setup.cfg and the argument given to pbr.version.Version
Info. Project name uiautomator2 was given, but was not able to be found.

匿名 #27 · 2017年10月18日

这个可以试试

收藏了。这是一个很好的尝试!

一种新思路

思寒_seveniruby 将本帖设为了精华贴 10月09日 21:23
不二家 回复

多谢多谢。

Kun 回复

https://testerhome.com/topics/10298 我在这里面讲了一下。这里是 github 地址:https://github.com/openatx/uiautomator2

感谢楼主分享,请教一下 uiautomator2 的 python 库是怎么安装的?

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