×
广告

Monkey也能写脚本—MonkeyScript

96
承香墨影
2017.03.26 15:11* 字数 2727

版权声明:

本账号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影所有。

未经允许,不得转载。

一、前言

之前有讲解过 Android 下 Monkey 的脚本命令,而且还用 Python 写了一个非常简单的利用 Monkey 的测试脚本。不清楚的朋友可以关注本公众帐号,回复关键词『Python+Monkey』查看相关的文章。

虽然之前是利用 Python + Monkey + adb 命令,完成的一连串自动化测试的脚本。但是实际上,Monkey 本身也是支持编写脚本的,这个脚本叫MonkeyScript(下文简称MS),只是 Google 官方,并没有相关的文档进行描述。但是我们还是可以从源码中找到蛛丝马迹。

本片文章适用于程序员和测试人员,会从源码的角度分析一下 Monkey Script 的,如果仅仅是测试人员,对此不感兴趣,可以跳过相关小结进行阅读。希望阅读者有一点 ADB 和 Monkey 脚本的经验,这样跟方便阅读。

二、什么是MonkeyScript

MS 是官方提供的,除了像猴子一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。MS 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。

1、MonkeyScript的使用

MS 虽然需要编写测试脚本,但是实际上它还是属于 Monkey 命令的一部分,需要通过 Monkey 命令进行启动、运行。

Monkey 启动 MonkeyScript 的命令如下:

adb shell monkey -f <MonkeyScript> <EventCount>

可以看到,通过 -f 参数即可用于指定一个 MS 脚本进行执行。需要注意的是,因为 adb shell 的运行环境是在待测试的 Android 设备上,所以需要将 MS 脚本 pull 到待测试的设备上,然后再进行运行。

2、MonkeyScript的常用API

MS 其实提供了非常完备的 API ,但是本篇文章并不想是一个帮助文档的形式,这里仅介绍一些常用的 API ,想查看完整的 API ,可以选择阅读MS相关的源码,或者可以在本公众帐号,回复关键字『MonkeyScriptAPI』即可得到完整的 API 文档。

1、点击事件(DispatchPointer)

DispatchPointer 命令用于向一个指定的坐标位置,发送单个手势消息,一般用它来模拟点击的操作。

它完整的方法签名是:

DispatchPointer ( downTime , eventTime , action , x , y , pressure , size , metaState , xPrecision , yPrecision , device , edgeFlags)

其实这么多参数,只需要关注action 、 x 、y 三个参数即可。

  • action :事件是按下还是抬起,0 表示按下,1 表示抬起。
  • x、y:表示当前事件触发的X轴和Y轴的坐标。

也就是说,两个 DispatchPointer 命令加在一起,分别表示 按下 和 抬起 ,这表示一次点击操作,其余的参数,统一设置为 0 即可。

2、按键消息(DispatchKey)

DispatchKey 主要是用于发送一些 Android 标准的 EventKey 按键消息。但是需要写对应的值。

具体的键值,可以通过官网查询:

https://developer.android.com/reference/android/view/KeyEvent.html

DispatchKey 消息的方法前面和 DispatchPointer 一样,所以同样也只需要关注 action、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 命令用于向 Shell 输入一个字符串。

它的方法签名如下:

DispatchString( input )

没什么好解释的, input 就是一个字符串即可,但是 MS 对中文的支持并不好,所以尽量输入英文的测试数据。

7、运行 Shell 命令(RunCmd)

RunCmd 命令用于在设备上运行 shell 命令。当然这些 shell 命令必须是当前待测试设备支持的 shell 命令。

它的方法签名如下:

RunCmd ( cmd )

参数 cmd 就是需要执行的 shell 命令。

8、键盘事件(DispatchPress)

DispatchPress 命令用于模拟敲击键盘的事件。

它的方法签名如下:

DispatchPress( keyName )

三、MonkeyScript的源码分析

虽然,Google 官方并没有提供对 MS 详细讲解的 API 文档,但是我们是可以通过源码来分析出 MS 支持的API的。

MS 的源码文件是:MonkeySourceScript.java

可以在 AndroidXref 网站在线查看源代码:

http://androidxref.com/5.1.1_r6/xref/development/cmds/monkey/src/com/android/commands/monkey/MonkeySourceScript.java

