老李推荐:第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一致的控件位置才返回
老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件的更多相关文章
- 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结 本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...
- 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列
老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列 事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...
- 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...
- 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件
老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件 从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...
- 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类
老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类 每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...
- 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串 从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...
- 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles
老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles poptest是国内唯一一家培养测试开 ...
- 老李推荐:第5章6节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 初始化事件源
老李推荐:第5章6节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 初始化事件源 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试 ...
- 老李推荐:第5章3节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动脚本
老李推荐:第5章3节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 启动脚本 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...
随机推荐
- 不惧面试:HTTP协议(3) - Cookie
v博客前言 先交代下背景,写这个系列的原因是总结自己遇到的面试题以及可能遇到的题目,更重要的是,今年定的目标是掌握网络这一块的知识点,先是搞懂HTTP协议,然后是TCP/IP协议,再就是WCF如何运用 ...
- 1305 Pairwise Sum and Divide
1305 Pairwise Sum and Divide 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 有这样一段程序,fun会对 ...
- linux下apache,php的安装
apache的安装 1.下载httpd-2.4.16.tar.gz, apr-1.5.2.tar.gz,apr-util-1.5.4.tar.gz,pcre-8.37.zip,解压 2.注意看apac ...
- 软件测试作业1 — 令我印象最深的BUG
回顾从大一到大三的学习生活,我在学习过程中遇到过许多BUG,刚开始和罗凯老师学习C++时从来没有接触过编程,那时候导致程序不能运行的原因多是语法错误和拼写错误,到了大一下学期,错误多出现在循环与条件跳 ...
- 【转】Java 并发:Executors 和线程池
原文地址: http://baptiste-wicht.com/posts/2010/09/java-concurrency-part-7-executors-and-thread-pools.htm ...
- 记忆 : Odata $count
在v4.0 的规范中,没有$inlineCount,只有$count. 但是在Entity 不支持$count,给出的原因是这样的, asp.net 的 web api 是支持Odata 的, 但是e ...
- 每天一个linux命令(33)--du命令
Linux du命令也是查看使用空间的,但是与 df 命令不同的是 Linux du 命令是对文件和目录磁盘使用的空间的查看,还是和df 命令有一些区别的. 1.命令格式: du [选项] [文 ...
- 每天一个linux命令31)--chown命令
chown将 指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID,组可以使组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷 ...
- Unbutu14.04 启用 root 并禁用guest
系统环境: Ubuntu14.04 x64 问题描述: Ubuntu14.04的64位系统默认禁用 root 账号登录 解决方式: 1. 为root设置密码 sudo passw ...
- Servlet的监听
Servlet监听 在<Servlet和Jsp>中我们使用了ServletConfig获取Servlet的初始配置,用ServletContext来获取整个Web应用的初始配置,但如果需要 ...