老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述

 

HierarchyViewer库的引入让MonkeyRunner可以以面向控件的方式进行脚本编写,那么它是怎么做到这一点的呢?它的实现原理又是怎么样的呢?在这一小节开始我们就会开始一起揭开它的神秘面纱。

HierarchyViewer这个框架的工作需要ViewServer的协同工作,它们是以CS(Client-Server)架构来协同工作的。我们在上一章已经学习了如何让做为Server端的ViewServer为我们提供获取控件列表的服务,那么这一章我们主要分析的就是做为Client端的HierarchyViewer是如何实现驱动目标机器的ViewServer服务器来获取控件列表等相关工作的。

从我们编写MonkeyRunner测试脚本的角度来看,我们一般会这样子使用HierarchyViewer:

1   device = MonkeyRunner.waitForConnection()

2   viewer = device.getHierarchyViewer()

3   view = viewer.findViewById("id/button") #Return a ViewNode

4   p = viewer.getAbsoluteCenterOfView(view)

5   device.touch(p.x,p.y,MonkeyDevice.DOWN_AND_UP)

代码14-2-1 通过控件点击按钮

从以上的代码我们可以看到整个使用HierarchyViewer的流程是非常的简单明了的:

  • 第一步: 通过MonkeyDevice的实例获得HierarchyViewer的实例
  • 第二步: 使用HierarchyViewer的实例来通过控件的ID来获得代表控件的一个ViewNode实例
  • 第三步: 最后就可以通过操作ViewNode实例暴露出来的各种控件属性来进行控件的操作了

我们最终通过ViewNode控件实例的属性来操作控件确实让我们用起来得心应手,但是暗藏在这些简单的脚本代码背后的实现原理其实并不会这么简单的。我们尝试把我们脑袋里面的疑问给列出来:

  • 问题1: findViewById是从哪里根据控件ID获得我们需要的控件的?直接把ID发给ViewServer让它去查找吗?还是通过其他方法?
  • 问题2 :MonkeyDevice的getHierarchyViewer方法究竟做了什么事情?

这两个问题的答案其实就是本章的重点,我们先带着这两个问题来往下学习,最后问题就会不言自明了。

往下我们先看下HierarchyViewer涉及的关键类的类图来了解下它的架构:

图11-2-1 HierarchyViewer类图

从上图我们可以看到整个框架其实涉及到了多个库,包括chimpchat,hierarchyviewerlib和ddmlib类,这里先简要描述下主要会用到每个库的哪些类,以及这些类在这里主要的作用是什么,其实很多我们在前面章节都已经接触过了,但以前可能没有去描述这些类跟HierarchyViewer是什么关系。

类名

作用

注释

HierarchyViewer

chimpchat

提供控件相关API给测试开发人员调用,如findViewById等

拥有ddmlib的Device类的一个实例,所以可以通过该实例来操作AdbHelper来跟ADB服务器进行通信

Device

ddmlib

在这里的主要作用是可以直接调用AdbHelper来往ADB服务器发送命令

AdbHelper

ddmlib

负责连接ADB服务器并向其发送命令

DeviceBridge

hierarchyviewerlib

相当于ViewServer在客户端的代理,两者的关系类似于adbd和adb服务器的关系;

组织命令然后调用DeviceConnection的API把命令发送给ViewServer

DeviceConnection

hierarchyviewerlib

连接ViewServer的Socket客户端,专门用来连接ViewServer,发送命令和接收命令返回

Window

hierarchyviewerlib

代表一个控件的窗口,它跟控件ViewNode是不一样的,它不会保存控件的所有属性,它主要的成员变量有:窗口标题mTitle;代表该窗口的哈希值

ViewNode

hierarchyviewerlib

代表了一个控件,拥有Window实例以及一个控件的所有属性信息

表格 11-2-1 HierarchyViewer关键类简述

