第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写《深入理解 MonkeyRunner》书籍“。但因为诸多原因,没有如愿。所以这里把草稿分享出来,所以错误在所难免。有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息。

在上一节的第一个“增加日记”的示例中,我们并没有看到日记是否真的增加成功了,也就是说当时并没有进行结果比较。其实在MonkeyRunner框架中,测试结果的比较往往都是通过截屏比对来完成的。而截屏比对相关的方法主要是由MonkeyImage这个类来实现的,但截屏这个动作确是由MonkeyDevice提供的takeSnapshot这个方法来达成的。所以这一节我们主要就是去熟悉截屏比对相关的测试代码编写的基础知识。

开始之前我们先看下这一节我们会用到的截屏对比的相关方法已经它们所在的类。

表3-3-1 示例代码所用关键方法列表

下面我们就通过一个示例代码来看下应该如何运用这些方法来对测试结果进行比较。该示例延续上一节“新增日记”的第7步新增加一个日记开始,然后会对该日记的内容进行修改,最后会比较修改前后的两个对日记内容的截屏看是否是一致的。因为预期是不一致的,所以如果一致的话就代表出错了,这时就会把修改前后两张图片保存到桌面以便查看。

我们先看一下在上一节“新增日记”的第七步完成后的NotePad的情况:?

图3-3-1 日记当前状态

第八步:点击该日记标题进入日记修改页面NoteEditor

代码3-3-1 打开当前日记

 42 #Step 8:Open the note
 43 MonkeyRunner.sleep(3)
 44 device.touch(240,120,MonkeyDevice.DOWN_AND_UP)
 45
 46 MonkeyRunner.sleep(3)  #Wait a bit for the new page to get ready

通过上图的右下角,我们可以知道当前日记的坐标边界在哪里,从而可以获得在该边界范围内的有效点击坐标,比如这里我们用的是(240,120)这个坐标点。获得该日记的有效点击坐标之后,就可以在44行发送触控命令touch来模拟对该日记的点击了。一旦点击后,NotePad就会打开该日记并跳到NoteEditor页面让用户可以对该日记的内容进行编辑。

第九步:获取日记原内容控件子图

在跳转到日记编辑页面之后,我们就需要去把装载该日记内容的控件的截屏子图给获得,而获得该截屏子图需要分两步走:第一步就是要先对整个屏幕进行截屏操作;第二步就是要在整个屏幕截屏的基础上确定内容控件的边界,然后获取该边界范围内的子图。下图给出了通过uiautoatorviewer工具获得的日记内容控件的边界:

图3-3-2 原日记内容及控件边界

代码3-3-2 获取日记内容子图

48 #Step 9: Take a snapshot for the current note content
 49 imgOrigin = device.takeSnapshot()
 50 subImgOrigin = imgOrigin.getSubImage((0,76,480,391))

首先通过第49行的MonkeyDevice的takeSnapshot方法获得整个屏幕的截图,然后在该截图的基础上,第50行就可以根据上面我们通过uiautomatorviewer工具确定的日记内容子图的范围来获取到日记内容子图。有了该子图后,往下我们就可以和内容修改后的日记进行比较,比对修改看是否成功了。

第十步:修改日记内容并保存

代码3-3-3 修改日记内容并保存

 52 #Step 10: Add something to the content of the note and save it
 53 device.type("YourFirstNote")
 54
 55 device.press(‘KEYCODE_MENU‘, MonkeyDevice.DOWN_AND_UP);
 56
 57 MonkeyRunner.sleep(3)  #Wait a bit for the new page to get ready
 58
 59 device.touch(150,650,MonkeyDevice.DOWN_AND_UP)

代码的几个关键方法我们在上一节已经学习过了,这里就不做累述。需要提一点的是在修改内容后按下系统菜单键弹出来的Save菜单项的有效点击坐标同样可以通过uiautomatorviewer获得,只需要先获得该控件所在的边界,然后确定一个落在其中的边界就可以了,边界如下图所示:

图3-3-3 Save菜单项坐标

第十一步:重新打开日记内容并获取子图

代码3-3-4 重新打开日记内容并获取子图

 61 #Step 11: Open the note again and take another snapshot
 62 MonkeyRunner.sleep(3)
 63 device.touch(240,120,MonkeyDevice.DOWN_AND_UP)
 64
 65 MonkeyRunner.sleep(3)  #Wait a bit for the new page to get ready
 66
 67 imgNew = device.takeSnapshot()
 68 subImgNew = imgNew.getSubImage((0,78,480,391))

在上一步保存好新增加的日记内容之后,NotePad应用会自动返回到NotesList这个Activity界面来列出所有的日记,在我们这里的示例中只有一个日记。以上代码63行就是直接点击该日记,然后进入到NoteEdtor页面显示出日记内容,最后在69-68行获取到日记内容的子图,整个流程和上面第八步加上第九步是一样的,只是这里没有把打开日记和获取子图分成两步来完成而已。下图显示了打开修改后的日记的内容及内容子图获取的边界。

图3-3-4 修改后日记内容及控件边界

第十二步,比较日记修改前后的内容

