打造专属 uiautomatorviewer,先看下成果展示:


看了 testerhome 网站《由 uiautomator 二次开发得到的启发以及完善》https://testerhome.com/topics/3048 ,感概真是相当棒的 idea。感到不足的地方是生成的脚本为啥不弄个可视化的界面展示出来,而且没有细化到获取选中的控件的 id,text,content-desc 和 class 去生成相对应的脚本,如果在右键菜单进行一些操作后刷新界面,那就更棒了!
带着这个思路,我决定去学习 uiautomatorviewer 的源码,并决定打造属于自己的 uiautomatorviewer,定了开发目标:

1.桌面端 uiautomatorviewer 获取界面,在界面加入简单操作并反馈至手机,部分操作亦刷新 viewer 界面,减少手动操作手机次数。
2.操作过程结合获取的元素生成简单自动化脚本,帮助提高书写代码的效率。

在工作之余大概花了 4 天的时间学习和开发完成,开发中途,周五大概完成了 80%,拿给了斌辉和温力同学看看,斌辉和温力同学都提出了相同的一个问题:控件的 id 或 text 或 content-desc 或 class 相同,能不能区分选中的控件是第几个?就是控件的 instance 问题,uiautomatorviewer 没有 instance 属性只有 index 属性。真是英雄所见略同,于是周末又花了半天的时间去研究下多叉树的遍历并开发出了获取 instance,自己的思路大体是这样的:

层次遍历多叉树,到选中的节点处截止,在这些遍历到的节点中,如果这些节点包含选中节点的某一属性(id 或 text 或 content-desc 或 class),则 instance + 1。

本来这个思路挺好的,可是开发遍历过程中写的函数给我返回的这些节点只有父节点,调了好久没成功,于是改变思路分两步走:

1.遍历整个界面所有节点,保存起来。
2.在所有节点中找出选中节点的前面的节点,如果这些节点包含选中节点的某一属性(id 或 text 或 content- desc 或 class),则 instance + 1。

开发准备:
1.uiautomatorviewer 源码
2.swt 开发http://www.cnblogs.com/xing901022/p/4098368.html
3.度娘

大概弄清楚 uiautomatorviewer 的原理后,进行改写 uiautomatorviewer,实施方案:

1.主窗口类 UiAutomatorViewer,改写为单例模式,添加获取 root 节点和当前节点的私有变量 UiAutomatorModel uModel,在回调函数 setModel 对 uModel 赋值,我当时这样想这样做的目的是无论我在哪个类下我都能刷新 viewer 和获取当前 root 节点和选中节点。


主窗口类


改为单例模式,添加私有变量 uModel


回调函数赋值 uModel

2.swt 的控件主要在 UiAutomatorView 扩展,请看 swt 开发或问度娘,大体扩展如下

3.遍历整个界面多叉树,在 BasicTreeNode 扩写,本来我写了第一个思路的函数老调试不成功,改写成第二个思路,请看代码,如果你有优化方案请告诉我。

遍历完后:


↙↙↙阅读原文可查看相关链接,并与作者交流