前言

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

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

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

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

这个时候有两个思路,

那么站在巨人的肩膀上,通过 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 执行的稳定性。

后续很多细节需要完善。


↙↙↙阅读原文可查看相关链接,并与作者交流