代码3-3-5 比较日记修改前后内容并保存截图

70 #Step 12: Compare the two images
 71 res = subImgNew.sameAs(subImgOrigin,1)
 72
 73 #assert res == True
 74
 75 if not res == True:
 76     subImgNew.writeToFile("/Users/apple/Desktop/subImgNew.png",
                        "png")
 77     subImgOrigin.writeToFile("/Users/apple/Desktop/subImgOrg.png",
                        "png")

通过前面的步骤获得日记内容修改前后的截图后,就可以通过71行的MonkeyImage的sameAs方法对两个截图的内容进比较了。其中第二个参数设置成1,代表两种图如果是一模一样的才会认为是一致的。而我们这里预期的是两个图的内容是不一致的,因为一个内容没有修改过,一个内容由修改过。所以在75行会判断如果返回结果认为这两个图是一致的话,就需要把这两个图保存起来,我这里是保存在桌面,以便我们往后手动去检查究竟是否两个图真的是一样的,还是我们的代码除了问题了。

——— 未完待续———



作者:天地会珠海分舵

微信公众号:TechGoGoGo

微博:http://weibo.com/techgogogo

CSDN:http://blog.csdn.net/zhubaitian

时间: 2024-10-05 04:27:24

第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例(原创)的相关文章

老李推荐: 第8章4节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-启动AndroidDebugBridge 1

老李推荐: 第8章4节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-启动AndroidDebugBridge 上一节我们看到在启动AndroidDebugBridge的过程中会调用其start方法,而该方法会做2个主要的事情: 715行startAdb:开启AndroidDebugBridge 722-723行:初始化android设备监控并启动DeviceMonitor设备监控线程. 其中第一点我们上一小节已经做了详尽分析了,那么我们往下就去分析下第2点. Dev

老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件 从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有一大部分命令在翻译后需要转换成对应的事件,然后放入到命令队列里面等待执行.Monkey在取出一个事件执行的时候主要是执行其injectEvent方法来注入事件,而注入事件根据是否需要往系统注入事件分为两种: 需要通过系统服务往系统注入事件:如MonkeyKeyEvent事件会通过系统的InputManager往系

老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类

老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类 每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行了事,而有些是需要在解析后创建相应的事件类实例并添加到命令队列里面排队执行.负责这部分工作的就是命令翻译类.那么我们往下还是继续在MonkeySourceNetwork这个范畴中MonkeyCommand类是怎么一回事: 图6-3-1 MonkeyCommand族谱 图中间的MonkeyCommand是一个接口,

老李推荐: 第1章1节《MonkeyRunner源码剖析》概述:前言

老李推荐: 第1章1节<MonkeyRunner源码剖析>概述:前言 前言 相信大家做过安卓移动平台UI自动化开发的必然会用过,至少听过MonkeyRunner这个名字.MonkeyRunner是一个针对安卓平台的UI自动化测试框架,这个框架的其中一个但绝不是唯一的优点是支持用当今非常流行和高效的Python语言来进行脚本开发.同时,它相比Instrumentation框架或者基于Instrumentation的自动化测试框架最大的优点之一就是可以跨应用测试. 这本书不会有什么序言或者致谢什么

第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 上一节我们描述了monkey的命令处理入口函数run是如何调用optionProcess方法来解析命令行参数的.启动参数主要时去指导Monkey时怎么运行起来的,但Monkey作为MonkeyRunner框架的一部分,

第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 每个应用都会有一个入口方法来供操作系统调用执行,Monkey这个应用的入口方法就是在Monkey.java这个类里面的,也就是说Monkey.java就是整个Monkey应用的入口类. Monkey作为一个命令行应用,

第2章1节《MonkeyRunner源码剖析》了解你的测试对象: NotePad应用简介(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 本书脚本相关的示例常会用到Android SDK自带的NotePad这个应用,所以这里很有必要去描述下这个应用.其实去熟悉这个应用最好的办法是自己去把它安装上去你的目标安卓系统,然后亲自去玩一下它的各种功能.因为它只是

第1章1节《MonkeyRunner源码剖析》概述:前言(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 前言 相信大家做过安卓移动平台UI自动化开发的必然会用过,至少听过MonkeyRunner这个名字.MonkeyRunner是一个针对安卓平台的UI自动化测试框架,这个框架的其中一个但绝不是唯一的优点是支持用当今非常流

第1章2节《MonkeyRunner源码剖析》概述:边界(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 边界 怎么样才算分析清楚一个事物的原理是什么呢?就以前面提到的<LINUX内核源代码情景分析>为例子,分析到什么程度算是把Linux内核给分析清楚呢?一个操作系统内核的原理无非是要描述清楚这几个核心是如何工

第4章2节《MonkeyRunner源码剖析》ADB协议及服务: ADB服务SERVICES.TXT翻译参考(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. ADB服务器端在接受到ADB客户端发送过来的命令后会进行相应的处理,如果是主机服务就在ADB服务器内部进行处理,如果是本地服务就会发送给Android目标机器端的adbd守护进程进行处理. 因为ADB相关的源代码不在我