简介
monkeyrunner即android SDK中自带的工具之一,此工具提供API可按制android设备或模拟器。
monkeyrunner提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。
monkeyrunner工具的主要目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。
工具特性
多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。您可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。您也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。
功能测试:monkeyrunner可以为一个应用自动化功能测试。为您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。
回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。
可扩展的自动化:由于monkeyrunner是一个API工具包,您可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunner API之外,您还可以使用标准的Python os和subprocess模块来调用如adb这样的Android工具。
官方原文描述请见:http://developer.android.com/tools/help/monkeyrunner_concepts.html
运行
Monkeyrunner API主要包括三个模块
MonkeyRunner:这个类提供了用于连接monkeyrunner和设备或模拟器的方法,它还提供了用于创建用户界面显示提供了方法。
MonkeyDevice:代表一个设备或模拟器。这个类为安装和卸载包、开启Activity、发送按键和触摸事件、运行测试包等提供了方法。
MonkeyImage:这个类提供了捕捉屏幕的方法。这个类为截图、将位图转换成各种格式、对比两个MonkeyImage对象、将image保存到文件等提供了方法。
运行monkeyrunner
命令语法为:monkeyrunner
方式一:在CMD命令窗口直接运行monkeyrunner
方式二:使用Python编写测试代码文件,在CMD中执行monkeyrunner Findyou.py运行
不论使用哪种方式,您都需要调用SDK目录的tools子目录下的monkeyrunner命令。
注意:在运行monkeyrunner之前必须先运行相应的模拟器或连接真机,否则monkeyrunner无法连接到设备
运行模拟器有两种方法:1、通过eclipse中执行模拟器 2、在CMD中通过命令调用模拟器
这里介绍通过命令,在CMD中执行模拟器的方法
emulator -avd test
上面命令中test是指模拟器的名称。
实例
*准备
a.连接安卓真机设备
b.运行CMD,检测是否连接成功
CMD>adb devices
![](https://i-blog.csdnimg.cn/blog_migrate/32d1ddac13c63c963deba728abc82ee5.png)
附:
问题:CMD运行提示adb不是内部或外部命令,也不是可运行的程序或批处理文件。
解决:电脑环境变量未配置,将adb所在目录配在环境变量里。
方法:
1.打开CMD,运行monkeyrunner
2.进入monkeyrunner的shell命令交互模式后,逐条输入以下命令
#引入本程序所用到的模块
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
#连接手机设备
device=MonkeyRunner.waitForConnection()
#卸载APP
device.removePackage('cn.richinfo.thinkdrive')
#安装新的APP
device.installPackage('E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk')
![](https://i-blog.csdnimg.cn/blog_migrate/0a6d9f2bf0c012aca3c0175b80ae4acb.png)
检查手机app是否已更新
官方API
MonkeyRunner
MonkeyRunner类,包含一下静态方法
void alert(string message,string title,string okTitle)
向运行当前程序的进程显示警告对话框。对话框是模态的,所以程序暂停,直到用户单击对话框的按钮。
integer choice(string message,iterable choices,string title)
显示一个对话框,其中包含运行当前程序的进程的选项列表。对话框是模态的,所以程序暂停,直到用户单击其中一个对话框的按钮。
void help(string format)
以类似于Python的pydoc工具的风格,使用指定的格式显示monkeyrunner API引用。
string input(string message,string initialValue,string title,string okTitle,string cancelTitle)
显示接受输入并将其返回给程序的对话框。对话框是模态的,所以程序暂停,直到用户单击其中一个对话框的按钮。 该对话框包含两个按钮,其中一个显示okTitle值,另一个显示为cancelTitle值。如果用户单击okTitle按钮,则返回输入框的当前值。如果用户点击cancelTitle按钮,则返回一个空字符串。
void sleep(float seconds)
暂停当前程序指定的秒数。
MonkeyDevice waitForConnection(float timeout,string deviceId)
尝试在monkeyrunner后端和指定的设备或模拟器之间建立连接。
MonkeyDevice
Monkeyrunner的工作站中可访问的设备或仿真器。此类用于控制Android设备或模拟器。方法发送UI事件,检索信息,安装和删除应用程序,并运行应用程序。
通常不需要创建一个MonkeyDevice实例。相反,您可以使用MonkeyRunner.waitForConnection()从与设备或模拟器的连接创建新对象。
例如,而不是使用:
newdevice=MonkeyDevice()
你需要用这种方式获取Device对象:
newdevice=MonkeyRunner.waitForConnection()
常量
string DOWN使用press()或touch()的type参数来发送DOWN事件。
string UP使用press()或touch()的type参数来发送UP事件。
string DOWN_AND_UP使用press()或touch()的type参数立即发送一个DOWN事件,然后再发送UP事件。
方法
void broadcastIntent(string uri,string action,string data,string mimetype,iterable categoriesdictionaryextras,component component,iterable flags)
广播此设备的意图,就像Intent来自应用程序一样。有关参数的更多信息,请参阅Intent。
void drag(tuple start,tuple end,float duration,integer steps)
在此设备的屏幕上模拟拖动手势(触摸,按住和移动)。
object getProperty(string key)
给定系统环境变量的名称,返回该设备的值。可用的变量名称在下面表1中列出
object getSystemProperty(string key)
.adb shell的API相当于getprop 。这是供平台开发人员使用的。
void installPackage(string path)
将packageFile中包含的Android应用程序或测试包安装到此设备上。如果应用程序或测试包已经安装,它将被替换。
dictionary instrument(string className,dictionary args)
在Android测试下运行指定的组件,并将结果返回到字典中,其精确格式由正在运行的组件决定。组件必须已经存在于此设备上。
void press(string name,dictionary type)
将由type指定的键事件发送到由keycode指定的键。
void reboot(string into)
将此设备重新引导到由bootloadType指定的引导加载程序中。
void removePackage(string package)
从该设备中删除指定的包,包括其数据和缓存。
object shell(string cmd)
执行一个adb shell命令并返回结果(如果有的话)。
void startActivity(string uri,string action,string data,string mimetype,iterable categoriesdictionaryextras,component component,flags)
通过发送从提供的参数构造的Intent来启动此设备上的活动。
捕获此设备的整个屏幕缓冲区,产生一个包含当前显示屏幕捕获的MonkeyImage对象。
void touch(integer x,integer y,integer type)
将类型指定的触摸事件发送到由x和y指定的屏幕位置。
void type(string message)
将消息中包含的字符发送到此设备,就像在设备的键盘上键入一样。这相当于使用键事件类型DOWN_AND_UP为消息中的每个键码调用press()。
void wake()
唤醒此设备的屏幕。
MonkeyImage
一个Monkeyrunner类来保存设备或模拟器屏幕的图像。在屏幕截图期间,图像从屏幕缓冲区复制。该对象的方法允许您将图像转换为各种存储格式,将图像写入文件,复制图像部分,并将此对象与其他MonkeyImage对象进行比较。
您不需要创建MonkeyImage的新实例。相反,使用MonkeyDevice.takeSnapshot()从屏幕截图创建一个新的实例。
例如,使用:
newimage=MonkeyDevice.takeSnapshot()
方法
string convertToBytes(string format)
将当前图像转换为特定格式,并将其作为字符串返回,然后您可以作为二进制字节的迭代访问。
tuple getRawPixel(integer x,integer y)
以(a,r,g,b)的形式返回图像位置(x,y)上的单个像素作为整数元组。
integer getRawPixelInt(integer x,integer y)
将图像位置(x,y)上的单个像素作为32位整数返回。
MonkeyImage getSubImage(tuple rect)
从当前图像的矩形选择中创建一个新的MonkeyImage对象。
boolean sameAs(MonkeyImage other,float percent)
将此MonkeyImage对象与另一个对象进行比较,并返回比较结果。百分比参数指定允许两个图像“相等”的百分比差异。
void writeToFile(string path,string format)
将当前图像写入由文件名指定的文件,格式为格式指定。