使用 MonkeyRunner 进行自动化测试

这篇文章记录一下 Monkeyrunner 的使用。因为本人也是刚接触,如有错漏,请指正。

准备

  1. python 基础。

    说是基础,会点基本用法循环条件就差不多了。有语言基础的话还是很快入门的。我当时是看菜鸟教程,配一下环境就行了。

  2. JDK、SDK 环境

  3. monkeyrunner

    monkeyrunner 是 SDK.tools 下的一个 .bat 文件,是 Android 自带的工具。配合 py 脚本可以模拟手机点击、拖拽、功能键等的实现,然后可以观察截图自己比较。只要你事先写好脚本,一系列动作,他就能模拟运行,达到自动化测试的目的。

    如果目录下没有,可能你是AS下的SDK,那么应该在 tools.bin 目录下。

monkeyrunner 方法

导入需要的模块

主要包括三个模块

1、MonkeyRunner:这个类提供了用于连接monkeyrunner和设备或模拟器的方法,它还提供了用于创建用户界面显示提供了方法。

2、MonkeyDevice:代表一个设备或模拟器。这个类为安装和卸载包、开启Activity、发送按键和触摸事件、运行测试包等提供了方法。

3、MonkeyImage:这个类提供了捕捉屏幕的方法。这个类为截图、将位图转换成各种格式、对比两个MonkeyImage对象、将image保存到文件等提供了方法。

#引入模块
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
#或者给模块起别名,引用的时候就不用写全称。
#但是引用了别名就不能使用原来的名字了,否则报错
import sys
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner import MonkeyDevice as md
from com.android.monkeyrunner import MonkeyImage as mi
#比如连接设备或模拟器,起了以上别名后,命令应该如下:
device=mr.waitForConnection() 

启动活动

启动活动要先连接设备,就是上面 waitForConnection() 的代码。然后就是要调用

device.startActivity(component="<packageName>/<packageName>.<activityName>")
#或者
device.startActivity(component="<packageName>/.<activityName>")`

自己开发的可以去查看 Manifest 文件,不是自己开发的软件,我查了一下。用了同是 SDK.tools 下的 Android 自带的工具:hierarchyviewer.bat 或者用重签名工具,在这里不累述了,一查就知道。

得到包名和活动名,你就可以进行自动化测试了。

方法

点击

#在指定位置发送触摸事件 
#device.touch(x,y,触摸事件类型)
#x,y的单位为像素
#触摸事件类型,请见下文中Findyou对device.press描述

device.touch(520,520,'DOWN_AND_UP')

发送到指定键的一个关键事件


#device.press(参数1:键码,参数2:触摸事件类型)
#参数1:见android.view.KeyEvent
#参数2,如有TouchPressType()返回的类型-触摸事件类型,有三种。
#1、DOWN 发送一个DOWN事件。指定DOWN事件类型发送到设备,对应的按一个键或触摸屏幕上。
#2、UP 发送一个UP事件。指定UP事件类型发送到设备,对应释放一个键或从屏幕上抬起。
#3、DOWN_AND_UP 发送一个DOWN事件,然后一个UP事件。对应于输入键或点击屏幕。

#以上三种事件做为press()参数或touch()参数

#按下HOME键
device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP) 
#按下BACK键
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP) 
#按下下导航键
device.press('KEYCODE_DPAD_DOWN',MonkeyDevice.DOWN_AND_UP) 
#按下上导航键
device.press('KEYCODE_DPAD_UP',MonkeyDevice.DOWN_AND_UP) 
#按下OK键
device.press('KEYCODE_DPAD_CENTER',MonkeyDevice.DOWN_AND_UP) 

按下HOME键 device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)

home键 KEYCODE_HOME

back键 KEYCODE_BACK

send键 KEYCODE_CALL

上音量键 KEYCODE_VOLUME_UP

下音量键 KEYCODE_VOLUME_DOWN

power键 KEYCODE_POWER

camera键 KEYCODE_CAMERA

menu键 KEYCODE_MENU

更多:http://developer.android.com/reference/android/view/KeyEvent.html

键盘输入

#字符串发送到键盘 
#device.type('字符串')
device.type('Findyou')

滑动

#模拟滑动
#device.drag(X,Y,D,S)
#X 开始坐标
#Y 结束坐标
#D 拖动持续时间(以秒为单位),默认1.0秒
#S 插值点时要采取的步骤。默认值是10
device.drag((100,1053),(520,1053),0.1,10)

截屏

result=device.takeSnapshot()
#返回一个MonkeyImage对象(点阵图包装),我们可以用以下命令将图保存到文件
result.writeToFile('E:\\JAVA\\monkeyrunner\\Test1\\Test1_001.png','png')
#<path>\\<fileName>.png

实例

  1. 把你的 py 脚本放到 monkeyrunner 所在的目录

  2. 命令行进入该目录,输入命令:monkeyrunner.bat test.py

    testMonkeyrunner.png

    测试输出成功。

    如果提示monkeyrunner不是内部或外部命令,请回去配置环境变量。

  3. 手机获取模拟器打开开发者选项的指针位置功能,方便获取坐标。然后可以开始编写py脚本了。

    # -*- coding: utf-8 -*- 
    # 上面那句是为了支持中文注释。文件请保存 utf-8 格式免得出问题
    #引入模块
    from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
    import time
    import os
    
    #连接设备
    device=MonkeyRunner.waitForConnection() 
    #启动Activity(此处为启动模拟器的浏览器)
    mPackageName = "com.android.browser"
    mActivityName = "com.android.browser.BrowserActivity"
    mRunComponent = mPackageName + "/" + mActivityName
    
    #获取时间
    def getNowTimeUnderline():
        return time.strftime("_%H_%M_%S",time.localtime(time.time()))
     
    #获取日期
    def getToday():
        return time.strftime("%Y_%m_%d",time.localtime(time.time()))
    
    #截图并保存
    def shotPhoto():
     newimage = device.takeSnapshot()
     newimage.writeToFile ("ImageFile/" + getToday() + getNowTimeUnderline() + ".png" , "png")
     time.sleep(1.0)
    
    #创建存储截图的文件夹
    def mkdirPath(path):
        if not os.path.exists(path):
            os.mkdir(path)
    
    #创建文件夹
    mkdirPath("ImageFile")
    
    #启动应用
    device.startActivity(component =  mRunComponent)
    time.sleep(3.0)#启动Acticity的时间
    
    for slipCount in range(1,3):#迭代1到3之间,相当于循环两次。
     device.drag( (385,1032), (385,700), 1.0, 10 )#向上滑动
     time.sleep(2.0)
     shotPhoto()
    
    device.touch(399, 73, "DOWN_AND_UP")#单击该坐标(网址输入栏)
    time.sleep(1.0)
    shotPhoto()
    
    device.type('https://shlurenjia.github.io')#键盘输入网址,这是我的博客
    time.sleep(1.0)
    device.press('KEYCODE_ENTER', MonkeyDevice.DOWN_AND_UP)#enter 确认跳转
    time.sleep(5.0)
    shotPhoto()
    
    device.touch(325, 357, "DOWN_AND_UP")#点击第一篇文章
    time.sleep(1.0)
    shotPhoto()
    
    device.press('KEYCODE_BACK','DOWN_AND_UP') #第二个参数也可以这样简写
    time.sleep(2.0)
    shotPhoto()
    device.press('KEYCODE_BACK','DOWN_AND_UP') 
    time.sleep(2.0)
    shotPhoto()
    

    截图可以让你挂完脚本之后自己比对效果。每个动作后面加上 sleep 因为要考虑到手机响应的时间。不然脚本执行下去很容易报错 Error sending xxx event

    效果

    由于加了sleep,所以看起来比较慢

    自动化测试.gif

    截图文件:

    截图.png

8-17更新:
使用 monkeyrunner 进行尽管逻辑更直观,但是分辨率适配实在太烦人了。由于本人当时做的是输入法的测试,会涉及到操作键盘。而安卓不同分辨率就算了,导航栏还会影响布局,导致坐标偏移。所以感觉不太合适。

UIautomoter是通过ID来进行点击等操作的,但是貌似真机商用机大多没有开启view Server 所以不太支持。

另外还有个谷歌推出的框架:Espresso 。本人不是专职测试,所以只是大概看了一下,感觉可操性很强,有兴趣的可以去研究下


PS:有兴趣的可以关注我的公众号,不定期发本人学习 Android 过程中的知识与日常


我的Android成长日常.jpg

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容