一、monkey简介
monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),
实现对应用程序进行压力测试。
monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar
monkey.jar程序是由一个名为“monkey”的shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey
monkey命令启动方式:
可以通过PC机CMD窗口中执行: adb shell monkey +monkey命令行选项monkey命令行选项
-v
用于指定反馈信息级别,总共分3个级别:
level 0:adb shell monkey -p com.tencent.android.qqdownloader -v 100
level 1:adb shell monkey -p com.tencent.android.qqdownloader -v -v 100
level 2:adb shell monkey -p com.tencent.android.qqdownloader -v -v -v 100
-s(随机种子数)
用于指定伪随机数生成器的seed值,如果seed相同,则两次monkey测试所产生的事件序列也相同
adb shell monkey -p com.tencent.android.qqdownloader -s 10 100
–throttle(毫秒)
用于指定用户操作间的延时,如果不指定这个参数,monkey会尽可能快地生成和发送消息
adb shell monkey -p com.tencent.android.qqdownloader –throttle 3000 100
-p(允许的包名列表)
用于指定一个或多个包。如果不指定包,monkey将允许系统启动设备中的所有app
指定一个包 adb shell monkey -p com.tencent.android.qqdownloader 100
指定多个包 adb shell monkey -p com.tencent.mtt -p com.tencent.android.qqdownloader 100
二、monkeyrunner简介
monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,也可以编写一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截图等。
monkeyrunner API
MonkeyRunner:此类提供了用于连接monkeyrunner和设备或模拟器的方法,还提供了为monkeyrunner脚本创建UI界面的一些函数
MonkeyDevice:代表一个设备或模拟器。此类为安装和卸载、开启activity、发送按键和触摸事件、运行测试包等提供了方法
MonkeyImage:此类提供了捕捉屏幕的方法,还提供了为截图、将位图转换成各种格式、对比两个MonkeyImage对象、将image保存到文件monkeyrunner测试脚本格式
加载monkeyrunner 基础模块
from com.android.monkeyrunner import MonkeyRunner as mr(重命名)
from com.android.monkeyrunner import MonkeyDevice as md
from com.android.monkeyrunner import MonkeyImage as mi
等待连接设备,与模拟器连接,返回monkeydevice对象,代表连接的设备
参数一:超时时间,单位秒,浮点数。默认是无限地等待
参数二:设备名称。默认为当前设备
device=mr.waitForConnection()
device=mr.waitForConnection(2.0,’J7AIFAQW5LYPMFQ4’)
参数是apk的相对路径或绝对路径,路径级别用/
device.installPackage()
参数包名
device.removePackage()
设置要启动的活动类名,有包名和活劢类型组成,启动activity
device.startActivity(component=”“)
执行adb shell命令
模拟返回键
device.shell(“input keyevent 4”)
截图,返回一个MonkeyImage对象
result=device.takeSnapshot()
保存在SDK的tools目录下
result.writeToFile(‘./shot1.png’,’png’)
字符串发送到键盘
device.type(“字符串”)
唤醒设备
device.wake()
重启设备
device.reboot()
在指定位置发送触摸事件(x,y的单位为像素)
device.touch(x,y,触摸事件类型)
发送到指定键的一个关键事件
device.press(键码,触摸事件类型)
键名
KEYCODE_CALL 拨号键5
KEYCODE_ENDCALL 挂机键6
KEYCODE_HOME 按键Home3
KEYCODE_MENU 菜单键82
KEYCODE_BACK 返回键4
KEYCODE_SEARCH 搜索键84
KEYCODE_CAMERA 拍照键27
KEYCODE_FOCUS 拍照对焦键80
KEYCODE_POWER 电源键26
KEYCODE_NOTIFICATION 通知键83
KEYCODE_MUTE 话筒静音键91
KEYCODE_VOLUME_MUTE 扬声器静音键164
KEYCODE_VOLUME_UP 音量增加键24
KEYCODE_VOLUME_DOWN 音量减小键25
KEYCODE_ENTER 回车键66触摸事件类型
DOWN 发送一个DOWN事件
UP 发送一个UP事件
DOWN_AND_UP 发送一个DOWN事件,然后一个UP事件
实例
import sys
import os
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner import MonkeyDevice as md
from com.android.monkeyrunner import MonkeyImage as mi
device = mr.waitForConnection()
if not device:
print >sys.stderr,"fail"
sys.exit(1)
device.installPackage("E:/com.tencent.android.qqdownloader.apk")
mr.sleep(10)
componentName="com.tencent.android.qqdownloader/com.tencent.assistant.activity.MainActivity"
device.startActivity(component=componentName)
mr.sleep(5)
device.touch(360,1260,device.DOWN_AND_UP)
mr.sleep(3)
result0 = device.takeSnapshot()
result0.writeToFile(r'E:\2029620.png','png')
mr.sleep(3)
device.shell("input keyevent 4")
mr.sleep(1)
device.press("KEYCODE_BACK",device.DOWN_AND_UP)
mr.sleep(5)
device.removePackage('com.tencent.android.qqdownloader')
mr.sleep(5)