这里以 5.1.1 为例子,进行讲解,其实这一块的代码变动非常的少,找一个版本了解即可。

ms-code.png

在源码中,所有我们上面介绍的 API 都是以一个 static final 的形式被声明。这里简单就 LaunchActivity 的方法的源码进行讲解,其他的 API 其实也大同小异。

ms-launch-code.png

如源码所示,LaunchActiviity 会以数组的形式接收两个参数,分别表示 PackageName 和 Activity 的 ClassName,下面具体对应的实现,我们就不细看了。再参照上面介绍的 API ,就可以很清晰的定位出方法和参数的含义了。

四、举个例子

介绍了 MS 的 API 和在源码中的实现,当然需要写个 Demo 才是一个完整的技术文章。

1、测试需要一个待测试的App

既然是为了测试,当然需要一个待测试的 App ,这里简单编写一个页面,模拟一个用户登录的操作,两个对话框,一个表示 用户名 一个表示 密码,然后点击 Login 进行登录。这个待测试的App,无论填写什么,都是弹出提示登录成功,最后将输入的内容清空。

ms-demo-gif.gif

2、编写 MonkeyScript 文件

有了待测试的 App ,我们就可以开始编写 MonkeyScript 脚本文件了。

MS脚本,只要是文本即可,不关心后缀是什么。一般来说,会以.script 或者 .mks来作为后缀,标识它是一个Monkey脚本。

MS 脚本虽然有一些指定的 API ,但是也有一些固定的脚本头,需要写在脚本的最前面。

# 控制 monkey 发送消息的 Monkey 头
count=10
speed=1.0
start data>>
# 在此之下,编写 monkey 脚本命令
# ...

在脚本中,脚本头是一直不变动的,为了避免写错,可以直接复制粘贴最保险。在 start data>> 之后就可以正式开始编写 monkey 脚本了,在脚本中,使用 # 号,对单行进行注释。

接下来就开始利用 MS 提供的 API 进行脚本的编写。首先我们需要熟悉测试的步骤。

步骤如下:

  1. 启动App。
  2. 点击用户名的输入框,输入 250。
  3. 点击密码的输入框,输入 abcdef。
  4. 点击 LOGIN 按钮,弹出 Toast 提示登录成功。
  5. 此次测试结束。

按照此步骤,编写测试脚本,如下:

ms-script.png

注意这里分别使用了 DispatchPress 和 DispatchString 来分别使用,就是为了做演示,实际你可以依赖场景选择使用的 API 。而其中涉及到坐标点的问题,这个在后面会讲解如何获取控件的坐标点。

编写好脚本,保存为 monkey.mks 文件,并通过 adb push 将其上传到待测试的设备中。

adb push monkey.mks /data/local/tmp/

然后通过 monkey -f 执行此脚本,例如下面执行 10 次。

adb shell monkey -f /data/local/tmp/monkey.mks 10

执行完成之后,可以在控制台,看到输出的 Log 信息。

ms-cmd.png

在执行的过程中,就可以看到 MS 会自动启动我们待测试的 App ,然后按照我们的编写的测试脚本,进行重复执行 10 次。

ms-run.gif

3、控件坐标点的获取

网上很多推荐获取坐标点的方式,是使用 android-sdk/tools 目录下,提供的 uiautomatorviewer 工具来获取。但是这种方式非常的繁琐,而实际上,我们又不需要如此精确的坐标点,毕竟控件那么大,只要点击的坐标落在控件的位置上,即可。

那么我推荐另外一种更简单的方式,来获取当前你看见的,在待测试设备上的控件的坐标点的定位方式。那就是利用 Android 设备的开发者选项。

设置 → 开发者选项 → 指针位置 ,将这个属性开启之后,当手指在屏幕上滑动的时候,就可以在顶部看到当前触摸点的 X、Y 轴的坐标,这就是我们需要的。

开发者选项不是默认可见的,你需要自行开启开发者模式,之后再进行此操作。

五、总结

MS 提供的API非常的方便,可以利用它们做一些自动化操作。

本文中编写的脚本,可以在本公众号,回复关键字『MonkeyScript例子』获得。

完整的 API 可以在本公众号,回复关键词『MonkeyScriptAPI』查询到完整的API文档。

如果觉得有用,记得点个赞再走。谢谢。

公众号二维码.jpg
随笔
Web note ad 1