MonkeyRunner自动化测试

时间:2022-03-12 17:53:16

简介

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)输入其他操作命令

 MonkeyRunner自动化测试

 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")

 MonkeyRunner自动化测试

(2)显示一个对话框,让用户从一列选项中选择一个单一的选项。

用法:MonkeyRunner.choice(message,choices,title)

message:显示在对话框中的提示信息。

choices:一个迭代的包含一系列选择的python类型

title:对话框的标题,默认为input

例如:MonkeyRunner.choice("choice a sex",["man","women"])

 MonkeyRunner自动化测试

(3)显示一个接受的对话框,用户点击对话按钮中的一个按键结束。

用法:MonkeyRunner.input(message,initialValue,title,okTitle,cancelTitle)

message:对话框显示的信息。

initialValue:提供给用户的初始化值,默认为空字符串。

title:对话标题,默认为input。

okTitle:确认按键

cancelTitle:取消按键

例如:MonkeyRunner.input("enter text")

 MonkeyRunner自动化测试

(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 " + package)

(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))

 

相关博客:http://284772894.iteye.com/blog/2166874