使用 MonkeyRunner 进行自动化测试

发表于:2017-7-25 11:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:白帽子耗子    来源:51Testing软件测试网采编

  这篇文章记录一下 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 sysfrom com.android.monkeyrunner import MonkeyRunner as mrfrom com.android.monkeyrunner import MonkeyDevice as mdfrom 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,MonkeyImageimport timeimport 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
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号