1。在前言中,我已经讲解了Android下Monkey的脚本命令,并在Python中使用Monkey写了一个非常简单的测试脚本。虽然之前是用Python+Monkey+adb命令来完成一系列自动化测试的脚本。而且Monkey本身也支持脚本。这个脚本叫做MonkeyScript(以下简称MS),只是谷歌官方的,没有相关文档对其进行描述。但是我们还是可以从源码中找到蛛丝马迹。本文适合程序员和测试人员阅读。它将从源代码的角度分析MonkeyScript。如果你只是一个测试人员,对它不感兴趣,可以跳过相关总结阅读。希望读者对ADB和Monkey脚本有一定的了解,这样读起来更容易。2、什么是MonkeyScriptMS官方提供了。除了直接使用Monkey命令像猴子一样随意点击外,还可以通过编写脚本来完成一系列固定操作。MS提供了一套完整的API进行支持,主要是基于坐标点的操作,包括常用的点击、长按、输入、等待等操作。1、MonkeyScript的使用虽然MS需要编写测试脚本,但是它仍然是Monkey命令的一部分,需要通过Monkey命令启动和运行。Monkey启动MonkeyScript的命令如下:adbshel??lmonkey-f可以通过-f参数指定一个MS脚本执行。需要注意的是,由于adbshell的运行环境是在待测Android设备上,所以需要使用adbpull命令将MS脚本传输到待测设备上,然后运行。2.MonkeyScript常用的APIMS其实提供了非常完整的API,但是这篇文章并不打算只是一个帮助文档。这里只介绍一些常用的API。如果想查看完整的API,可以选择阅读MS相关的源码,也可以在本公众号阅读,回复关键词“MonkeyScriptAPI”获取完整的API文档。1.点击事件(DispatchPointer)DispatchPointer命令用于向指定坐标位置发送单个手势消息,一般用于模拟点击操作。它完整??的方法签名是:DispatchPointer(downTime,eventTime,action,x,y,pressure,size,metaState,xPrecision,yPrecision,device,edgeFlags)其实参数就这么多,只需要关注三个参数的作用,x,y可以。action:事件是按下还是解除,0表示按下,1表示解除。x,y:表示当前事件触发的X轴和Y轴坐标。也就是说,将两个DispatchPointer命令加在一起,分别代表press和lift。一组press和lift代表一次点击操作,其余参数统一设置为0即可。2.按键消息(DispatchKey)DispatchKey主要用于发送一些Android标准的EventKey按键消息。传递相应的值即可。具体的key值可以通过官网查询:https://developer.android.com/reference/android/view/KeyEvent.htmlDispatchKey消息的方法和DispatchPointer一样,只需要付费注意动作、x和y参数。3.打开和关闭软键盘(DispatchFlip)DispatchFlip命令用于打开或关闭软键盘。其方法签名如下:参数中的DispatchFlip(keyboardOpen),true表示打开,false表示关闭。4、打开指定的Activity(LaunchActivity)LaunchActivity命令用于打开任何应用程序的页面,但前提是打开的Activity需要属性android:exported设置为true才能通过LaunchActivity打开。它的方法签名如下:LaunchActivity(pkg_name,act_name)它的两个参数分别代表打开的App的包名和打开的Activity的名称。5.等待(UserWait)UserWait命令用来中断脚本的执行一段时间。因为脚本是自动执行的,所以多个事件之间的执行速度会非常快。有时我们需要等待一段时间让设备响应刚刚执行的事件。我们需要等待一段时间才能继续执行脚本。这时候你可以使用UserWait。其方法签名如下:UserWait(sleepTime)sleepTime的单位是毫秒。6.输入字符串(DispatchString)DispatchString命令用于输入一个字符串。它的方法签名如下:DispatchString(input)没什么好解释的,input只是一个字符串,但是MS对中文的支持不是很好,所以尝试用英文输入测试数据。7、运行Shell命令(RunCmd)RunCmd命令用于在设备上运行shell命令。当然,这些shell命令必须是当前被测设备支持的。其方法签名如下:RunCmd(cmd)参数cmd是要执行的shell命令。8.键盘事件(DispatchPress)DispatchPress命令用来模拟键盘敲击事件。其方法签名如下:DispatchPress(keyName)3.MonkeyScript源码分析虽然Google官方没有提供详细说明MS的API文档,但是我们可以通过源码分析MS支持的API。MS源码文件为:MonkeySourceScript.java,可以在AndroidXref网站在线查看源码:http://androidxref.com/5.1.1_r6/xref/development/cmds/monkey/src/com/android/命令/猴子/MonkeySourceScript。Java这里以5.1.1为例进行说明。其实这块的代码改动很小,随便找个版本看懂就可以了。在源码中,我们上面介绍的所有API都是以staticfinal的形式声明的。这里简单解释一下LaunchActivity方法的源码,其他的API其实也是类似的。如源码所示,LaunchActivity会接收到两个数组形式的参数,分别代表Activity的PackageName和ClassName。我们不会仔细研究下面的相应实现。参考上面介绍的API,可以很清楚的定位到方法和参数的含义。4.举例介绍MSAPI及其在源码中的实现。当然,你需要写一个Demo才能成为一篇完整的技术文章。1.测试需要一个app进行测试。既然是测试用的,就需要一个app来测试。这里简单写一个页面,模拟一个用户登录操作,两个对话框,一个是用户名,一个是密码,然后点击登录就可以登录了。这个要测试的app,不管填什么都行会弹出提示登录成功,最后清空输入的内容。2.编写MonkeyScript文件有了待测App,我们就可以开始编写MonkeyScript脚本文件了。MS脚本,只要是文本,不关心后缀是什么。一般会加上.script或.mks后缀来标识它是Monkey脚本。MS脚本虽然有一些特定的API,但也有一些固定的脚本头,需要写在脚本的最前面。#控制猴子的猴头发送消息count=10speed=1.0startdata>>#在这个下面,写猴子脚本命令#...在脚本中,脚本头一直不变,为了避免写错,可以直接复制粘贴最安全。startdata>>之后,就可以正式开始编写monkey脚本了。在脚本中,使用#符号对单行进行注释。然后开始使用MS提供的API编写脚本。首先我们需要熟悉测试的步骤。步骤如下:启动应用程序。点击用户名输入框,输入250。点击密码输入框,输入abcdef。点击LOGIN按钮,弹出Toast表示登录成功。这个测试结束了。按照这个步骤写一个测试脚本,如下:count=1speed=1.0startdata>>LaunchActivity(com.example.cxmy.monkeyscriptdemo,com.example.cxmy.monkeyscriptdemo.MainActivity)UserWait(1000)#点击密码框DispatchPointer(10000,10000,0,68,345,0,0,0,0,0,0,0)DispatchPointer(10000,10000,1,68,345,0,0,0,0,0,0,0)UserWait(100)DispatchPress(KEYCODE_2)UserWait(100)DispatchPress(KEYCODE_5)UserWait(100)DispatchPress(KEYCODE_0)UserWait(100)#点击密码框DispatchPointer(10000,10000,0,68,446,0,0,0,0,0,0,0)DispatchPointer(10000,10000,1,68,446,0,0,0,0,0,0,0)UserWait(100)DispatchString(abcdef)UserWait(100)DispatchPointer(10000,10000,0,548,627,0,0,0,0,0,0,0)DispatchPointer(10000,10000,1,548,627,0,0,0,0,0,0,0)UserWait(100)注意这里分开使用DispatchPress和DispatchString,只是为了演示,其实可以根据场景选择使用哪个API。并且涉及到坐标点的问题,后面会讲解如何获取控件的坐标点。编写脚本,保存为monkey.mks文件,通过adbpush上传到待测设备。adbpushmonkey.mks/data/local/tmp/然后通过monkey-f执行这个脚本,比如执行下面10次。执行adbshel??lmonkey-f/data/local/tmp/monkey.mks10后,可以在控制台看到输出的Log信息。在执行过程中,我们可以看到MS会自动启动待测App,然后按照我们编写的测试脚本重复执行10次。3、控件坐标点的获取网上有很多推荐的获取坐标点的方法,就是使用android-sdk/tools目录下提供的uiautomatorviewer工具。但是这种方法非常繁琐,而且实际上我们不需要这么精确的坐标点。毕竟控件那么大,只要点击的坐标落在控件的位置上就可以满足我们的需求了。那么我再推荐一种更简单的获取当前看到的被测设备上控件坐标点定位的方法。那就是利用Android设备的开发者选项。Settings→DeveloperOptions→PointerPosition,启用该属性后,当手指在屏幕上滑动时,可以在上方看到当前触摸点的X、Y坐标,这就是我们需要的。开发者选项默认是不可见的,需要你自己开启开发者模式,然后才可以。五、总结MS提供的API非常方便,可以用它们做一些自动化的操作。【本文为专栏作家“张扬”原创稿件,转载请微信♂联系作者获得授权】点此查看作者更多好文