前言
前一段时间,已经完成借助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 执行的稳定性。
后续很多细节需要完善。