目录结构
一、monkeyrunner引入
1. monkeyrunner简介
2. monkeyrunner功能
3. monkeyrunner与monkey区别
4. monkeyrunner环境搭建
二、monkeyrunner API三个类的应用
1. MonkeyRunner类
2. MonkeyDevice类
1)常用方法
2)实践案例:连接设备并启动APP
3. MonkeyImage类
三、monkeyrunner综合实践
一、monkeyrunner引入
1. monkeyrunner简介
monkeyrunner工具是使用Jython(Java编程语言实现的python)写出来的,它提供了多个API,通过monkeyrunner API可以写一个Python程序来模拟操控Android设备中的app,测试其稳定性并通过截屏记录出现的问题
monkeyrunner工具提供了一个API用于编写程序,实现从Android代码之外控制Android设备or模拟器。通过monkeyrunner,可以编写一个Python程序,用于安装Android应用程序or测试包,运行并向它发送按键事件,截取用户界面的截图并存储在工作区上。monkeyrunner工具主要涉及用于在功能or框架级别测试应用程序和设备,以及运行单元测试套件
2. monkeyrunner功能
(1)多设备控制:API可跨多个设备,一次启动全部模拟器来实施测试套件
(2)功能测试:为应用自动执行一次功能测试,然后观察输出结果的截屏
(3)可扩展自动化:monkeyrunner是一个API工具包,可以开发基于Python模块的整个系统来控制Android设备
3. monkeyrunner与monkey区别
monkeyrunner与monkey没有直接关系,monkey是在设备直接运行adb shell命令生成随机事件来进行测试的;而monkeyrunner则是通过API发送特定的命令和事件来控制设备
4. monkeyrunner环境搭建
(1)安装井配置好JDK环境
(2)安装Android sdk
(3)安装Python
(4)monkeyrunner环境变量配置
变量名 | 变量值 |
---|---|
ANDROID_HOME | F:\Android\android-sdk |
Path | %ANDROID_HOME%\tools; |
(5)检查安装效果
在控制台输入命令:monkeyrunner
二、monkeyrunner API三个类的应用
monkeyrunner工具主要有三个类:
MonkeyRunner、MonkeyDevice、MonkeyImage
官方API文档:
http://www.android-doc.com/tools/help/monkeyrunner_concepts.html
1. MonkeyRunner类
提供连接真机和模拟器、输入、暂停、警告等方法
alert()
:警告框
choice()
:选项列表框
help()
:API帮助文档
input()
:输入
sleep()
:暂停
waitFor Connection()
:等待设备连接
常用方法:
waitForConnection(float timeout,string deviceid)
timeout:超时时间限制
devices:具体连接的设备
# 导入MonkeyRunner类,并创建别名
from com.android.monkeyrunner import MonkeyRunner as mr
print("connect devices...")
# 通过MonkeyRunner类调用其下的等待连接设备方法
device=mr.waitForConnection()
# device=mr.waitForConnection(5,127.0.0.1:62001)
2. MonkeyDevice类
提供了安装和卸载程序包、开启Activity、发送按键和点击事件、运行测试包等方法
broadcastIntent()
:发送广播
drag()
:拖动
getProperty()
:获取当前设备属性
getSystemProperty()
:获取系统配置信息
installPackage()
:安装应用
instrument()
:执行测试用例
press()
:按键
reboot()
:重启
removePackage()
:删除指定的Package
shell()
:执行命令
startActivity()
:启动应用
touch()
:点击
1)常用方法
installPackage(string path)
path:程序包的路径
removePackage(string package)
package:程序包名
startActivity(string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags)
通常传递包名、activity名
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:拖拽手势的持续时间,默认为1s
integer steps:插值点的步数,默认值为10
2)实践案例:连接设备并启动APP
案例:连接设备,安装考研帮App并启动
代码实现:
kyb_start.py
# -*- coding: UTF-8 -*-
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner import MonkeyDevice as md
# 连接设备
print("connect devices...")
device=mr.waitForConnection()
# 安装APP
print("install app...")
device.installPackage(r'C:\Users\Administrator\Desktop\kaoyanbang_3.3.7beta.243.apk')
# 配置APP信息
package='com.tal.kaoyan'
activity='com.tal.kaoyan.ui.activity.SplashActivity'
runComponent=package+'/'+activity
# 启动应用
print("launch app...")
device.startActivity(component=runComponent)
PS:代码中包含中文字符,需要在代码开头写上 # -*- coding: UTF-8 -*-
执行代码:
语法:monkeyrunner scriptfile
执行命令:monkeyrunner D:\CI_Env\Appium\monkeyrunner\kyb_start.py
3. MonkeyImage类
在测试过程中用来保存各种格式的测试截图,且可进行图像对比
takeSnapshot()
:进行屏幕截图
writeToFile()
:保存图像文件到指定文件路径
convertToBytes()
:转换图像格式
getRawPixel()
:获取当前坐标像素元组
getRawPixelInt()
:获取当前坐标像素值
sameAs()
:图像对比
getSubImage()
:截取子图像
使用方法:
from com.android.monkeyrunner import MonkeyImage as mi
print("takeSnapshot")
screenshot-device.takeSnapshot()
screenshot.writeToFile(r'D:\CI_Env\Appium\monkeyrunner\file\test.png','png')
三、monkeyrunner综合实践
测试场景
连接设备,自动安装并启动考研帮APP;启动后登录预先注册号的账号,然后截图并保存到指定的文件路径
思路分析
连接设备
安装APP
启动APP
进入登录界面,输入用户名+密码,点击登录
保存登录之后的截图
脚本实现
kyb_login.py
# -*- coding: UTF-8 -*-
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()
# 安装APP
print("install app...")
device.installPackage(r'C:\Users\Administrator\Desktop\kaoyanbang_3.3.7beta.243.apk')
# 配置APP信息
package='com.tal.kaoyan'
activity='com.tal.kaoyan.ui.activity.SplashActivity'
runComponent=package+'/'+activity
# 启动应用
print("launch app...")
device.startActivity(component=runComponent)
mr.sleep(12) # 根据APP启动响应速度调整等待时间
# 点击"跳过"按钮
print("touch skip button")
device.touch(645,53,'DOWN_AND_UP')
mr.sleep(3)
# 输入用户名+密码
print("input username and password")
device.touch(121,282,'DOWN_AND_UP')
mr.sleep(2)
device.type("xxxxxx") # 实际的用户名
device.touch(117,360,'DOWN_AND_UP')
mr.sleep(2)
device.type("yyyyyy") # 实际的密码
mr.sleep(2)
# 点击登录按钮
print("touch login button")
device.touch(356,464,'DOWN_AND_UP')
mr.sleep(10)
# 截图并保存
print("take snapshot")
screenshot=device.takeSnapshot()
screenshot.writeToFile(r'D:\CI_Env\Appium\monkeyrunner\file\kyb.png','png')
执行命令:
monkeyrunner D:\CI_Env\Appium\monkeyrunner\kyb_login.py
执行结果: