android测试之——mokeyrunner上(二)

以下是本人原创,如若转载和使用请注明转载地址。本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址


感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址,并且请尊重劳动成果,谢谢!

mokeyrunner

最近导师要求做ppt讲解什么是mokeyrunner,从网上寻找了些案例及其mokeyrunner的使用教程,下面详细介绍什么是mokeyrunner。

一、什么是monkeyrunner

monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器。通过monkeyrunner,您可以写出一个Python程序去安装一个Android应用程序或测试包,运行它,向它发送模拟击键,截取它的用户界面图片,并将截图存储于工作站上。monkeyrunner工具的主要设计目的是用于测试功能/框架水平上的应用程序和设备,或用于运行单元测试套件,但您当然也可以将其用于其它目的。

二、monkeyrunner工具同Monkey工具的差别

Monkey:

Monkey工具直接运行在设备或模拟器的adb shell中,生成用户或系统的伪随机事件流。

monkeyrunner:

monkeyrunner工具则是在工作站上通过API定义的特定命令和事件控制设备或模拟器。

三、monkeyrunner的测试类型

1、多设备控制:monkeyrunner API可以跨多个设备或模拟器实施测试套件。您可以在同一时间接上所有的设备或一次启动全部模拟器(或统统一起),依据程序依次连接到每一个,然后运行一个或多个测试。您也可以用程序启动一个配置好的模拟器,运行一个或多个测试,然后关闭模拟器。

2、 功能测试: monkeyrunner可以为一个应用自动贯彻一次功能测试。您提供按键或触摸事件的输入数值,然后观察输出结果的截屏。

3、 回归测试:monkeyrunner可以运行某个应用,并将其结果截屏与既定已知正确的结果截屏相比较,以此测试应用的稳定性。

4、 可扩展的自动化:由于monkeyrunner是一个API工具包,您可以基于Python模块和程序开发一整套系统,以此来控制Android设备。除了使用monkeyrunner API之外,您还可以使用标准的Python os和subprocess模块来调用Android Debug Bridge这样的Android工具。

四、monkeyrunner API

该monkeyrunner API被包含在包中的三个模块 com.android.monkeyrunner

  • MonkeyRunner:一类为monkeyrunner程序的实用工具方法。这个类提供了用于连接monkeyrunner至设备或模拟器的方法。它还提供了用于创建用户界面的monkeyrunner程序以及显示内置帮助的方法。
  • MonkeyDevice:代表一个设备或模拟器。这个类提供了安装和卸载程序包,启动一个活动,并发送键盘或触摸事件到应用程序的方法。您也可以使用这个类来运行测试包。
  • MonkeyImage:表示一个屏幕捕捉的图像。这个类提供了用于捕捉画面,转换成位图图像,以各种不同的格式,比较两个MonkeyImage对象,写一个图像文件的方法。



mokeyrunner和python的配合使用

一:录制和播放脚本

  1. #Usage: monkeyrunner recorder.py
  2. #recorder.py  http://mirror.yongbok.net/linux/android/repository/platform/sdk/monkeyrunner/scripts/monkey_recorder.py
  3. from com.android.monkeyrunner import MonkeyRunner as mr
  4. from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder
  5. device = mr.waitForConnection()
  6. recorder.start(device)
  7. #END recorder.py
  8. #Press ExportAction to save recorded scrip to a file
  9. #Example of result:
  10. #PRESS|{'name':'MENU','type':'downAndUp',}
  11. #TOUCH|{'x':190,'y':195,'type':'downAndUp',}
  12. #TYPE|{'message':'',}
  13. 将以上代码保存为recorder.py后]
  14. fp = open(file, 'r')
  15. device = MonkeyRunner.waitForConnection()
  16. process_file(fp, device)
  17. fp.close();
  18. if __name__ == '__main__':
  19. main()

将以上代码保存为playback.py后在cmd窗口中执行命令monkeyrunner playback.py "myscript"  即可播放录制的脚本“myscript”。

二、mokeyrunner基本命令

1. #导入模块;
    from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage
2. #连接当前设备,并返回一个MonkeyDevice对象;
    device = MonkeyRunner.waitForConnection()
    if not device:
        print "Please connect a device to start!"
    else:
        print "Start "
   
3. #安装Android包,注意,此方法返回的返回值为boolean,由此可以判断安装过程是否正常 ;
    device.installPackage('myproject/bin/MyApplication.apk')
    device.removePackage ('com.example.android.notepad')
    print ('卸载成功')
    device.installPackage('ApiDemos.apk')
    print ('安装成功')
4. #启动一个Activity;
    device.startActivity
    (component='com.android.htccontacts/com.android.htccontacts.ContactsTabActivity')
5. #截图;
    result = device.takeSnapshot()
    result.writeToFile('C:\\Users\\Martin\\Desktop\\test.png','png')
6. #时延(秒);
    MonkeyRunner.sleep(3)
