• MonkeyRunner自动化测试


    简介

    1、monkeyrunner是Android sdk提供的可以在Android代码之外控制Android设备和模拟器的自动化工具,通过monkeyrunner可以写成一个Python程序实现对Android App的安装、运行、点击等一系列自动化操作。

    2、monkeyrunner的三大模块分别为:

    • MonkeyRunner:这个类提供了用于连接monkeyrunner和设备或模拟器的方法,它还提供了用于创建用户界面显示的方法。
    • MonkeyDevice:代表一个设备或模拟器。这个类为安装和卸载包、开启Activity、发送按键和触摸事件、运行测试包等提供了方法。
    • MonkeyImage:这个类提供了捕捉屏幕的方法。这个类为截图、将位图转换成各种格式、对比两个MonkeyImage对象、将image保存到文件等提供了方法。

    3、monkeyrunner与monkey的区别:

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

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

     

    两种运行方式

    1、命令行直接在终端命令行执行

    (1)配置好monkyrunner路径(./sdk/tools)之后,打开cmd,输入monkeyrunner,回车    ##也可以直接到tools目录下执行命令

    (2)输入from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,回车

    (3)输入device=MonkeyRunner.waitForConnection(),回车

    (4)输入其他操作命令

     

     2、写成pyhton脚本

    1 from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
    2 device=MonkeyRunner.waitForConnection()
    3 ...

    执行方式:monkeyrunner t.py

     

    常用操作

    • MonkeyRunner方法

    (1)执行当前脚本弹出一个警示对话框,用户关闭对话框后脚本才结束。

    用法:MonkeyRunner.alert(message,title,okTitle)

    message:会话弹出的内容

    title:会话标题,默认为alert

    okTitle:会话确认按钮,默认为ok

    例如:MonkeyRunner.alert("hello")

     

    (2)显示一个对话框,让用户从一列选项中选择一个单一的选项。

    用法:MonkeyRunner.choice(message,choices,title)

    message:显示在对话框中的提示信息。

    choices:一个迭代的包含一系列选择的python类型

    title:对话框的标题,默认为input

    例如:MonkeyRunner.choice("choice a sex",["man","women"])

     

    (3)显示一个接受的对话框,用户点击对话按钮中的一个按键结束。

    用法:MonkeyRunner.input(message,initialValue,title,okTitle,cancelTitle)

    message:对话框显示的信息。

    initialValue:提供给用户的初始化值,默认为空字符串。

    title:对话标题,默认为input。

    okTitle:确认按键

    cancelTitle:取消按键

    例如:MonkeyRunner.input("enter text")

     

    (4)暂停当前运行进程指定的时间。

    用法:MonkeyRunner.sleep(seconds)

    seconds:暂停时间

    例如:MonkeyRunner.sleep(3)

    (5)等待电脑连接到设备。

    用法:MonkeyRunner.waitForConnection(timeout,deviceId)

    timeout:等待的时间,默认为无限期

    deviceId:指定设备名称的一个规定表达式

    例如:com.android.monkeyrunner.MonkeyRunner.waitForConnection(5,'4d002f05f6253037')

    • MonkeyDevice方法

    (1)在设备屏幕上模拟拖曳。

    用法:MonkeyDevice.drag(start,end,duration,steps)

    start:拖曳开始坐标

    end:拖曳结束坐标点

    duration:持续时间 (default is 1.0 seconds)

    steps:拖曳步骤(default is 10)

    例如:device.drag((300,800),(800,800),0.1,10)

    (2)在设备上安装应用包,如果该包已经存在,那么会替掉原来的。

    用法:MonkeyDevice.intallPackage(path)

    path:安装包在本地的路径已经文件名。

    例如:device.installPackage(‘.../ex_v5.09_svn141922_200_staging_20141107.apk')

    (3)给指定key发送一个key事件。

    用法:MonkeyDevice.press(name,type)

    name:keycode

    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

    type:触摸事件类型,如DOWN_AND_UP。

    1、DOWN 发送一个DOWN事件。指定DOWN事件类型发送到设备,对应的按一个键或触摸屏幕上。

    2、UP 发送一个UP事件。指定UP事件类型发送到设备,对应释放一个键或从屏幕上抬起。

    3、DOWN_AND_UP 发送一个DOWN事件,然后一个UP事件。对应于输入键或点击屏幕。

    例如:device.press('KEYCODE_MENU','DOWN_AND_UP')

    (4)重启指定设备进入指定加载模式。

    用法:MonkeyDevice.reboot(into)

    into:bootloader, recovery, or None

    例如:device.reboot()

    (5)从设备删除指定的包,包括相关的数据已经缓存。

    用法:MonkeyDevice.removePackage(package)

    package:指定要删除的包名

    例如:device.removePackage("com.gau.go.launcherex")

    (6)执行adb shell命令并返回结果。

    用法:MonkeyDevice.shell(cmd)

    cmd:要执行的adb shell命令

    例如:device.shell("am force-stop packageName")

    (7)在设备上开始一个活动

    用法:MonkeyDevice.startActivity(uri,action,data,mimetype,categories,extras,component,flags)

    component:启动的Activity

    例如:device.startActivity(component="com.gau.go.launcherex/com.jiubang.golauncher.GOLauncherFacade")

    (8)获取设备的屏幕缓存

    用法:MonkeyDevice.takeSnapshot()

    例如:device.takeSnapshot()

    (9)对指定位置发送一个触摸事件

    用法:MonkeyDevice.touch(x,y,type)

    x:横坐标

    y:纵坐标

    type:触摸事件类型。

    例如:device.touch(422,1084,'DOWN_AND_UP')

    (10)从键盘键入指定的字符串

    用法:MonkeyDevice.type(message)

    message:发送到键盘的字符串

    例如:device.type('abc')

    (11)唤醒设备的屏幕

    用法:MonkeyDevice.wake()

    例如:device.wake()

    • MonkeyImage方法

    (1)将MonkeyImage对象写入一个文件

    用法:MonkeyImage.writeToFile(path,format)

    path:输入的文件名,可选择的包含路径

    format:目标格式,默认为png。

    例如:result = device.takeSnapshot()

    result.writeToFile('/home/lilinhui/Test.png','png')

    (2)对比当前的截图和之前的截图

    用法:MonkeyImage.sameAs(other,percent)

    other:其他MonkeyImage对象

    percent:百分比,取值为0.0-1.0

    例如:result = device.takeSnapshot()

    result1 = com.android.monkeyrunner.MonkeyRunner.loadImageFromFile('/home/lilinhui/Test.png')

    print (result.sameAs(result1,0.9))

    (3)复制一个图片的矩形区域。monkeyrunner执行测试时使用.takeSnapshot()截图,默认截取整个屏幕,包含了系统的状态栏。真实手机状态栏中包含如电量/信号量/消息提示等变量,使用.sameAs()对比整个屏幕的截图时就很容易出现错误。而使用.getSubImage()获得局部图像,然后再进行对比,就减少了monkeyrunner执行结果出错的概率。

    用法:MonkeyImage.getSubImage(rect)

    rect:A tuple (x, y, w, h),x,y指定矩形区域的左上角,w为矩形宽,h为矩形高

    例如:

    #第一截图并获取局部图像

    result = device.takeSnapshot()

    result_static = result.getSubImage((200,400,200,400))

    result_static.writeToFile('/home/lilinhui/Test.png','png')

    #第二截图并获取相同的局部图像

    picture = com.android.monkeyrunner.MonkeyRunner.loadImageFromFile('/home/lilinhui/Test1.png')

    result_static2 = picture.getSubImage((200,400,200,400))

    result_static2.writeToFile('/home/lilinhui/Test2.png','png')

    #使用sameAs()对比两张图片,并输出对比结果True或False

    print (result_static.sameAs(result_static2,1.0))

    相关博客:http://284772894.iteye.com/blog/2166874

  • 相关阅读:
    android 的通知管理
    java 反射机制
    java基础知识梳理
    spring 知识梳理
    Orange's_1_win7下搭建环境
    编写安全代码:死循环
    我的kindle书单
    [更新Github地址]python学习,自己写了个简单聊天工具mychat
    给VIM和Terminal配色:Solarized
    Hive学习之路 (八)Hive中文乱码
  • 原文地址:https://www.cnblogs.com/mgzc-1508873480/p/7910433.html
一二三 - 开发者的网上家园