monkerunner
monkeyrunner简介
MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制Android设备app,测试其稳定性并通过截屏可以方便地记录出现的问题。
官网介绍如下
The monkeyrunner tool provides an API for writing programs that control an Android device or emulator from outside of Android code. With monkeyrunner, you can write a Python program that installs an Android application or test package, runs it, sends keystrokes to it, takes screenshots of its user interface, and stores screenshots on the workstation. The monkeyrunner tool is primarily designed to test applications and devices at the functional/framework level and for running unit test suites, but you are free to use it for other purposes.
monkeyrunner工具提供了一个API,用于编写从Android代码之外控制Android设备或模拟器的程序。 通过monkeyrunner,您可以编写一个Python程序,用于安装Android应用程序或测试包,运行它并向它发送按键事件,截取其用户界面的截图,并在工作区上存储屏幕截图。 monkeyrunner工具主要设计用于在功能/框架级别测试应用程序和设备,以及运行单元测试套件,但您可以自由地将其用于其他目的。
monkeyrunner 路径:Andriod_SDK\tools
MonkeyRunner功能
1.多设备控制:API可以跨多个设备,一次启动全部模拟器来实施测试套件;
2.功能测试:为应用自动执行一次功能测试,然后观察输出结果的截屏。
3.可扩展自动化:因为monkeyrunner是一个API工具包,你可以开发基于Python模块的整个系统来控制Android设备;
Monkeyrunner与Monkey区别
monkeyrunner和money没有什么直接的关系,monkey是在设备直接运行adb shell命令生成随机事件来进行测试的。相比较而言,monkeyrunner则是通过API发送特定的命令和事件来控制设备。
monkeyrunner环境搭建
- 安装并配置好jdk环境
- 安装android sdk
- 安装python
-
monkeyrunner环境变量配置: {Path}\Andriod_SDK\tools
安装结果检测
在控制台输入命令:monkeyrunner出现如下显示内容则说明安装成功
C:\Users\Shuqing>monkeyrunner
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:54:35)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_05
>>>
Tips:退出monkeyrunner命令行模式可以 使用快捷键 ctrl+D退出。
MonkeyRunner API
MonkeyRunner工具主要有三个类:
- MonkeyRunner
- MonkeyDevice
- MonkeyImage
官方API文档 :http://www.android-doc.com/tools/help/monkeyrunner_concepts.html#
1.MonkeyRunner类:
MonkeyRunner提供连接真机和模拟器、输入、暂停、警告框等方法。
常用方法
waitForConnection(float timeout,string deviceid),
from com.android.monkeyrunner import MonkeyRunner as mr
print("connect devices...")
device=mr.waitForConnection()
# device=mr.waitForConnection(5,'127.0.0.1:62001')
2.MonkeyDevice类
MonkeyDevice类提供了安装和卸载程序包、开启Activity、发送按键和点击事件、运行测试包等方法。
常用方法
- installPackage (string path)
- removePackage (string package)
- startActivity (string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags)
- touch (integer x, integer y, integer type)
touch参数说明
integer x,x坐标值。
integer y,y坐标值。
integer type,key event类型(如DOWN、UP、DOWN_AND_UP)。
DOWN为按下事件 UP为弹起事件 DOWN_AND_UP为按下弹起事件。
- drag (tuple start, tuple end, float duration, integer steps)
drag参数详细说明如下:
tuple start,拖拽起始位置,为tuple类型的(x,y)坐标点。
tuple end,拖拽终点位置,为tuple类型的(x,y)坐标点。
float duration,拖拽手势持续时间,默认为1.0s。
-integer steps,插值点的步数,默认值为10。
实践案例:
连接设备,安装考研帮App并启动
代码实现
kyb_start.py from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner import MonkeyDevice as md print("connect devices...") device=mr.waitForConnection() print("install app...") device.installPackage(r'C:\Users\Shuqing\Desktop\kaoyan3.1.0.apk') package = 'com.tal.kaoyan' activity = 'com.tal.kaoyan.ui.activity.SplashActivity' runComponent = package + '/' + activity print("launch App...") device.startActivity(component=runComponent) 代码执行方式 monkeyrunner scripfile C:\Users\Shuqing>monkeyrunner E:\monkeyrunner_script\kyb.py
3.MonkeyImage类
MonkeyImage类在测试过程中用来保存各种格式的测试截图,并可以进行图像对比。
常用方法
- takeSnapshot() 进行屏幕截图
- writeToFile() 保存图像文件到指定的文件路径
用法示例
from com.android.monkeyrunner import MonkeyImage as mi
print("takeSnapshot")
screenshot=device.takeSnapshot()
screenshot.writeToFile(r'E:\monkeyrunner_script\test.png','png')
综合实践
测试场景
- 连接设备,自动安装并启动考研帮app
- 启动后登录账号(账号zxw1234 密码:zxw123456),然后截图并保存到指定文件位置。
- 连接设备
- 安装app
- 启动app
- 输入用户名密码点击登录按钮
- 截图
思路分析
脚本实现
kyb_login.py from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner import MonkeyDevice as md from com.android.monkeyrunner import MonkeyImage as mi print("connect devices...") device=mr.waitForConnection() print(" install app") device.installPackage(r'C:\Users\Shuqing\Desktop\kaoyan3.1.0.apk') print("launch app...") package='com.tal.kaoyan' activity='com.tal.kaoyan.ui.activity.SplashActivity' runComponent=package+'/'+activity device.startActivity(component=runComponent) mr.sleep(3) print("touch cancel button") device.touch(618,895,'DOWN_AND_UP') mr.sleep(1) print("touch skip button") device.touch(804,67,'DOWN_AND_UP') mr.sleep(1) print("input username and password") device.touch(57,373,'DOWN_AND_UP') mr.sleep(2) device.type('zxw1234') device.touch(152,480,'DOWN_AND_UP') mr.sleep(2) device.type('zxw123456') mr.sleep(2) print("touch login button") device.touch(331,634,'DOWN_AND_UP') print("takeSnapshot") screenshot=device.takeSnapshot() screenshot.writeToFile(r'D:\monkeyrunner\kyb.png','png')
注意事项
方法调用错误
AttributeError: type object 'com.android.monkeyrunner.XXXXX' has no attribute XXXXXX
检查调用的方法名是否写错,特别是注意区分大小写。
字符编码错误
SyntaxError: Non-ASCII character in file 'E:\monkeyrunner_script\kyb.py', but no encoding declared;
需要在代码顶部补充 # -- coding: utf-8 -- 或者去掉代码中的中文字符