往下我们描述下每个类之间是怎么互动的:

  • HierarchyViewer依赖DeviceBridge: HierarchyViewer在初始化的时候会调用途中的setupViewServer这个私有方法来准备好目标机器端的ViewServer,期间它会调用DeviceBridge的一系列方法来完成这些事情,其中DeviceBridge是一个静态类,不需要初始化就能直接使用其内部公共方法
  • DeviceBridge依赖DeviceConnection: DeviceBridge成员方法会初始化DeviceConnection对象来通过它把组织好的命令发送到ViewServer,比如DUMP命令.
  • DeviceBridge依赖ViewNode: DeviceBridge在通过发送DUMP命令到ViewServer获得控件列表后,会把每个控件的信息都解析出来,然后建立一个由ViewNode控件实例组建起来的一棵控件树。
  • DeviceBridge依赖Device: HierarchyViewer在调用DeviceBridge的setupViewServer去准备好ViewServer的时候会把它持有的Device实例传进去给DeviceBridge,DeviceBridge就是通过这个Device实例来组织相应的ADB命令来发送给ADB服务器来操作ViewServer的
  • Device依赖AdbHelper: Device本身并不会连接ADB服务器的socket来发送命令,这些都是由AdbHelper来做的,我们在之前的章节已经见识过了
  • ViewNode组合Window: 每个ViewNode都拥有一个Window成员变量。也就是说每个控件都应该是属于某一个窗口的,一个不属于某个窗口的控件是没有意义的,是不应该存在的
  • HierarchyViewer使用ViewNode: 脚本在调用HierarchyViewer的findElementById的时候,会首先使用DeviceBridge来获取控件列表并建立控件树,最后会遍历由ViewNode实例组成的控件树来获取目标控件

HierarchyViewer架构到了这里就算描述的差不多了,往下我们会进入到实现细节去看下它的实现原理是怎样的。

老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述的更多相关文章

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

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  2. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...

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

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列   事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...

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

    老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...

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

    老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件   从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...

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

    老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类   每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...

  7. 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串

    老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串   从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...

  8. 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles

    老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles   poptest是国内唯一一家培养测试开 ...

  9. 老李推荐:第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源

    老李推荐:第5章6节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 初始化事件源   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ...

  10. 老李推荐:第5章3节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动脚本

    老李推荐:第5章3节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 启动脚本   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

随机推荐

  1. Monkey实例测试

    三.Monkey实例测试 Windows下(注:2-4步是为了查看我们可以测试哪些应用程序包,可省略): 1. 通过eclipse启动一个Android的emulator或者2 2. 在命令行中输入: ...

  2. AMD的cpu如何安装Mac OS

    AMD的cpu如何安装Mac OS       经过一个月的折腾,终于成功的安装了自己的Mac系统,并且能够成功的启动.在这里分享一下自己安装的经验.      为了安装方便,有不影响原来的系统的使用 ...

  3. android学习19--Matrix.mapPoints作用

    android图形的旋转,缩放,平移都是用matrix实现的.可以用mapPoints来计算一个点旋转,缩放,平移后的坐标.看下面例子. Matrix matrix = new Matrix(); m ...

  4. excel 下拉级联,重新选第一个,清空后一个已赋值,并且改变后一个下拉的内容。

    在前面的部分,设置下拉级联,我们已经可以百度到很多视频,我就不再多说,而我搞了一天解决 的,是在俩菜单都有值的情况下,重新选第一个下拉,后面那个值怎么清除,是一个事件调用.上图. 其中"$H ...

  5. rem与em

    最近有朋友在进行rem布局的时候总搞不懂rem  em  px  与百分比布局的区别在哪里  这里简单给大家介绍一下 Em为单位: 这种技术需要一个参考点,一般都是以<body>的&quo ...

  6. 基于MAC10.12+MYSQL5.7.17搭建XMPP服务器【黑苹果系统】

    在以前的公司中了解到XMPP可以搭建即时通讯APP.出于好奇自己在空余时间也学了一下搭建XMPP服务器,其中遇到了许多问题,经过坎坷的路程终于搭建成功[这些坎坷的经历主要是由于自己的无知造成的] 下面 ...

  7. FaceNet---深度学习与人脸识别的二次结合

    今天我给大家带来一篇来自谷歌的文章,众所周知,谷歌是全世界最有情怀,最讲究技术的公司,比我们天朝的莆田广告商良心多了.还有就是前段时间的最强大脑,莆田广告商的那个小机器,也就忽悠忽悠行外人了,懂的人深 ...

  8. 未来工厂——电器行业ERP案例

    江苏科兴电器有限公司位于全国著名的“银杏之乡”泰兴市南首,主要生产35kV及以下电流.电压互感器等系列产品.产品多次经国家及省市技术监督部门抽检合格,广泛应用于国家重点工程.“COSINE”商标荣获泰 ...

  9. TCP和UDP 的区别和适用场合

    TCP和UDP式TCP/IP中能够实现传输层功能的.具有代表性的协议,其主要特点和区别如下: TCP: 面向连接的.可靠的流协议.为提供可靠性传输,TCP实行"顺序控制"或&quo ...

  10. python excel操作总结

    1.openpyxl包的导入 Dos命令行输入 pip install openpyxl==2.3.3 这里注意一下openpyxl包的版本问题 版本装的太高有很多api不支持了,所以笔者这里用的是2 ...