monkeyrunner的功能脚本编写完成之后,我们就需要对结果进行判断,判断结果是否为我们预期的结果值。下面我们主要讲述2种方式判断结果。

方式一、monkeyrunner截图对比

这是monkeyrunner非常有特色的一种方式,用于通过设备屏幕前后的对比来获取对执行结果的判断。使用.sameAs()对比截图,获得测试结果。

  1. #连接设备
  2. device = MonkeyRunner.waitForConnection()
  3. #当前页面截图
  4. image = device.takeSnapshot()
  5. #去文件中找到我们要对比的正确的图片(这里比如存储在F盘,命名为result.png),与该截图image进行对比
  6. result = MonkeyRunner.loadImageFromFile('F:\\result.png')
  7. #判断图片相识度是否是90%(这个比值根据需求来定)
  8. if image.sameAs(result,0.9):
  9. print "图片对比成功"
  10. else:
  11. print "图片对比失败"

这种方式虽然比较常见,但是如果屏幕分辨率一旦改变,就使得对比结果无效,代码可移植性很低,不稳定。

下面推荐一种通过控件id或文字判断结果的方式。

方式二、monkeyrunner文字对比

1.EasyMonkeyDevice

这种文字对比方式,主要是利用EasyMonkeyDevice中的exists(By selector)和getText(By selector)两种方法来判断。关于EasyMonkeyDevice,后续有文章会专门介绍其所有的API。

核心代码如下(代码中的packageName和activity要换成自己需要的包名和活动名):

  1. #coding:utf-8
  2. from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
  3. #提供了根据ID进行访问
  4. from com.android.monkeyrunner.easy import EasyMonkeyDevice
  5. #根据ID返回PyObject的方法
  6. from com.android.monkeyrunner.easy import By
  7. #连接设备
  8. device = MonkeyRunner.waitForConnection()
  9. #packageName、activity根据自己的需求获取,启动app
  10. componentName = packageName + '/' + activity
  11. device.startActivity(component = componentName)
  12. #必须在activity启动之后
  13. easy_device = EasyMonkeyDevice(device)
  14. #判断结果页面中是否有特定控件ID:如果有,则获取该控件上的文本;若没有,则直接出对比结果
  15. if easy_device.exists(By.id('id/btn_loginout')) == True:
  16. text = easy_device.getText(By.id('id/btn_loginout'))
  17. if text.encode('utf-8') == '注销':
  18. print "login success"
  19. else:
  20. print "login failed"
  21. else:
  22. print "login failed"

注:控件text需要具有唯一性。

2.HierarchyViewer

这个方法的API和EasyMonkeyDevice类似,主要用到findViewById和getText来判断。关于HierarchyViewer各API,后续有文章介绍。

由于方法和EasyMonkeyDevice类似,这里不再赘述。核心代码如下:

  1. device=MonkeyRunner.waitForConnection()
  2. hierarchy_viewer = device.getHierarchyViewer()
  3. login_button = hierarchy_viewer.findViewById('id/btn_loginout')
  4. text = hierarchy_viewer.getText(login_button)
  5. print text.encode('utf-8')

最后,再补充一句,还可以根据EasyMonkeyDevice的getFocusedWindowId接口来获取当前页面的窗口ID,即activity,或者,根据HierarchyViewer的getFocusedWindowName来获取当前页面的packageName/activityName。从而方便monkeyrunner脚本中各页面的切换。

注:每个窗口的activity并不是唯一的,所以当activity相同时,需要activity的Fragment来判断当前页面。(判断方法后续讲述,主要用sdk/tools/uiautomatorviewer)

核心代码如下,欢迎拍砖:

  1. #获取当前页面窗口ID
    winId = easy_device.getFocusedWindowId()
  2. print winId.encode('utf-8')

