后知后觉,刚知道Android提供了MonkeyRunner这么个东西,能用来干嘛呢,官方文档介绍得很清楚。简单说,可以用Python程序通过API,
还提供了easy package,包括EasyMonkeyDevice和By两个类,用来通过控件ID来访问控件元素。可是量产设备(非开发版非模拟器)无法使用Hierarchy Viewer,也无法使用easy package。官方的说明是,
To preserve security, Hierarchy Viewer can only connect to devices running a developer version of the Android system.
还是有方法突破该限制的,操作起来有点麻烦,只能暂时舍弃By带来的便利。
于是只能通过控件坐标来操作控件了。
还好有MonkeyRecorder,可以减轻一些负担。
from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder recorder.start(dev)
这玩意能方便地记录点击操作的坐标值。还有个工具monitor,可以比较方便地获取到每一个视图里控件的坐标范围。
有了monitor,可以建立两个配置文件,一个用来存放所有控件的坐标,一个用来存放针对每个测试用例从start Activity开始的抵达路径。
配置文件用xml还是json呢?选择了json,在蒙头写了近百行控件坐标、用Python写好了加载配置文件用解析出的坐标值初始化控件列表函数后,用monkeyrunner运行,掉进了坑里。
import json
这一行报错,import error。
Google后知道原因,MonkeyRunner用的是Jython 2.5.3,可能是基于Python 2.5,Python 2.7之后才有json模块。
难倒得改用xml?近百行json配置文件白写了?
再Google,一大半介绍MonkeyRunner使用的文章都简单到,举例只是connect、startActivity、press一下。多发几个组合触摸事件都没有。我相信很多人都深度使用过MonkeyRunner,可是难倒这些深度使用过的人都不写博客,同时写博客的都是把一个App运行起来后只摸了一下、截了一张图的?
还好有stackoverflow,顺着几个类似问题的解答,终于从坑里爬了出来。详细记录爬的步骤。
一个解决方法是给Python 2.5安装simplejson,以Mac OS X举例。
在Android SDK目录下可以看到Jython jar文件,版本是2.5.3。
android-sdks/tools/lib/jython-standalone-2.5.3.jar
下载simplejson,拷贝到Python 2.5目录,解压,安装。
/Library/Python/2.5/site-packages/ tar -xzf simplejson-3.6.5.tar.gz python setup.py install
然后在MonkeyRunner下import还是报错import error。
import simplejson
查看Jython path,没有simplejson路径。
import sys sys.path
添加simplejson路径,再import,成功。
sys.path.append('/Library/Python/2.5/site-packages/simplejson-3.6.5')
但是退出后又失效。
解决方法1是用PYTHONPATH,解决方法2是在Python脚本里动态添加,添加还需要判断重复,最好还能将路径标准化,对Windows系统做些处理。
这里采用代码里动态添加的方法,而且先不管Windows系统了。
import sys if not ('/Library/Python/2.5/site-packages/simplejson-3.6.5' in sys.path): sys.path.append('/Library/Python/2.5/site-packages/simplejson-3.6.5') try: import json except ImportError: import simplejson as json