作者:cryanimal QQ:164166060
工具由来
前面的一篇博文较详细地介绍了uiautomatorviewer:扫描和分析Android应用程序的UI控件的工具。
熟悉控件获取的同学都知道,使用uiautomatorviewer可以抓取到的用来定位控件的元素大概有
text
resource-id
content-desc
index
除此之外,appium还支持按Xpath来定位控件
Xpath和元素定位相关的语法,参见博文:
从上文中可以看出,uiautomatorviewer抓取出来的属性,可统一用Xpath方式来获取,可以较大地简化代码,我们只需要定义一个优先级策略即可。
工具设计思路
首先,前端开发同学也需要定位元素,通常使用resource-id或text,因此大部分关键元素都会有唯一的resource-id或text,列表除外。
其次,少量元素会有 content-desc,且唯一;
再次,index是每个元素都有的,也是最不靠谱的一个;
除此之外,Xpath本身作为DOM,本身会根据元素类型(在此工具中叫class)维护一个顺序,本文中称之为“元素索引”;
综上,可以定义如下优先级:
1.resource-id
2.text
3.content-desc
4.元素索引
5.index(因其不可预知,弃用)
优先级策略
1.如果只包含resource-id,且唯一,则直接用resource-id,其Xpath为://android.XX.XXX[@resource-id=\"com.duowan.mobile:id/rb_main\"]
2.如果只存在text,且唯一,则直接用text,其Xpath为://android.XX.XXX[@text=\"直播\"]
3.如果只存在content-desc,且唯一,则直接用content-desc,其Xpath为://android.XX.XXX[@content-desc=\"热门推荐\"]
4.如果不满足1/2/3,且存在resource-id、text、content-desc,三者取其二或者取其三能唯一定位,则其Xpath类似:
//X.XX.XXX[@resource-id=\"abc\" and @text=\"狂热\" and @content-desc=\"推荐\"]
5.如果不满足1/2/3/4,则递归地寻找其父节点,直到找到唯一。再从其父节点开始,取绝对路径(元素索引),加起来唯一定位,其Xpath类似:
//X.XX.XXX[@resource-id=\"android:id/list\"]/X.XX.XXX[1]/X.XX.XXX[2]
6.以上全不满足,则给出其绝对路径(元素索引),来唯一定位,其Xpath类似:
//X.XX.XXX[1]/X.XX.XXX[2]/X.XX.XXX[5]/X.XX.XXX[2]
根据以上策略,重写了uiautomatorviewer,实现了以上逻辑。
展示
上图中Xpath即为生成结果
fullIndexXpath为其Xpath的完整绝对路径
软件下载
下载地址(也稍微赚点积分,没有的可以加我QQ传给你164166060):
安装和使用
1. 将所有jar包拷贝到%SDK%/tools\lib目录下,覆盖原来的uiautomatorviewer.jar
2. 使用%SDK%/tools\uiautomatorviewer.bat 运行即可。
3. 更多开源测试工具参见个人博客:http://blog.csdn.net/kaka1121