老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树

poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。

在上几节的描述中,我们把HierarchyViewer初始化好,也把ViewServer给装备好了。那现在距离获得一个控件去操作它是万事具备只欠东风了,欠了那一股春风了?欠了的是建立控件树这个东风,因为HierarchyViewer根据ID去获取一个控件之前是需要先建立好控件树,然后从该控件树上根据ID去查找到目标控件的。

那么这一小节我们就先去看下HierarchyViewer是如何去ViewServer获取控件列表,然后如何把每个控件的信息解析出来,最后组成一个由根控件开始的一颗控件树的。

其实在上一章我们已经自己编写代码去驱动ViewServer把指定Activity的所有控件给列出来了,那么HierarchyViewer又是怎么做的呢?其实做法都是类似的,只是上一章的实例是通过指定一个Activity的哈希值来DUMP所有控件,而HierarchyViewer是通过指定Activity的哈希值为-1来DUMP屏幕最前面的Activity窗口的所有控件。

我们先跳到HierarchyViewer获取一个控件的API,事情就是从这里开始发生的:

63     public ViewNode findViewById(String id) {

64         ViewNode rootNode = DeviceBridge.loadWindowData(

65                 new Window(new ViewServerDevice(mDevice), "", 0xffffffff));

66         if (rootNode == null) {

67             throw new RuntimeException("Could not dump view");

68         }

69         return findViewById(id, rootNode);

70     }

代码14-8-1 HierarchyViewer - findViewById

关键代码虽然只有64行这一行,但一行里面做了多个嵌套:

  • 首先是通过传入ddmlib的Device实例来初始化ViewServerDevice这个对象。ViewServerDevice这个类对我们其实并不是很重要,重要的是它持有了Device这个实例,因为和ADB交互靠的就是它
  • 然后又用ViewServerDevice这个对象,一个空标题和-1做为哈希值来初始化一个Window对象(Window构造函数请参考“代码9-1-3 Window-构造函数”)。这里要注意的是代表这个Window的哈希值-1,这个值最终是会做为”DUMP”命令的参数传送给ViewServer来获取控件列表的。我们在第11章第4节“获得控件列表“一开始就又描述过,-1这个哈希值比较特殊,指定它来DUMP一个Activity窗口的控件的话默认用的会是屏幕最前面的那个Activity,也就是当前获得焦点的Activity
  • 最后最外层的一个嵌套就是指定这个哈希值为-1的Window来调用DeviceBridge.loadWindowData这个方法了,这个才是重点

我们进入loadWindowData这个方法:

388     public static ViewNode loadWindowData(Window window) {

389         DeviceConnection connection = null;

390         try {

391             connection = new DeviceConnection(window.getDevice());

392             connection.sendCommand("DUMP " + window.encode()); //$NON-NLS-1$

393             BufferedReader in = connection.getInputStream();

394             ViewNode currentNode = parseViewHierarchy(in, window);

395             ViewServerInfo serverInfo = getViewServerInfo(window.getDevice());

396             if (serverInfo != null) {

397                 currentNode.protocolVersion = serverInfo.protocolVersion;

398             }

399             return currentNode;

400         } catch (Exception e) {

401             Log.e(TAG, "Unable to load window data for window " + window.getTitle() + " on device "

402                     + window.getDevice());

403             Log.e(TAG, e.getMessage());

404         } finally {

405             if (connection != null) {

406                 connection.close();

407             }

408         }

409         return null;

410     }

代码14-8-2 HierarchyViewer - loadWindowData

转载于:https://www.cnblogs.com/poptest/p/5103248.html

老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 1...相关推荐

  1. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...

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

    老李推荐:第6章1节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览 在上一章中我们有简要的介绍了事件源是怎么一回事,但是并没有进行详细的描述.那么往下的这几个 ...

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

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

  4. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...

    老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...

  5. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...

    老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...

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

    老李推荐: 第8章4节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-启动AndroidDebugBridge 上一节我们看到在启动AndroidDebugBri ...

  7. 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 1...

    老李推荐: 第3章2节<MonkeyRunner源码剖析>脚本编写示例: MonkeyDevice API使用示例 上一节我们学习了如何通过MonkeyRunner这个类的静态方法wait ...

  8. 老李推荐:第8章2节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-解析处理命令行参数...

    老李推荐:第8章2节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-解析处理命令行参数 MonkeyRunnerStarter是MonkeyRunner启动时的入 ...

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

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿 ...

最新文章

  1. excel函数vloopup使用方法
  2. Pycharm 项目无法导入自己写的模块(问题记录贴)
  3. ASP.NET Core分布式项目实战(详解oauth2授权码流程)--学习笔记
  4. Windows10安装TeXlive和TeXstudio
  5. 轻量级动态线程池才是“王道”?
  6. C++/C学习笔记(十一)——存储分配器和适配器
  7. Eclipse之智能提示 actionscript javascript java开发环境智能提示
  8. PHP性能:序——谈ab(Apache Bench)压力测试工具
  9. Intellij idea 主题下载网址
  10. 【project2016】解决project2016安装与office冲突问题
  11. Apache2 MPM 模式了解
  12. 【Win10】使用“Windows照片查看器”查看照片
  13. android手机的根目录,安卓根目录详解
  14. 首届全国智能制造(中国制造2025)创新创业大赛在京启动
  15. [linux]scp与服务器互传文件
  16. 解决电脑右侧数字键盘无法打出数字问题
  17. 【逻辑思维训练 二】系统思维训练
  18. css3边框圆角、背景
  19. mysql只有32位的吗_#金鸡奖##星辰大海演员计划#32位青年演员曝光,并非只有周冬雨斩获过金马奖...
  20. [原创]京东技术解密读书笔记

热门文章

  1. 零火线都带电该怎么处理?
  2. 创业者总认为自己能力很强,但能力之上是认知力
  3. 为啥国内程序员写的代码也用英文注释?
  4. 算法--最大连续子序列和(动态规划,分而治之)
  5. 指针用作函数参数、指针型函数和函数指针
  6. TCP协议特点和TCP报文段
  7. sql批量插入防止重复插入_使用SQL批量插入锁定配置
  8. 适用于SQL Server的DBATools PowerShell模块
  9. sql power bi_在SQL,Power BI和MS Excel中计算移动平均值
  10. sql azure 语法_使用Azure Data Studio开发SQL Server数据库