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

diao2007 · 2017年10月09日 · 最后由 ancining 回复于 2018年02月28日 · 1056 次阅读
本帖已被设为精华帖!

前言

前一段时间,已经完成借助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执行的稳定性。

后续很多细节需要完善。

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

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

qawow 回复

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

diao2007 回复

多谢多谢。

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

一种新思路

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

这个可以试试

diao2007 回复

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

robin_123 回复
git clone https://github.com/openatx/uiautomator2
cd uiautomator2
pip install -e .

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

wozhiwan1421 回复

872489864

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

huangxiaojiao 回复

uiautomator2库 push到QPython script目录下了?

老铁 打错字了
pip install huamanize

应该是humanize

wozhiwan1421 回复

不好意思 已经修改

huangxiaojiao 回复

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

diao2007 回复

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

huangxiaojiao 回复

赞 👍

diao2007 回复

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

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

pip install pbr six
pip install --pre uiautomator2

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

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

ancining 回复

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

diao2007 回复

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

diao2007 回复

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

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