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

diao2007 · 发布于 2017年10月09日 · 最后由 diao2007 回复于 2017年10月20日 · 1662 次阅读
本帖已被设为精华帖!

前言

前一段时间,已经完成借助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 huamanize

手机端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执行的稳定性。

后续很多细节需要完善。

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

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

4093
diao2007 · #2 · 2017年10月09日 作者
2b4132qawow 回复

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

2b4132
4093diao2007 回复

多谢多谢。

6853

哇,666

104 seveniruby 将本帖设为了精华贴 10月09日 21:23
377b84

一种新思路

Bbd245

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

11362

这个可以试试

Fe247d
4093diao2007 回复

我这边安装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.

4093
diao2007 · #10 · 2017年10月20日 作者
Fe247drobin_123 回复
git clone https://github.com/openatx/uiautomator2
cd uiautomator2
pip install -e .
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册