• 老李推荐:第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一致的控件位置才返回
  • 相关阅读:
    时间插件--daterangepicker使用和配置详解
    AdminLTE 前端框架
    vue element-ui 绑定@keyup事件无效
    Plugin/Preset files are not allowed to export objects,webpack报错/babel报错的解决方法
    webpack学习
    指令
    【Nuxt】配置路由
    【面试】常见面试题
    安装虚拟机
    【linux】基础知识
  • 原文地址:https://www.cnblogs.com/poptest/p/5110615.html
Copyright © 2020-2023  润新知