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=usercount=10speed=1.0start 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=usercount=10speed=1.0start 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 |
转载于:https://www.cnblogs.com/111testing/p/9127771.html
MonkeyScript使用教程相关推荐
- 安卓应用测试MonkeyMonkeyScriptMonkeyRunnerpyhton性能工具脚本
目录 一.安装Android SDK 1.1 mac安装Android SDK 1.1.1 方式一:下载 Android SDK 1.1.2 方式二:使用brew 安装 Android SDK ...
- 使用Docker搭建svn服务器教程
使用Docker搭建svn服务器教程 svn简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很 ...
- mysql修改校对集_MySQL 教程之校对集问题
本篇文章主要给大家介绍mysql中的校对集问题,希望对需要的朋友有所帮助! 推荐参考教程:<mysql教程> 校对集问题 校对集,其实就是数据的比较方式. 校对集,共有三种,分别为:_bi ...
- mysql备份psb文件怎么打开_Navicat for MySQL 数据备份教程
原标题:Navicat for MySQL 数据备份教程 一个安全和可靠的服务器与定期运行备份有密切的关系,因为错误有可能随时发生,由攻击.硬件故障.人为错误.电力中断等都会照成数据丢失.备份功能为防 ...
- php rabbmq教程_RabbitMQ+PHP 教程一(Hello World)
介绍 RabbitMQ是一个消息代理器:它接受和转发消息.你可以把它当作一个邮局:当你把邮件放在信箱里时,你可以肯定邮差先生最终会把邮件送到你的收件人那里.在这个比喻中,RabbitMQ就是这里的邮箱 ...
- 【置顶】利用 NLP 技术做简单数据可视化分析教程(实战)
置顶 本人决定将过去一段时间在公司以及日常生活中关于自然语言处理的相关技术积累,将在gitbook做一个简单分享,内容应该会很丰富,希望对你有所帮助,欢迎大家支持. 内容介绍如下 你是否曾经在租房时因 ...
- Google Colab 免费GPU服务器使用教程 挂载云端硬盘
一.前言 二.Google Colab特征 三.开始使用 3.1在谷歌云盘上创建文件夹 3.2创建Colaboratory 3.3创建完成 四.设置GPU运行 五.运行.py文件 5.1安装必要库 5 ...
- 理解和实现分布式TensorFlow集群完整教程
手把手教你搭建分布式集群,进入生产环境的TensorFlow 分布式TensorFlow简介 前一篇<分布式TensorFlow集群local server使用详解>我们介绍了分布式Ten ...
- 高级教程: 作出动态决策和 Bi-LSTM CRF 重点
https://www.zhihu.com/question/35866596 条件随机场 CRF(条件随机场)与Viterbi(维特比)算法原理详解 https://blog.csdn.net/qq ...
最新文章
- Numpy 中的 arange 函数
- 图灵十一月书讯 ——爱在深秋
- php随机生成器加密,php生成随机密码的几种方法
- jsonp数据库拿数据到html页面,前端如何优雅的使用jsonp获取接口数据
- 1371. Find the Longest Substring Containing Vowels in Even Counts
- 深入研究Servlet线程安全性问题
- 网站数据库中“密码加密”方法思考
- 使用Grab的实验平台进行混沌实验编排
- python matplotlib 柱状图点击事件_Python:matplotlib分组Bar柱状图
- wpf textbox能扫描不能手输_3D扫描仪性能怎么样 3D扫描仪价格介绍【详解】
- VBS去除字符串的重复项并统计重复字符出现的次数
- axios.js post 后台木有数据
- .Net程序逆向入门教程
- 手机android id修改密码,苹果手机怎么设置id账号和密码或重设密码
- K3S执行命令提示You must be logged in to the server (Unauthorized)
- Unity 协程的原理
- CUDA10.2+cuDNN8+tensorflow-gpu2.3.1安装
- 学计算机的上升路线,学习计算机路线图.doc
- VASP计算弹性常数
- 能把百度玩出花样的人肯定不简单,分享几个鲜为人知的搜索引擎高级语法
热门文章
- 前端必须掌握30个CSS3选择器
- dart 获取手机信息_flutter+dart仿微信App界面聊天实例
- Python3 GUI编程: 自带图形库 tkinter 学习教程
- 【CCCC】L2-029 特立独行的幸福 (25分),模拟题,set用法
- 【CF 670C】Cinema
- NYOJ458 - 小光棍数
- linux ios文件是否存在,技术|如何在 Linux 中验证 ISO 镜像
- html 列导航包括导航,在HTML5中,主导航应该在元素内部还是外部?
- matlab绘制等间距同心圆,CDR绘制等距离同心圆的多种方法
- 不会linux的php难找工作,学linux系统难吗