MonkeyScript使用教程
原文地址https://www.cnblogs.com/yizhou-xu/p/8072813.html
原文地址https://www.cnblogs.com/YatHo/p/7205162.html
MonkeyScript的简单使用
一、 什么是MonkeyScript
MS 是官方提供的,除了像猴子一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。MS 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。
二、 MonkeyScript的使用
- 编写MonkeyScript的测试脚本。
MS脚本只要是文本即可,不关心后缀是什么,所以编写时不要添加后缀,保存文本格式即可。
MS 脚本虽然有一些指定的 API ,但是也有一些固定的脚本头,需要写在脚本的最前面。
type=user
count = 1
speed = 1.0
start data >>
在脚本中,脚本头是一直不变动的,为了避免写错,可以直接复制粘贴最保险。在 start data>> 之后就可以正式开始编写 monkey 脚本了,在脚本中,使用 #
号,对单行进行注释。
MonkeyScript是需要指定Activity(当前app展示的界面)的,获取当前指定界面Activity名称的指令为adb shell dumpsys activity | grep mFocused。
下面以测试登录功能为例:
LaunchActivity(Activity)
UserWait(1000)
DispatchPointer(0,0,0,303,312,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,303,312,0,0,0,0,0,0,0)
UserWait(1000)
DispatchString(1234566)
UserWait(100)
//输入密码
DispatchPointer(0,0,0,345,393,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,345,393,0,0,0,0,0,0,0)
UserWait(100)
DispatchString(1234567)
UserWait(1000)
//点击空白处让键盘消失
DispatchPointer(0,0,0,100,100,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,100,100,0,0,0,0,0,0,0)
UserWait(1000)
//点击登录按钮
DispatchPointer(0,0,0,361,507,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,361,507,0,0,0,0,0,0,0)
UserWait(3000)
脚本解释:
首先启动你要测试的界面,此处为登录界面,登录界面有三个控件,用户名的textField,密码的textField,和登录按钮。
LaunchActivity()
作用为来到登录界面
UserWait(1000)
等待1秒以后执行下一个操作
DispatchPointer(0,0,0,303,312,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,303,312,0,0,0,0,0,0,0)
DispatchPointer点击用户名的textField,只需关注3,4,5这三个参数即可,第三个参数为0表示点击了textField ,为1表示松开了textField,4,5两个参数分别为用户名textField 的x,y坐标。
DispatchString(123456)
在用户名的textField中输入123456用户名
按照上面的操作在密码的textField输入密码,点击登录按钮,整改登录测试就完成了,如果需要继续测试登录后的界面则需要从新启动新的Activity。
//登录成功后来到首页点击发布作业功能(具体什么功能和第4,5个参数设置的值有关)
LaunchActivity(Activity)
UserWait(1000)
DispatchPointer(0,0,0,650,182,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,650,182,0,0,0,0,0,0,0)
UserWait(1000)
Drag(500,1500,500,500,12)
#向上滑动
将写好的脚本保存到本地。
2. Monkey 启动 MonkeyScript 的命令如下:
adb shell monkey -f <MonkeyScript> <EventCount>
<MonkeyScript>指你编写的MonkeyScript脚本,
<EventCount>指Monkey事件,例如执行次数,日志详情等。
具体指令:
- adb shell mkdir /sdcard/script 在设备上创建script文件夹用于存放脚本
- 将本地脚本文件push到设备中上面创建的文件夹中。例如adb push /Users/userName/Desktop/testLogin空格/sdcard/script,/Users/userName/Desktop/testLogin就是你脚本在本地的存放路径。
- 执行adb shell monkey -f /sdcard/script/你的脚本名称 –v –v 10 >C:\monkey.txt即可,>C:\monkey.txt为日志输出路径。
其他简介
LaunchActivity(pkg_name, cl_name):启动应用的Activity。参数:包名和启动的Activity。
Tap(x, y, tapDuration): 模拟一次手指单击事件。参数:x,y为控件坐标,tapDuration为点击的持续时间,此参数可省略。
DispatchPress(keyName): 按键。参数: keycode。 详细的Android Keycode列表: http://blog.csdn.net/feizhixuan46789/article/details/16801429
RotateScreen(rotationDegree, persist): 旋转屏幕。 参数:rotationDegree为旋转角度, e.g. 1代表90度;persist表示旋转之后是否固定,0表示旋转后恢复,非0则表示固定不变。
DispatchFlip(true/false): 打开或者关闭软键盘。
LongPress(): 长按2秒。
PressAndHold(x, y, pressDuration): 模拟长按事件。
DispatchString(input): 输入字符串。
Drag(xStart, yStart, xEnd, yEnd, stepCount): 用于模拟一个拖拽操作。
PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟缩放手势。
UserWait(sleepTime): 休眠一段时间
DeviceWakeUp(): 唤醒屏幕。
PowerLog(power_log_type, test_case_status): 模拟电池电量信息。
WriteLog(): 将电池信息写入sd卡。
RunCmd(cmd): 运行shell命令。
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags): 向指定位置,发送单个手势。
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFilags): 发送按键消息。
LaunchInstrumentation(test_name,runner_name): 运行一个instrumentation测试用例。
DispatchTrackball: 模拟发送轨迹球事件。
ProfileWait: 等待5秒。
StartCaptureFramerate(): 获取帧率。
EndCaptureFramerate(input): 结束获取帧率。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
作为移动端测试必须掌握的初级Android稳定性工具:monkey,提到它时,脑海里一般涌现出两句话:
1.我会用,很简单
就是一行命令,一回车就开始跑起来了
2.使用问题多,不好用
太随机,很多操作没意义
达到深层页面的概率极低
虽然加了各种忽略异常,但是monkey进程还是经常死掉
无法有针对性(指定页面or指定操作)的测试 ,等等
带着这些问题,将更智能的monkey介绍给大家
智能monkey之monkeyscript(一)
解决问题:
有针对性的指定操作进行稳定性测试
需求(参考搜狗搜索APP):
启动app,搜索1次,退出。重复1万次
Script:
type=user
count=10
speed=1.0
start data >>
LaunchActivity(com.sogou.activity.src, com.sogou.search.entry.EntryActivity)
UserWait(3000)
captureDispatchPointer(10,10,0,500,500,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,500,500,1,1,-1,1,1,0,0)
UserWait(500)
captureDispatchString(test)
UserWait(500)
captureDispatchPress(66)
UserWait(3000)
Drag(500,1500,500,500,500)
captureDispatchPress(4)
UserWait(1000)
captureDispatchPress(4)
captureDispatchPress(4)
script逐行解释:
type=user
count=10
speed=1.0
start data >>
#固定头部,参数和值均不影响脚本
LaunchActivity(com.sogou.activity.src, com.sogou.search.entry.EntryActivity)
#启动app,参数1:包名,参数2:主activity名
UserWait(1500)
#等待1500毫秒
captureDispatchPointer(10,10,0,500,500,1,1,-1,1,1,0,0)
#按下坐标500,500(搜索框位置)
captureDispatchPointer(10,10,1,500,500,1,1,-1,1,1,0,0)
#抬起坐标500,500(搜索框位置)
UserWait(500)
#等待500毫秒
captureDispatchString(test)
#在搜索框输入“test”
captureDispatchPress(66)
#输入回车进行搜索
UserWait(3000)
#等待3000毫秒
Drag(500,1500,500,500,500)
#上划浏览搜索结果页
captureDispatchPress(4)
#输入back回退至app首页
UserWait(500)
等待500毫秒
captureDispatchPress(4)
captureDispatchPress(4)
#双back退出app
运行:
1.将脚本保存命名(例test_search)
2.将脚本文件放置测试机中
adb shell mkdir /sdcard/script
#创建脚本文件夹
adb push test_search /sdcard/script
#将脚本文件push到文件夹
3.运行脚本文件1万次
adb shell monkey -f /sdcard/script/test_search 10000
运行效果:
附件1
Monkeyscript API介绍
#单点事件
DispatchPointer(downTime,eventTime,action,x,y,pressure,size,metaStat,xPrecision,yPrecision,device,edgeFlags)
downTime,//touchdown的时间
eventTime,//touch时间发生的时间
action,//Action code: either {@link #ACTION_DOWN=0}, {@link #ACTION_UP=1}, or {@link #ACTION_MULTIPLE=2}. 如果时间是0,2,1可以模拟滑屏
x, //The X coordinate of this event.
y, //The Y coordinate of this event.
pressure, //The current pressure of this event. The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure), however values higher than 1 may be generated depending on the calibration of the input device.
size, //A scaled value of the approximate size of the area being pressed touched with the finger. The actual value in pixels corresponding to the finger touch is normalized with a device specific range of values and scaled to a value between 0 and 1.
metaStatex //The state of any meta / modifier keys that were in effect when the event was generated.
xPrecision, //The precision of the X coordinate being reported.
yPrecision, //The precision of the Y coordinate being reported.
deviceId, //The id for the device that this event came from. An id of zero indicates that the event didn't come from a physical device; other numbers are arbitrary and you shouldn't depend on the values.
edgeFlags, // A bitfield indicating which edges, if any, where touched by this MotionEvent
example:
DispatchPointer(0,0,0,830,1000,0,0,0,0,0,0,0); touchDown
DispatchPointer(0,0,1,830,1000,0,0,0,0,0,0,0);touchUp
#拖动
Drag(x1,y1,x2,y2,stepCount)
example:
快速下滑:Drag(300,500,300,300,15)
快速上滑:Drag(300,300,300,500,15)
#双指缩放
PinchZoom(xstart1,ystart1,xstart2,ystart2,xend2,yend2,xend1,yend1,step)
example:
#放大
PinchZoom(400,400,200,300,550,550,700,700,3);
#cmd: shell命令
RunCmd(cmd)
example
RunCmd(monkey -v 1000)
#发送tap事件(一个touchdown和touch up事件),时间长可以模拟长按,时间单位为ms
Tap(x,y,tapDuration)
#启动唤醒设备
DeviceWakeUp()
#获取最后一个touch时间的点做长按
LongPress()
#按住duration时长
PressAndHold(x,y,duration)
#屏幕旋转
RotateScreen(rotationDegree,persist)
// rotationDegree只能支持0,90,180,270
// persist 0/1
// 对指定keycode模拟touch事件(keycode列表见尾部)
DispatchKey(downTime,eventTime,action,code,repeat,metaState,device,scancode)
// 对指定keycode模拟press事件
DispatchPress(KeyCode)
KEYCODE列表
电话键
键名 | 描述 | 键值 |
---|---|---|
KEYCODE_CALL | 拨号键 | 5 |
KEYCODE_ENDCALL | 挂机键 | 6 |
KEYCODE_HOME | 按键Home | 3 |
KEYCODE_MENU | 菜单键 | 82 |
KEYCODE_BACK | 返回键 | 4 |
KEYCODE_SEARCH | 搜索键 | 84 |
KEYCODE_CAMERA | 拍照键 | 27 |
KEYCODE_FOCUS | 拍照对焦键 | 80 |
KEYCODE_POWER | 电源键 | 26 |
KEYCODE_NOTIFICATION | 通知键 | 83 |
KEYCODE_MUTE | 话筒静音键 | 91 |
KEYCODE_VOLUME_MUTE | 扬声器静音键 | 164 |
KEYCODE_VOLUME_UP | 音量增加键 | 24 |
KEYCODE_VOLUME_DOWN | 音量减小键 | 25 |
控制键
键名 | 描述 | 键值 |
---|---|---|
KEYCODE_ENTER | 回车键 | 66 |
KEYCODE_ESCAPE | ESC键 | 111 |
KEYCODE_DPAD_CENTER | 导航键 确定键 | 23 |
KEYCODE_DPAD_UP | 导航键 向上 | 19 |
KEYCODE_DPAD_DOWN | 导航键 向下 | 20 |
KEYCODE_DPAD_LEFT | 导航键 向左 | 21 |
KEYCODE_DPAD_RIGHT | 导航键 向右 | 22 |
KEYCODE_MOVE_HOME | 光标移动到开始键 | 122 |
KEYCODE_MOVE_END | 光标移动到末尾键 | 123 |
KEYCODE_PAGE_UP | 向上翻页键 | 92 |
KEYCODE_PAGE_DOWN | 向下翻页键 | 93 |
KEYCODE_DEL | 退格键 | 67 |
KEYCODE_FORWARD_DEL | 删除键 | 112 |
KEYCODE_INSERT | 插入键 | 124 |
KEYCODE_TAB | Tab键 | 61 |
KEYCODE_NUM_LOCK | 小键盘锁 | 143 |
KEYCODE_CAPS_LOCK | 大写锁定键 | 115 |
KEYCODE_BREAK | Break/Pause键 | 121 |
KEYCODE_SCROLL_LOCK | 滚动锁定键 | 116 |
KEYCODE_ZOOM_IN | 放大键 | 168 |
KEYCODE_ZOOM_OUT | 缩小键 | 169 |
MonkeyScript使用教程的更多相关文章
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境
一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
- wepack+sass+vue 入门教程(一)
一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...
- Virtual Box配置CentOS7网络(图文教程)
之前很多次安装CentOS7虚拟机,每次配置网络在网上找教程,今天总结一下,全图文配置,方便以后查看. Virtual Box可选的网络接入方式包括: NAT 网络地址转换模式(NAT,Network ...
随机推荐
- Spark Streaming源码分析 – Checkpoint
PersistenceStreaming没有做特别的事情,DStream最终还是以其中的每个RDD作为job进行调度的,所以persistence就以RDD为单位按照原先Spark的方式去做就可以了, ...
- php 如何得到不含前导0的时分秒
通常我们获取时分秒是用 date("H:i:s") ,得到的效果是这样的 而如果想获取不含前导0的时分秒的话,就需要把前导0去掉. 如何去掉呢?我们来分析一下,07变7,20还是2 ...
- swift - 之 UICollectionView的用法/自定义流布局
具体代码如下: 1.声明 var hCollectionView:UICollectionView? var layout:UICollectionViewFlowLayout? let course ...
- docker中文、手册、教程
Docker资源 Docker官方英文资源: docker官网:http://www.docker.com Docker windows入门:https://docs.docker.com/windo ...
- 集群--LVS的介绍
相关概念 LVS体系结构如图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在它们的前端有一个负载调度器(Load Balancer).负载调度器能无缝地将网络请求调度到真实服务器 ...
- Sphinx以及coreseek的安装及使用 .No1
检索结构php -> sphinx -> mysql非结构化数据又叫全文数据,非固定长度字段例如文章标题搜索这类适用sphinx 全文数据搜索:顺序扫描 : 如like查找索引扫描 : 把 ...
- 【IOS6.0 自学瞎折腾】(五)应用程序的启动过程和Application生命周期
一 :main函数入口 看下项目资源结构,其实程序的入口也是在main.m里面. #import <UIKit/UIKit.h> #import "BvinAppDelegate ...
- 【LINUX】SVN 代码提交之后。同步到web目录下
1 当你使用svn在成功提交一个新版本的时候,svn仓库目录下的hook文件夹下的post-commit脚本会运行 用shell写一个脚本,在提交完版本后,自动在web目录运行一下svn updat ...
- php array key 的存储规则
刚刚写程序遇到php数组取值的问题,发现字符串和数字取出来的是一样的. key 可以是 integer 或者string.value 可以是任意类型. 此外 key 会有如下的强制转换: 包含有合法整 ...
- Delphi Code Editor 之 几个特性(转)
Delphi Code Editor有几个特性在编写大规模代码时非常有用.下面分别进行介绍: 原地址:http://www.cnblogs.com/pchmonster/category/343330 ...