7. #滑动屏幕;
    for i in range(1,70):

        device.drag((250,850),(250,110),0.1,10)

     //开始,结束,持续时间,步骤  

       device.drag((250,110),(250,850),0.1,10)
   MonkeyRunner.sleep(1)
8. #触击屏幕;
    device.touch(507,72,"DOWN_AND_UP")
9. #执行adb shell命令;
    device.shell("input text goup01")
按下HOME键     device.press('KEYCODE_HOME','DOWN_AND_UP')
按下BACK键     device.press('KEYCODE_BACK','DOWN_AND_UP')
按下下导航键     device.press('KEYCODE_DPAD_DOWN','DOWN_AND_UP')
按下上导航键     device.press('KEYCODE_DPAD_UP','DOWN_AND_UP')
按下OK键     
device.press('KEYCODE_DPAD_CENTER','DOWN_AND_UP')
        
相应的按键对应的名称如下:
home键:KEYCODE_HOME
back键:KEYCODE_BACK
send键:KEYCODE_CALL
end键:KEYCODE_ENDCALL
上导航键:KEYCODE_DPAD_UP
下导航键:KEYCODE_DPAD_DOWN
左导航:KEYCODE_DPAD_LEFT
右导航键:KEYCODE_DPAD_RIGHT
ok键:KEYCODE_DPAD_CENTER
上音量键:KEYCODE_VOLUME_UP
下音量键:KEYCODE_VOLUME_DOWN
power键:KEYCODE_POWER
camera键:KEYCODE_CAMERA
menu键:KEYCODE_MENU

三、monkeyrunner之使用ID

monkeyrunner录制的脚本点击事件等使用的是坐标,在不同尺寸的平板上测试该脚本不通用。下面介绍通过调用应用软件的ID进行操作软件,此操作需要用到以下类和工具:

  1、安卓自有目录sdk\tools\hierarchyviewer.bat工具可以用来查看应用程序的ID。

  操作hierarchyviewer.bat工具步骤:

  (1)、启动安卓模拟器或连接实机,打开需要查看ID的软件界面。此处以google搜索界面为例。然后双击打开hierarchyviewer.bat,显示搜索界面的activity,即下图左侧被选中的项,表示搜索界面的完整包名。

android测试之——mokeyrunner上(二)

  (2)点击Load View Hierarchy按钮,展现该搜索界面的层级图。选中指定的控件,查看ID名称。

android测试之——mokeyrunner上(二)

  在属性显示区域可以看到各个控件所处的坐标位置,以及可以查看模拟器上任务栏的高度,这些信息可以用于坐标计算中。

  2、通过EasyMonkeyDevice类和By类来调用控件ID。

  一些常用控件的写法如下:

  (1)输入框的ID写法:

  easy_device.type(By.id('id/name_text),'zhangsan')

  (2)复选框/单选/按钮的ID写法:

  easy_device.touch(By.id('id/login_button'),MonkeyDevice.DOWN_AND_UP)

  (3)当两个ID名称相同时,可以使用层级进行定位

  easy_device.touch(By.id('id/parent_button'),MonkeyDevice.DOWN_AND_UP,By.id('id/current_button'),MonkeyDevice.DOWN_AND_UP)

  通过ID进行计算器操作示例calculator.py:

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
from com.android.monkeyrunner.easy import EasyMonkeyDevice
from com.android.monkeyrunner.easy import By
from com.android.chimpchat.hierarchyviewer import HierarchyViewer
from com.android.hierarchyviewerlib.device import ViewNode
device = MonkeyRunner.waitForConnection()
package = 'com.android.calculator2'
activity = 'com.android.calculator2.Calculator'
runComponent = package + '/' + activity
device.startActivity(component=runComponent)
MonkeyRunner.sleep(3.0)
easy_device = EasyMonkeyDevice(device)  #init easymonkeydevice object must start activity at first.Because the init method
will getHierarchyViewer();
easy_device.touch(By.id('id/digit7'),MonkeyDevice.DOWN_AND_UP)
easy_device.touch(By.id('id/mul'),MonkeyDevice.DOWN_AND_UP)
easy_device.touch(By.id('id/digit8'),MonkeyDevice.DOWN_AND_UP)
easy_device.touch(By.id('id/equal'),MonkeyDevice.DOWN_AND_UP)
MonkeyRunner.sleep(1.0)
pic = device.takeSnapshot()
pic.writeToFile('D:\\monkeyrunner\\result.png','png')
print 'test finished!'

  3、运行文件模拟计算7*8=56,生成result.png。monkeyrunner   calculator.py

android测试之——mokeyrunner上(二)

  用ID进行参数差不多都是这个思路。但是对于列表、或者弹出框则无法直接通过点击ID操作成功,需要计算ID的坐标。


上一篇:hdu 4588 Count The Carries


下一篇:Linux网络编程之select、poll、epoll的比较,以及epoll的水平触发(LT)和边缘触发(ET)