在这个系列的上一篇文章中,我们介绍了Monkey的用法,这篇文章将继续介绍Adt自带的另外一个自动化工具MonkeyRunner
MonkeyRunner和Monkey的关系
在这个系列的上一篇文章中,我们介绍了Monkey最常规的一种用法,即进行完全随机的测试(点击文末“阅读原文”可以打开这篇文章查看)。在这种情况下,Monkey会自己产生一些随机的操作指令给自己执行。但是如果想要按照一个特定的指令序列执行,就要借助MonkeyRunner。
MonkeyRunner是一个运行于PC端的程序,它可以把预先定义好的操作指令一条一条发送给Monkey,从而控制Monkey进行更加精确的自动化操作。
其实MonkeyRunner和Monkey的这种关系从名字就能看出来一些端倪。
MonkeyRunner的使用方法
MonkeyRunner发送给Monkey的操作指令是按照特定的协议编写的,这里我们不需要关心协议的具体内容,只需要使用Python编写自动化脚本,调用MonkeyRunner预先定义好的函数。需要说明的是,MonkeyRunner虽然使用到Python,但实际上并不需要安装Python的运行环境,就像前面提到的,使用这个系列介绍的工具进行Android自动化测试都不需要安装其它额外的工具。
在使用MonkeyRunner时,首先需要开启模拟器,或者通过USB连接真实的Android设备。
MonkeyRunner的可执行文件放在sdk的tools目录下,是一个命令行的工具。
你可以在任意位置用Python编写好脚本,再用MonkeyRunner来执行。而且这些脚本只能通过MonkeyRunner执行,不能像其它py文件一样直接通过Python执行。
比如在命令行输入:
D:\Adt\sdk\tools\monkeyrunner D:\sogouqa.py
下面这个脚本调起搜狗手机浏览器,打开菜单并截图,这个脚本示例可以用来检查搜狗手机浏览器的菜单是不是显示正常。
MonkeyRunner支持的功能总结
- 物理按键操作
- 屏幕操作(比如点击、长按、拖动)
- 安装/卸载应用
- 支持多设备/模拟器
- 通过控件进行操作
- 执行shell命令(比如可以直接删除文件)
- 发送boardcast
- 录制与回放功能
这里简单介绍一下录制与回放的功能,这个功能并没有一个单独的程序入口,我们同样需要在MonkeyRunner中运行一段脚本:
脚本执行完后就会出现录制与回放的界面:
就是这样一个简单的界面,点击左边的截图会记录一条点击动作,上面的那一排按钮可以增加一些其它的动作,比如延时或者键盘动作。
Export Actions可以保存录制的内容,但保存的并不是Python脚本文件,你同样需要编写另外一段脚本来回放这段录制,除此之外你也可以选择利用刚才录制时的坐标自己编写点击的操作。
使用坐标编写脚本的局限性
MonkeyRunner默认的屏幕操作都是根据绝对坐标,比如需要在刚才的脚本基础上进一步点击菜单上的设置功能,通过截图或者脚本录制工具,你已经知道了设置菜单项的坐标是(72, 684),这样就可以使用MonkeyDevice的touch方法来点击设置按钮:
device.touch(72, 684, "DOWN_AND_UP")
但是很不幸的,我们是用小米1编写的测试脚本,小米1S的分辨率是480×854,如果换成别的设备,分辨率可能会发生改变,设置按钮的位置就不再是(72, 684)。
好在很多情况下控件的位置和大小是按照屏幕的百分比计算的,比如说不管分辨率是多少,搜狗浏览器的设置都会出现在屏幕15%宽、80%高的地方。这样我们就可以根据相对坐标来编写自动化脚本:
还有的情况下,控件的位置和大小并不满足这个规律,比如搜狗浏览器的设置页面,在小米1和小米4两台不同的设备上,一屏能够显示的内容都不一样多,可以看出其中每个项目的相对坐标在这两台设备间很难统一。
最后,如果被测程序改版,对控件重新排序或布局,旧的自动化脚本也可能会失效。
为了解决这个问题,最好按照坐标以外的方式编写自动化脚本。本系列的第三篇文章将会介绍如何利用控件的id编写MonkeyRunner的自动化脚本。