monkeyrunner之测试结果判断(八)的更多相关文章

  1. Kali Linux Web 渗透测试视频教程— 第八课 nessus

    Kali Linux Web 渗透测试视频教程— 第八课 nessus 文/玄魂 视频课程地址:http://edu.51cto.com/course/course_id-1887.html 目录 n ...

  2. shell编程之测试和判断

    一.测试 程序运行中经常需要根据实际情况来运行特定的命令或代码段.比如判断某个文件或目录是否存在,如果文件或目录不存在,可能首先创建文件或目录.举例说,要判断文件/var/log/mlocate文件是 ...

  3. 从零自学Java-5.使用条件测试进行判断

    1.使用if语句进行最基本的条件测试:2.测试一个值大于还是小于另一个值:3.测试两个值是否相等:4.使用与if语句对应的else语句:5.组合多个条件测试:6.使用switch语句进行复杂的条件测试 ...

  4. Java 程序测试_判断语句

    package test; public class Condition_Phase { public static void main (String[] args) { //The Traditi ...

  5. 【2016北京集训测试赛(八)】 crash的数列 (思考题)

    Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...

  6. Brup Suite 渗透测试笔记(八)

    续上次笔记 1.之前记到payload类型的用户名生成器,(username  generator).这种类型发payload只要用于用户名和email账号的自动生成. 2.ECB加密块洗牌(ECB ...

  7. 2016北京集训测试赛(八)Problem C: 直径

    Solution 一个定理: 把两棵树用一条边练成一棵树后, 树的直径在原来两棵树的四个直径端点中产生. 放到这一题, 我们通过DP先求出大树中以每个点为根的子树中的直径, 再取每棵小树中与其他树有连 ...

  8. 渗透测试学习 十八、 XSS跨站脚本漏洞详解 续

    XSS平台搭建 ISS+zkeysphp 首先在IIS中新建一个网站,详细过程可以看我之前写搭环境的文章 (下面的写入选项不需要选中) 安装ZKEYS PHP 修改数据库配置 用户名:root 密码: ...

  9. Android 测试 之MonkeyRunner

    一.什么是MonkeyRunner monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器.通过monkeyrunner,您可以 ...

随机推荐

  1. globalization与全球化

    本配置节是关于配置应用程序的全球化设置. <globalization <!--以下两个特性默认编码为 UTF-8,该编码在 Machine.config 文件(在安装 .NET Fram ...

  2. JFreechart在linux下不显示及中文乱码问题

    一.使用JFreeChart建的报表,在window下能正常显示,但是放到linux下就报错,而且有时候会把tomcat挂掉, 原因是jfreechart的在linux系统中需要访问java awt库 ...

  3. 2016 ICPC大连站---F题 Detachment

    题意:输入一个x,将x拆分成一些小的数(这些数不能相同,即x=a1+a2+......   ai!=aj when i!=j),然后这些数相乘得到一个成积(s=a1*a2*......),求最大的乘积 ...

  4. python基础之面对对象

    Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...

  5. php实现设计模式之 抽象工厂模式

    <?php /*抽象工厂模式:提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类 * 创建型模式 */ //抽象小米工厂,能制造小米一,小米二 abstract class mi ...

  6. [转载]C#使用Interlocked进行原子操作

    原文链接:王旭博客 » C# 使用Interlocked进行原子操作 什么是原子操作? 原子(atom)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operat ...

  7. JS 预解释相关理解

    1.JS中的内存空间分为两种:栈内存.堆内存 栈内存:提供JS代码执行的环境;存储基本数据类型的值; ->全局作用域或者私有的作用域其实都是栈内存 堆内存:存储引用数据类型的值(对象是把属性名和 ...

  8. 低调奢华 CSS3 transform-style 3D旋转

    点击这里查看效果:http://keleyi.com/a/bjad/s89uo4t1.htm 效果图: CSS3 transform-style 属性 以下是代码: <!DOCTYPE html ...

  9. javascript是判断对象是否是数组

    JS中的数据类型: 2大类 原始类型:值保存在变量本地的数据类型 5种:Number String Boolean undefined null Number:8bytes 舍入误差-->四舍五 ...

  10. jQuery实用小技巧--输入框文字获取和失去焦点

    <input id="txt" class="text1"  type="text" />   <script src=& ...