一站式网站建设方案,湖南网站建设联系电话,广告网站模板下载,2013我国中小企业接入互联网和网站建设情况monkeyrunner简介
1.monkeyrunner工具使用Jython#xff0c;这是一种使用Java编程语言的Python实现。Jython允许monkeyrunner API与Android框架轻松交互。使用Jython#xff0c;您可以使用Python语法来访问API的常量#xff0c;类和方法。MonkeyRunner工具是使用Jython(使用…monkeyrunner简介
1.monkeyrunner工具使用Jython这是一种使用Java编程语言的Python实现。Jython允许monkeyrunner API与Android框架轻松交互。使用Jython您可以使用Python语法来访问API的常量类和方法。MonkeyRunner工具是使用Jython(使用Java编程语言实现的
Python)写出来的它提供了多个API通过monkeyrunner API 可以写一个Python的程序来模拟操作控制Android设备app,测试其稳定性并通过截屏可以方便地记录出现的问题。
2.我们来看一下monkeyrunner官网是如何介绍monkeyrunner的
官网介绍已翻译成中文在这里给小伙伴截取一段翻译如下 monkeyrunner工具提供了一个API用于编写从Android代码外部控制Android设备或模拟器的程序。使用monkeyrunner您可以编写一个Python程序安装Android应用程序或测试包运行它向其发送击键截取其用户界面并在工作站上存储屏幕截图、
monkeyrunner工具主要用于测试功能/框架级别的应用程序和设备以及运行单元测试套件但您可以将其用于其他目的。
monkeyrunner工具与UI / Application Exerciser Monkey无关 也称为monkey工具。该monkey工具adb直接在设备或仿真器上的shell中运行 并生成用户和系统事件的伪随机流。相比之下monkeyrunner工具通过从API发送特定命令和事件来控制工作站中的设备和
仿真器。
3.monkeyrunner即android SDK中自带的工具之一此工具提供API可按制android设备或模拟器。
4.有兴趣的可以查看一下monkeyrunner官网monkeyrunner | Android中文API
5.monkeyrunner 路径Andriod_SDK\tools
MonkeyRunner工具独特功能
1.多设备控制monkeyrunner API可以跨多个设备或仿真器应用一个或多个测试套件。您可以物理连接所有设备或立即启动所有模拟器或两者以编程方式依次连接到每个设备然后运行一个或多个测试。您还可以以编程方式启动模拟器配置运行一个或多个测试然后关闭模拟器。
2.功能测试monkeyrunner可以对Android应用程序进行自动化的从头到尾的测试。您可以通过击键或触摸事件提供输入值并将结果视为屏幕截图。
3.回归测试 - monkeyrunner可以通过运行应用程序并将其输出屏幕截图与一组已知正确的屏幕截图进行比较来测试应用程序的稳定性。
4.可扩展的自动化 - 由于monkeyrunner是一个API工具包您可以开发一个基于Python的模块和程序的整个系统来控制Android设备。除了使用monkeyrunner API本身您还可以使用标准的Python os和 subprocess 模块来调用Android工具例如 Android Debug Bridge。
您还可以将自己的类添加到monkeyrunner API中。这在“ 使用插件扩展monkeyrunner ”一节中有更详细的描述 。
Monkeyrunner与Monkey区别
monkeyrunner和money没有什么直接的关系monkey是在设备直接运行adb shell命令生成随机事件来进行测试的。相比较而言monkeyrunner则是通过API发送特定的命令和事件来控制设备。
为了支持黑盒自动化测试的场景Android SDK提供了monkey和monkeyrunner两个测试工具这两个测试工具除了名字类似外还都可以向待测应用发送按键等消息往往容易产生混淆以下是他俩的不同之处。
Monkey
Monkey工具直接运行在设备或模拟器的adb shell中生成用户或系统的伪随机事件流。
1.monkey运行在设备或者模拟器上边可以脱离PC运行其运行时如下图所示。 Monkeyrunner
Monkeyrunner工具是在工作站上通过API定义的特定命令和事件控制设备或模拟器。
而monkeyrunner运行在PC上需要通过服务器/客户端的的模式向设备或者模拟器上的android应用发送指令来执行测试其运行时如下图所示。 2.普遍的做法是将monkey作为一个向待测应用发送随机按键消息的测试工具验证待测应用在这些随机性的输入面前是否会有闪退或者崩溃。而monkeyrunner则接受一个明确的测试脚本使用python语言编写的。
3.虽然monkey也可以根据一个指定的命令脚本发送按键消息但其不支持条件判断也不支持读取界面的信息来执行验证操作。而monkeyrunner的测试脚本中有明确 的条件判断等语句可用来做功能测试。 总结 实际操作中monkey由于缺少必要的条件判断等命令难以在功能测试上有所作为只能作为生成一些随机事件的工具测试应用程序的健壮程度待测应用崩溃后可以根据monkey打印的日志再用monkey创建一个重现步骤供开发调试。monkey服务器模式更适合用于黑盒测试不建议用于自动化测试。 而Monkeyrunner虽然有Python和Java类库的强大支持但其自身提供的API有限还得需要插件扩展其功能。
monkeyrunner API
monkeyrunner API包含在包中的三个模块中 com.android.monkeyrunner
1.MonkeyRunnermonkeyrunner程序的一类实用方法。此类提供了将monkeyrunner连接到设备或模拟器的方法。它还提供了为monkeyrunner程序创建UI以及显示内置帮助的方法。
2.MonkeyDevice表示设备或模拟器。此类提供了安装和卸载软件包启动Activity以及向应用程序发送键盘或触摸事件的方法。您还可以使用此类来运行测试包。
3.MonkeyImage表示屏幕捕获图像。此类提供捕获屏幕将位图图像转换为各种格式比较两个MonkeyImage对象以及将图像写入文件的方法。
在Python程序中您可以将每个类作为Python模块进行访问。monkeyrunner工具不会自动导入这些模块。要导入模块请使用Python from语句
1 from com.android.monkeyrunner import module
module您要导入的类名 在哪里。from通过用逗号分隔模块名称可以在同一语句中导入多个模块。
运行monkeyrunner
您可以从文件中运行monkeyrunner程序也可以在交互式会话中输入monkeyrunner语句。您可以通过调用SDK目录子目录中的monkeyrunner命令来执行这两项操作tools/。如果提供文件名作为参数则该monkeyrunner命令将文件的内容作为Python程序运行; 否则它会启动一个交互式会话。
该monkeyrunner命令的语法是
1 monkeyrunner -plugin plugin_jar program_filename program_options
表1解释了标志和参数。
表1. monkeyrunner标志和参数。
参数描述-plugin plugin_jar可选指定.jar包含monkeyrunner插件的文件。要了解有关monkeyrunner插件的更多信息请参阅 使用插件扩展monkeyrunner。要指定多个文件请多次包含该参数。program_filename如果提供此参数则该monkeyrunner命令将该文件的内容作为Python程序运行。如果未提供参数则该命令将启动交互式会话。program_options可选program_file中程序的标志和参数。
运行monkeyrunner
命令语法为
monkeyrunner -plugin plugin_jar program_filename program_options 方式一在CMD命令窗口直接运行monkeyrunner
方式二使用Python编写测试代码文件在CMD中执行monkeyrunner hongge.py运行
不论使用哪种方式您都需要调用SDK目录的tools子目录下的monkeyrunner命令。 注意在运行monkeyrunner之前必须先运行相应的模拟器或连接真机否则monkeyrunner无法连接到设备
运行模拟器有两种方法1、通过eclipse中执行模拟器 2、在CMD中通过命令调用模拟器
这里介绍通过命令在CMD中执行模拟器的方法
emulator -avd test
上面命令中test是指模拟器的名称。
附这部分前边已经讲解过在这里就不再赘述
问题CMD运行提示monkeyrunner不是内部或外部命令也不是可运行的程序或批处理文件。
解决电脑环境变量未配置将monkeyrunner所在目录配在环境变量里。
变量名Path
变量值D:\android\android-sdk-windows\tools;D:\android\android-sdk-windows\platform-tools
实例
实例一卸载旧的APP安装新的APP
*准备
a. 连接安卓夜神模拟器设备
b. 运行CMD检测是否连接成功
CMDadb devices 附这部分前边已经讲解过在这里就不再赘述
问题CMD运行提示adb不是内部或外部命令也不是可运行的程序或批处理文件。
解决电脑环境变量未配置将adb所在目录配在环境变量里。
*方式一
1.打开CMD运行monkeyrunner 2.进入monkeyrunner的shell命令交互模式后逐条输入以下命令
1 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
2 device MonkeyRunner.waitForConnection()
3 device.removePackage(com.taobao.taobao)
4 device.installPackage(C:\\Users\\DELL\\Desktop\\702757.apk)
1输入命令前的夜神模拟器 2输入第三行命令后的夜神模拟器 3输入第四行的夜神模拟器 注每条命令的作用请见方法二中的注解
实操如图 c.检查手机app是否已更新
*方式二
a. 编写Python测试代码
1 # File: Test1.py2 # Vision: V1.03 # Author: hongge QQ群7076992174 # 引入本程序所用到的模块5 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage6 7 # 连接手机设备8 device MonkeyRunner.waitForConnection()9
10 # 截图
11 result device.takeSnapshot()
12 # 将截图保存到文件
13 result.writeToFile(E:\\JAVA\\monkeyrunner\\Test1\\Test1_001.png,png)
14
15 # 卸载APP
16 device.removePackage(cn.richinfo.thinkdrive)
17 print (Uninstall Success!)
18
19 # 暂停5秒
20 MonkeyRunner.sleep(5)
21
22 # 截图
23 result device.takeSnapshot()
24 result.writeToFile(E:\\JAVA\\monkeyrunner\\Test1\\Test1_002.png,png)
25
26 # 安装新的APP
27 device.installPackage(E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk)
28 print (Install Success!)
29
30 # 截图
31 result device.takeSnapshot()
32 result.writeToFile(E:\\JAVA\\monkeyrunner\\Test1\\Test1_003.png,png)
注拷贝运行时请去掉中文注释或者在开头加入 #codingutf-8
b.执行Test1.py脚本
Monkeyrunner C:\Users\DELL\Desktop\test.py
实操如图 c.检查手机app是否已更新
d.查看截图文件夹截图和上边逐条输入命令宏哥截得模拟器一模一样的。 e.注意如果截图不一样自己加个等待时间就会一样参考代码
10 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
11
12
13
14 # 连接手机设备
15
16 device MonkeyRunner.waitForConnection()
17
18
19
20 # 截图
21
22 result device.takeSnapshot()
23
24 # 将截图保存到文件
25
26 result.writeToFile(C:\\Users\\DELL\\Desktop\\test\\Test1_001.png,png)
27
28
29
30 # 卸载APP
31
32 device.removePackage(com.taobao.taobao)
33
34 print (Uninstall Success!)
35
36
37
38 # 暂停5秒
39
40 MonkeyRunner.sleep(5)
41
42
43
44 # 截图
45
46 result device.takeSnapshot()
47
48 result.writeToFile(C:\\Users\\DELL\\Desktop\\test\\Test1_002.png,png)
49
50
51 # 暂停5秒
52
53 MonkeyRunner.sleep(5)
54
55
56 # 安装新的APP
57
58 device.installPackage(C:\\Users\\DELL\\Desktop\\702757.apk)
59
60 print (Install Success!)
61
62 # 暂停5秒
63
64 MonkeyRunner.sleep(5)
65
66 # 截图
67
68 result device.takeSnapshot()
69
70 result.writeToFile(C:\\Users\\DELL\\Desktop\\test\\Test1_003.png,png) monkeyrunner内置帮助
您可以通过运行以下命令为monkeyrunner生成API参考
1 monkeyrunner help.py format outfile
论点是 format或者是text纯文本的输出或html用于HTML输出。outfile 是输出文件的路径限定名称。 使用插件扩展monkeyrunner
您可以使用Java编程语言编写的类扩展monkeyrunner API并将其构建为一个或多个.jar文件。您可以使用此功能使用您自己的类扩展monkeyrunner API或扩展现有类。您还可以使用此功能初始化monkeyrunner环境。
要为monkeyrunner提供插件请monkeyrunner使用表1中-plugin plugin_jar描述的参数 调用该命令 。
在你的插件代码你可以导入和扩展的主要monkeyrunner类 MonkeyDeviceMonkeyImage和MonkeyRunner在com.android.monkeyrunner见的monkeyrunner API。
请注意插件不允许您访问Android SDK。您无法导入包等com.android.app。这是因为monkeyrunner与框架API级别下的设备或模拟器交互。
插件启动类
.jar插件 的文件可以指定在脚本处理开始之前实例化的类。要指定此类请将密钥添加 MonkeyRunnerStartupRunner到.jar文件的清单中。该值应该是启动时要运行的类的名称。以下代码段显示了如何在ant构建脚本中执行此操作
1 jar jarfilemyplugin basedir${build.dir}
2 manifest
3 attribute nameMonkeyRunnerStartupRunner valuecom.myapp.myplugin/
4 /manifest
5 /jar
要访问monkeyrunner的运行时环境启动类可以实现 com.google.common.base.PredicatePythonInterpreter。例如此类在默认命名空间中设置一些变量 1 package com.android.example;2 3 import com.google.common.base.Predicate;4 import org.python.util.PythonInterpreter;5 6 public class Main implements PredicatePythonInterpreter {7 Override8 public boolean apply(PythonInterpreter anInterpreter) {9
10 /*
11 * Examples of creating and initializing variables in the monkeyrunner environments
12 * namespace. During execution, the monkeyrunner program can refer to the variables newtest
13 * and use_emulator
14 *
15 */
16 anInterpreter.set(newtest, enabled);
17 anInterpreter.set(use_emulator, 1);
18
19 return true;
20 }
monkeyrunner环境搭建
1.安装并配置好jdk环境
2.安装android sdk
3.安装python
4.monkeyrunner环境变量配置 {Path}\Andriod_SDK\tools
安装结果检测
在docs命令控制台输入命令monkeyrunner出现如下显示内容则说明安装成功 Tips退出monkeyrunner命令行模式可以 使用快捷键 ctrlD退出。 小结
1.在方式二运行monkeyrunner报错190724 14:33:20.837:S [main] [com.android.monkeyrunner.MonkeyRunnerOptions] Script terminated due to an exception 解决方法报出该错误是使用的notepad编码格式问题notepad默认编码格式是ansi我们使用的monkeyrunner脚本格式是utf-8因此有冲突
修改方法如下
首先看我们的脚本编码格式是什么我这里的是utf-8因此不用再做修改 3.如果编码格式不是utf-8的就要对它进行修改了点击格式选择utf-8再保存也可选择无BOM格式的 4.再来运行一下这次成功了 2.monkeyrunner常用的知识点
#引入程序所用的模块
1 from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
#引入程序所用的模块使用别名
1 from com.android.monkeyrunner import MonkeyRunner as mr
2 from com.android.monkeyrunner import MonkeyDevice as md
3 from com.android.monkeyrunner import MonkeyImage as mi
4 #如果给导入的模块起了别名就必须使用别名否则会出现错误。
5 #比如连接设备或模拟器起了以上别名后命令应该如下
6 devicemr.waitForConnection()
#连接到设备或模拟器
1 #参数1超时时间单位秒浮点数。默认是无限期地等待。
2 #参数2串deviceid指定的设备名称。默认为当前设备手机优先比如手机通过USB线连接到PC、其次为模拟器。
3 #默认连接
4 device MonkeyRunner.waitForConnection()
5 #参数连接
6 device MonkeyRunner.waitForConnection(1.0,4df74b8XXXXXXX) #向设备或模拟器安装APK
1 #以下两种方式都是对的
2 device.installPackage(E:/JAVA/monkeyrunner/Test1/ThinkDrive_new.apk)
3 device.installPackage(E:\\JAVA\\monkeyrunner\\Test1\\ThinkDrive_new.apk)
4 #参数可以为绝对路径也可为相对路径
#卸载设备或模拟器中的APK
1 #参数为APK包名
2 device.removePackage(cn.richinfo.thinkdrive)
#启动任意的Activity
1 #device.startActivity(component包名/启动Activity)
2 #以下两种都OK
3 device.startActivity(componentcn.richinfo.thinkdrive/cn.richinfo.thinkdrive.ui.activities.NavigateActivity)
4 device.startActivity(componentcn.richinfo.thinkdrive/.ui.activities.NavigateActivity)
#手机截图
1 #获取设备的屏蔽缓冲区产生了整个显示器的屏蔽捕获。截图
2 resultdevice.takeSnapshot()
3 #返回一个MonkeyImage对象点阵图包装我们可以用以下命令将图保存到文件
4 result.writeToFile(E:\\JAVA\\monkeyrunner\\Test1\\Test1_001.png,png)
#暂停
1 #暂停目前正在运行的程序指定的秒数
2 #MonkeyRunner.sleep(秒数浮点数)
3 MonkeyRunner.sleep(5)
#字符串发送到键盘
1 #device.type(字符串)
2 device.type(hongge)
#唤醒设备屏幕
1 #锁屏后,屏幕关闭可以用下命令唤醒
2 device.wake()
#重起手机
1 device.reboot()
#模拟滑动
1 #device.drag(X,Y,D,S)
2 #X 开始坐标
3 #Y 结束坐标
4 #D 拖动持续时间(以秒为单位)默认1.0秒
5 #S 插值点时要采取的步骤。默认值是10
6 device.drag((100,1053),(520,1053),0.1,10)
#在指定位置发送触摸事件
1 #device.touch(x,y,触摸事件类型)
2 #x,y的单位为像素
3 #触摸事件类型请见下文中Findyou对device.press描述
4
5 device.touch(520,520,DOWN_AND_UP)
#发送指定类型指定键码的事件 1 #device.press(参数1:键码,参数2:触摸事件类型)2 #参数1见android.view.KeyEvent3 #参数2如有TouchPressType()返回的类型触摸事件类型有三种。4 #1、DOWN 发送一个DOWN事件。指定DOWN事件类型发送到设备对应的按一个键或触摸屏幕上。5 #2、UP 发送一个UP事件。指定UP事件类型发送到设备对应释放一个键或从屏幕上抬起。6 #3、DOWN_AND_UP 发送一个DOWN事件然后一个UP事件。对应于输入键或点击屏幕。7 以上三种事件做为press()参数或touch()参数8 9 #按下HOME键
10 device.press(KEYCODE_HOME,MonkeyDevice.DOWN_AND_UP)
11 #按下BACK键
12 device.press(KEYCODE_BACK,MonkeyDevice.DOWN_AND_UP)
13 #按下下导航键
14 device.press(KEYCODE_DPAD_DOWN,MonkeyDevice.DOWN_AND_UP)
15 #按下上导航键
16 device.press(KEYCODE_DPAD_UP,MonkeyDevice.DOWN_AND_UP)
17 #按下OK键
18 device.press(KEYCODE_DPAD_CENTER,MonkeyDevice.DOWN_AND_UP)