移动测试基础 [Monkeyrunner 小白入门示例] 算是新秀的学习心得吧

大东 · 2014年10月10日 · 最后由 小李 回复于 2017年10月17日 · 4126 次阅读
本帖已被设为精华帖!

最近工作业务一直在忙,新技术研究较少,尚不能有所总结。
所以把早几个月写给团队的 Monkeyrunner 贡献一下,都是很基础的东西。

准备工作
1、安装 Android SDK
2、熟悉 MonkeyRunner 的 API(http://article.yeeyan.org/view/37503/164523
3、一部 Android 手机或模拟器(手机与电脑连接,可以使用 adb devices 验证手机是否与电脑连接成功)
4、手机打开 “指针位置” 功能,可以方便我们定位坐标,打开方法:

SDK 的安装过程我就不赘述了,直接开始一个简单的 MonkeyRunner 交互
1、 打开 cmd,输入

monkeyrunner

,回车,出现如图情况,则进入了 MonkeyRunner 的交互对话环境

2、 输入

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

,回车,导入 MonkeyRunner 运行所需要的模块,没有报错则成功

3、 输入

device = MonkeyRunner.waitForConnection()

回车,使 MonkeyRunner 与设备进入连接状态,没有报错则成功

4、输入

device.installPackage(‘e:/hjclass.apk’)

,回车,安装放在 e 盘下的 hjclass.apk 文件到手机中,这个 apk 文件是我提前准备好的应用,若返回 True 则安装成功

5、 输入

device.startActivity(‘com.xx.xxx/.activity.xxxActivity’) 

回车后可以直接看手机,如果 APP 被启动,则表示成功;
启动一个应用,其中 (‘com.xx.xxx/.activity.xxxActivity’) 是 APP 的包名和启动 Activity,这两个参数相当于 Appium 中需要用到的 app-activity,可以问开发获取。也可以参考乙醇大大提供的方法:http://www.cnblogs.com/nbkhic/p/3806951.html

===分割线 以下均以我测试的应用为准,仅供大家参考 ====

6、 在启动 APP 后,我们可以看到第一个界面,我们获取当前界面 “创建” 按钮的坐标,如图,按住手机上的该按钮,可以在手机顶部看到该按钮的坐标为(454,702):

7、 回到 cmd,我们输入

device.touch(454,702,’DOWN_AND_UP’)

回车后,就手机上就执行了点击的动作,我们可以看到手机上按钮被点击了。

8、 进入到了欢迎页,这时候我们需要进行滑动操作,就要获取滑动前的坐标、滑动后的坐标,以同样的方法,我们获取到滑动的初始坐标为(670,700),结束坐标为(200,700),因此我们在 cmd 中输入

device.drag((670,700),(200,700),3)

回车后观察手机,发现滑动成功。总共有三个欢迎页,所以该命令执行 2 次。

9、 到欢迎页最后一页,照旧,获得按钮的坐标,(400,1000),输入

device.touch(400,1000,’DOWN_AND_UP’)

进入到登录界面

10、 获取用户名栏上的坐标,坐标获取为 (400,550),输入

device.touch(400,550,’DOWN_AND_UP’)

回车
11、 光标定位到用户名输入栏后,我们需要输入用户名,则在 cmd 中输入如下命令,

device.type(‘username’)

回车,type 即输入文字
12、 用户名输入完,此时我们需要把光标定位到密码栏,获取到密码栏的坐标(430,430),输入

device.touch(430,430,’DOWN_AND_UP’)

13、 输入密码

device.type(‘password’)

回车
14、 照旧,获取登录按钮的坐标,并点击

到此为止,一个应用的安装、打开、滑动、输入、登录的操作全部操作完了。
我们回顾一遍,其实刚刚我们从交互开始,全部代码整合一遍,整合成一个 Python 文件,是可以一次性执行完的。
整理完后:

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
device = MonkeyRunner.waitForConnection()
device.installPackage('e:/hjclass.apk')
device.startActivity(com.xx.xxx/.activity.xxxActivity) 
device.touch(454,702,'DOWN_AND_UP')
device.drag((670,700),(200,700),3)
device.drag((670,700),(200,700),3)
device.touch(400,1000,'DOWN_AND_UP')
device.touch(400,550,'DOWN_AND_UP')
device.type('username')
device.touch(430,430,'DOWN_AND_UP')
device.type('password')
device.touch(400,800,'DOWN_AND_UP')

打开一个编辑器,并将你刚刚交互中所写的代码写到里面去,然后保存成一个 Python 文件,比如保存名字为 monkeyrunner.py,放的 e 盘根目录。
执行文件的方法:
1、 打开 cmd
2、 输入 e: ,然后回车
3、 输入 monkeyrunner e:/monkeyrunner.py ,回车后代码就开始执行了

上面就代码就是一个简单的用例了,但是如果直接上面这段代码的话,会出现一些问题,因为上面的代码中没有等待时间,也许点击确定后,还没等手机反应过来,就已经执行了下一句代码了,导致用例执行失败。
所以我们要对这个代码进行修改,在操作当中插入等待时间:

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

device = MonkeyRunner.waitForConnection()
device.installPackage('e:/hjclass.apk')
#启动应用,然后等待6秒钟
device.startActivity('com.hujiang.hjclass/.activity.SplashActivity')
MonkeyRunner.sleep(6)
#点击创建,然后等待2秒钟
device.touch(454,702,'DOWN_AND_UP')
MonkeyRunner.sleep(2)
#滑动欢迎页2次,滑动一次后等待2秒钟
device.drag((670,700),(200,700),3)
MonkeyRunner.sleep(2)
device.drag((670,700),(200,700),3)
MonkeyRunner.sleep(2)
#点击开始学习按钮,然后等待3两秒钟
device.touch(400,1000,'DOWN_AND_UP')
MonkeyRunner.sleep(3)
#点击用户名输入栏,等待1秒钟
device.touch(400,550,'DOWN_AND_UP')
MonkeyRunner.sleep(1)
#输入用户名,等待1秒钟
device.type('username')
MonkeyRunner.sleep(1)
#点击密码栏,等待1秒钟
device.touch(430,430,'DOWN_AND_UP')
MonkeyRunner.sleep(1)
#输入密码,等待1秒钟
device.type('password')
MonkeyRunner.sleep(1)
#点击登录按钮
device.touch(400,800,'DOWN_AND_UP')
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 30 条回复 时间 点赞

很好,同时也很好的遵守了编写规范~赞~

#1 楼 @monkey (:з」∠)给 Ye 总回帖的速度也点个赞!

 我入门了~ 我一直不会用 monkeyrunner

#3 楼 @lihuazhang 一些常规性测试的自动化还是挺有用的..

我也入门了,稍微用了下就放弃了这款工具。
你这里面只是对控件的操作,而没有去验证,没有 check point,实际没什么意义。
而且这个可以录制的。

#5 楼 @beerbox 说了只是入门示例。 里面还很多 API,monkeyrunner 本身也提供了图片比较的功能,可以进行验证操作。我觉得就针对 Android 系统上的操作而言,没有其他比 MR 更方便快捷的。
至于有没有实际作用,看你需要实现什么程度,需要做到什么事情。比如:http://testerhome.com/topics/917 ,这是包含了一个比较完整的思路。

PS:使用过录制,真不如我要什么坐标,就去拿什么坐标来得快。

支持,一直不知道该怎么学习 Monkeyrunner,谢谢提供这么好的东西。请问下楼主是看的官网的文档学习的吗?

我在学 Robotium,这个用坐标的,换个手机就麻烦了。。

#8 楼 @chin 嗯,应该说换了 个分辨率就麻烦了。这一直是 monkeyrunner 的劣势,所以我一般都用 monkeyrunner 来做一些常规的操作,而不是录屏

device.startActivity(‘com.xx.xxx/.activity.xxxActivity’)
这一行后 app 没启动是什么原因啊?

大东 #11 · 2014年10月30日 Author

#10 楼 @blue_momo2009
确保你的包名和 activity 名字写对了。

大东 #12 · 2014年10月30日 Author

#7 楼 @jerome 嗯,对着文档稍微摸索一下很快就上手了这种。

141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] Error se
nding touch event: 645 120 DOWN_AND_UP
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] java.net.
SocketException: Software caused connection abort: socket write error
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at java.
net.SocketOutputStream.socketWrite0(Native Method)
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at java.
net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at java.
net.SocketOutputStream.write(SocketOutputStream.java:153)
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at sun.n
io.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at sun.n
io.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at sun.n
io.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at sun.n
io.cs.StreamEncoder.flush(StreamEncoder.java:141)
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at java.
io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at java.
io.BufferedWriter.flush(BufferedWriter.java:254)
141030 16:58:26.528:S [main] [com.android.chimpchat.adb.AdbChimpDevice] at com.a
ndroid.chimpchat.ChimpManager.sendMonkeyEventAndGetResponse(ChimpManager.java:18
7)
同样的代码有时候可以执行成功,有时候就会这种错误

