zoukankan      html  css  js  c++  java
  • 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

    老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件

     

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

    到了现在,万事已经俱备,控件树这个东风也已经就绪了,我们也终于可以火烧赤壁大展拳脚,通过控件的ID在控件树中找到我们想要的控件了。

    HierarchyViewer只允许用户通过控件的ID去查找控件,这比Robotium,UiAutomator和Appium这些框架是少了很多查找控件的方式的,但聊胜于无。

    HierarchyViewer去尝试通过控件ID的方法叫做findViewById,它有两个重载方法,一个是只提供控件ID做为参数;另一个是提供控件ID和一个控件树节点,这个控件只能是要查找的控件的父辈控件,因为需要从这个控件往下遍历直到找到目标控件,它代表了是从哪个控件开始在控件树上查找目标控件的。以下是这两个重载方法的定义:

    • public ViewNode findViewById(String id)
    • public ViewNode findViewById(String id, ViewNode rootNode)

    其中第一个方法每次调用都会去ViewServer获得一次控件列表,然后重新建立控件树,所以可见效率是比较低的。

    第二个方法必须在第一个方法已经执行过之后才能执行,道理很简单,它不会去重新获得控件列表和重新组建控件树,所以第二个参数rootNode如果在第一个方法没有执行过的情况下是没有办法获得的。

    但是也正义因为第二个方法不需要去消耗时间重新去驱动ViewServer获得控件列表并重新组成控件树,所以它的效率是比第一种方法高很多的。所以我们在编写脚本的时候,在保证应用当前Activity没有改变的情况下,我们应该只调用第一个方法一次,然后其他获得控件的方法应该都使用第二种方法来实现。

    我们先看下第一种方法的源代码:

    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-9-1 HierarchyViewer - findViewById重载1

    64-65行我们上一小节已经分析过了,且整个小节都是围绕它为中心来阐述的,它的功能就是去驱动ViewServer获得控件列表然后组建成控件树。在控件树组建好之后,下一步就是69行去调用findViewById的第二种方法来获得目标控件,传入的参数rootNode在这里就是整棵控件树的树根控件节点。

    77     public ViewNode findViewById(String id, ViewNode rootNode) {  

    78         if (rootNode.id.equals(id)) {  

    79             return rootNode;  

    80         }  

    81         for (ViewNode child : rootNode.children) {  

    82             ViewNode found = findViewById(id,child);  

    83             if (found != null) {  

    84                 return found;  

    85             }  

    86         }  

    87         return null;  

    88     }  

    代码14-9-2 HierarchyViewer - findViewById重载2

    整个遍历算法很简单:

    • 78 - 80行:表示如果目标控件ID和传进来的根控件节点有相同的ID,那么根控件就是我们想要的控件
    • 81 - 86行一个for循环遍历传进来的根控件的所有子控件节点,直到找到一个控件ID和目标控件ID一致的控件位置才返回
  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/poptest/p/5110615.html
Copyright © 2011-2022 走看看