MonkeyRunner自动化测试
简介
1、monkeyrunner是Android sdk提供的可以在Android代码之外控制Android设备和模拟器的自动化工具,通过monkeyrunner可以写成一个Python程序实现对Android App的安装、运行、点击等一系列自动化操作。
2、monkeyrunner的三大模块分别为:
- MonkeyRunner:这个类提供了用于连接monkeyrunner和设备或模拟器的方法,它还提供了用于创建用户界面显示的方法。
- MonkeyDevice:代表一个设备或模拟器。这个类为安装和卸载包、开启Activity、发送按键和触摸事件、运行测试包等提供了方法。
- MonkeyImage:这个类提供了捕捉屏幕的方法。这个类为截图、将位图转换成各种格式、对比两个MonkeyImage对象、将image保存到文件等提供了方法。
3、monkeyrunner与monkey的区别:
(1)monkey工具是直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。
(2)monkeyrunner是在工作站上通过API定义的特定命令和事件控制设备或模拟器。
两种运行方式
1、命令行直接在终端命令行执行
(1)配置好monkyrunner路径(./sdk/tools)之后,打开cmd,输入monkeyrunner,回车 ##也可以直接到tools目录下执行命令
(2)输入from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,回车
(3)输入device=MonkeyRunner.waitForConnection(),回车
(4)输入其他操作命令
2、写成pyhton脚本
1 from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice 2 device=MonkeyRunner.waitForConnection() 3 ...
执行方式:monkeyrunner t.py
常用操作
- MonkeyRunner方法
(1)执行当前脚本弹出一个警示对话框,用户关闭对话框后脚本才结束。
用法:MonkeyRunner.alert(message,title,okTitle)
message:会话弹出的内容
title:会话标题,默认为alert
okTitle:会话确认按钮,默认为ok
例如:MonkeyRunner.alert("hello")
(2)显示一个对话框,让用户从一列选项中选择一个单一的选项。
用法:MonkeyRunner.choice(message,choices,title)
message:显示在对话框中的提示信息。
choices:一个迭代的包含一系列选择的python类型
title:对话框的标题,默认为input
例如:MonkeyRunner.choice("choice a sex",["man","women"])
(3)显示一个接受的对话框,用户点击对话按钮中的一个按键结束。
用法:MonkeyRunner.input(message,initialValue,title,okTitle,cancelTitle)
message:对话框显示的信息。
initialValue:提供给用户的初始化值,默认为空字符串。
title:对话标题,默认为input。
okTitle:确认按键
cancelTitle:取消按键
例如:MonkeyRunner.input("enter text")
(4)暂停当前运行进程指定的时间。
用法:MonkeyRunner.sleep(seconds)
seconds:暂停时间
例如:MonkeyRunner.sleep(3)
(5)等待电脑连接到设备。
用法:MonkeyRunner.waitForConnection(timeout,deviceId)
timeout:等待的时间,默认为无限期
deviceId:指定设备名称的一个规定表达式
例如:com.android.monkeyrunner.MonkeyRunner.waitForConnection(5,'4d002f05f6253037')
- MonkeyDevice方法
(1)在设备屏幕上模拟拖曳。
用法:MonkeyDevice.drag(start,end,duration,steps)
start:拖曳开始坐标
end:拖曳结束坐标点
duration:持续时间 (default is 1.0 seconds)
steps:拖曳步骤(default is 10)
例如:device.drag((300,800),(800,800),0.1,10)
(2)在设备上安装应用包,如果该包已经存在,那么会替掉原来的。
用法:MonkeyDevice.intallPackage(path)
path:安装包在本地的路径已经文件名。
例如:device.installPackage(‘.../ex_v5.09_svn141922_200_staging_20141107.apk')
(3)给指定key发送一个key事件。
用法:MonkeyDevice.press(name,type)
name:keycode
home键 KEYCODE_HOME
back键 KEYCODE_BACK
send键 KEYCODE_CALL
end键 KEYCODE_ENDCALL
上导航键 KEYCODE_DPAD_UP
下导航键 KEYCODE_DPAD_DOWN
左导航 KEYCODE_DPAD_LEFT
右导航键 KEYCODE_DPAD_RIGHT
ok键 KEYCODE_DPAD_CENTER
上音量键 KEYCODE_VOLUME_UP
下音量键 KEYCODE_VOLUME_DOWN
power键 KEYCODE_POWER
camera键 KEYCODE_CAMERA
menu键 KEYCODE_MENU
type:触摸事件类型,如DOWN_AND_UP。
1、DOWN 发送一个DOWN事件。指定DOWN事件类型发送到设备,对应的按一个键或触摸屏幕上。
2、UP 发送一个UP事件。指定UP事件类型发送到设备,对应释放一个键或从屏幕上抬起。
3、DOWN_AND_UP 发送一个DOWN事件,然后一个UP事件。对应于输入键或点击屏幕。
例如:device.press('KEYCODE_MENU','DOWN_AND_UP')
(4)重启指定设备进入指定加载模式。
用法:MonkeyDevice.reboot(into)
into:bootloader, recovery, or None
例如:device.reboot()
(5)从设备删除指定的包,包括相关的数据已经缓存。
用法:MonkeyDevice.removePackage(package)
package:指定要删除的包名
例如:device.removePackage("com.gau.go.launcherex")
(6)执行adb shell命令并返回结果。
用法:MonkeyDevice.shell(cmd)
cmd:要执行的adb shell命令
例如:device.shell("am force-stop packageName")
(7)在设备上开始一个活动
用法:MonkeyDevice.startActivity(uri,action,data,mimetype,categories,extras,component,flags)
component:启动的Activity
例如:device.startActivity(component="com.gau.go.launcherex/com.jiubang.golauncher.GOLauncherFacade")
(8)获取设备的屏幕缓存
用法:MonkeyDevice.takeSnapshot()
例如:device.takeSnapshot()
(9)对指定位置发送一个触摸事件
用法:MonkeyDevice.touch(x,y,type)
x:横坐标
y:纵坐标
type:触摸事件类型。
例如:device.touch(422,1084,'DOWN_AND_UP')
(10)从键盘键入指定的字符串
用法:MonkeyDevice.type(message)
message:发送到键盘的字符串
例如:device.type('abc')
(11)唤醒设备的屏幕
用法:MonkeyDevice.wake()
例如:device.wake()
- MonkeyImage方法
(1)将MonkeyImage对象写入一个文件
用法:MonkeyImage.writeToFile(path,format)
path:输入的文件名,可选择的包含路径
format:目标格式,默认为png。
例如:result = device.takeSnapshot()
result.writeToFile('/home/lilinhui/Test.png','png')
(2)对比当前的截图和之前的截图
用法:MonkeyImage.sameAs(other,percent)
other:其他MonkeyImage对象
percent:百分比,取值为0.0-1.0
例如:result = device.takeSnapshot()
result1 = com.android.monkeyrunner.MonkeyRunner.loadImageFromFile('/home/lilinhui/Test.png')
print (result.sameAs(result1,0.9))
(3)复制一个图片的矩形区域。monkeyrunner执行测试时使用.takeSnapshot()截图,默认截取整个屏幕,包含了系统的状态栏。真实手机状态栏中包含如电量/信号量/消息提示等变量,使用.sameAs()对比整个屏幕的截图时就很容易出现错误。而使用.getSubImage()获得局部图像,然后再进行对比,就减少了monkeyrunner执行结果出错的概率。
用法:MonkeyImage.getSubImage(rect)
rect:A tuple (x, y, w, h),x,y指定矩形区域的左上角,w为矩形宽,h为矩形高
例如:
#第一截图并获取局部图像
result = device.takeSnapshot()
result_static = result.getSubImage((200,400,200,400))
result_static.writeToFile('/home/lilinhui/Test.png','png')
#第二截图并获取相同的局部图像
picture = com.android.monkeyrunner.MonkeyRunner.loadImageFromFile('/home/lilinhui/Test1.png')
result_static2 = picture.getSubImage((200,400,200,400))
result_static2.writeToFile('/home/lilinhui/Test2.png','png')
#使用sameAs()对比两张图片,并输出对比结果True或False
print (result_static.sameAs(result_static2,1.0))