大东 #14 · 2014年10月30日 Author

#13 楼 @blue_momo2009 有给足够的等待时间么

#11 楼 @anikikun 用 log 找了下,发现启动时是 ‘com.xx.xxx/.xxxActivity’,没有前面的.activity。去掉这个后就可以启动了

monkeyrunner test.py 回车后完全没反应啊!

大东 #17 · 2014年10月31日 Author

#16 楼 @blue_momo2009 怎么个没反应法?

#17 楼 @anikikun 就是回车后只有一个光标在闪了,等了很久都没反应,只能用 ctrl C 终止

学习下,自己操作练习下

device.startActivity(‘com.xx.xxx/.activity.xxxActivity’)

这里的 XXX 要填什么?

大东 #21 · 2014年12月23日 Author

#20 楼 @paris_love_u 说得很明白啊,启动一个应用,其中 (‘com.xx.xxx/.activity.xxxActivity’) 是 APP 的包名和启动 Activity

如果出现了异常咋处理呢,比如要点击某个坐标,此时来了个电话,把原先的界面覆盖了,那之后的操作不就全部点不了吗

大东 #23 · 2015年01月19日 Author

#22 楼 @harryguo MonkeyRunner 不知道你的电话是否进来了,它会继续进行点击等操作..那么如果受到干扰,会在你下一个图片对比的地方报错就是了。

#23 楼 @anikikun monkeyRunner 只能通过坐标来点击某个控件吧。。如果是这样的话,那通过 monkeyRunner 主要是为了发现什么类型的 bug 呢,是不是只有稳定性 bug,比如引起程序 crash 的 bug

大东 #25 · 2015年01月20日 Author

#24 楼 @harryguo 嗯,MR 不适合拿来测 APP。一般拿来做系统应用的测试多一点,恒温表示用得多。而且我拿 MonkeyRunner 都是做一些过渠道包等频繁安装卸载的工作

非常感谢 不过 命令行运行没问题 sublime 运行 提示 No module named 'com' 网上搜了也没能解决。。。。

大东 #27 · 2015年06月19日 Author

#26 楼 @ping_sky 可以贴出你的代码看看?确认是否使用 monkeyrunner 去执行,不是用 Python

为什么我单独在 cmd 格式下都可以运行成功,可是当编辑成文件例如把代码放到 test.py 中,执行 monkeyrunner test.py 的时候总是提示 syntaxerror:mismatched input‘test’ expecting NEWLINE,我是把 test.py 放在 sdk 下的 tools 文件夹的

才开始学习 monkeyrunner,已尝试完成应用登录操作,后续继续学习😀 😀

入门了,点赞

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册