app控件唯一相对Xpath自动生成(增强版uiautomatorviewer)
作者:cryanimal QQ:164166060
工具由来
前面的一篇博文较详细地介绍了uiautomatorviewer:扫描和分析Android应用程序的UI控件的工具。
熟悉控件获取的同学都知道,使用uiautomatorviewer可以抓取到的用来定位控件的元素大概有
- text
- resource-id
- content-desc
- index
除此之外,appium还支持按Xpath来定位控件
Xpath和元素定位相关的语法,参见博文:
http://blog.csdn.net/kaka1121/article/details/51811296
从上文中可以看出,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(因其不可预知,弃用)
这里要说明一下xpath的元素索引和index的区别
xpath的元素索引上面已经说了,序列从1开始(IE除外,统一方法,见下面图片)
index作为手机端的节点属性,一般是从0开始的,但是有很多也是从非零开始的,非常不可预知,完全受编程人员支配,也和class无关。
下图为w3school的文档示例:
优先级策略
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]
此处有同学有疑惑,再详细说一下:
比如要找A节点 A不能用上面的方法唯一定位,但是A有父节点 或父节点的父节点, 可以被唯一定位,则用离他最近的能唯一定位的父节点 加上从其到A节点的绝对路径来定位
6.以上全不满足,则给出其绝对路径(元素索引),来唯一定位,其Xpath类似:
//X.XX.XXX[1]/X.XX.XXX[2]/X.XX.XXX[5]/X.XX.XXX[2]
根据以上策略,重写了uiautomatorviewer,实现了以上逻辑。
展示
上图中Xpath即为生成结果
fullIndexXpath为其Xpath的完整绝对路径
软件下载
下载地址(也稍微赚点积分,没有的可以在下方留言,加QQ群610460807 或加我QQ传给你164166060):
http://download.csdn.net/detail/kaka1121/9568123
安装和使用
1. 将所有jar包拷贝到%SDK%/tools\lib目录下,覆盖原来的uiautomatorviewer.jar
2. 使用%SDK%/tools\uiautomatorviewer.bat 运行即可。
3. 更多开源测试工具参见个人博客:http://blog.csdn.net/kaka1121
app控件唯一相对Xpath自动生成(增强版uiautomatorviewer)的更多相关文章
- App控件定位
本文将分享Android相关基础知识和Android APP控件定位工具的使用方法. Android基础知识 Android布局 Android是通过容器的布局属性来管理子控件的位置关系(iOS去掉了 ...
- 背水一战 Windows 10 (6) - 控件 UI: 字体的自动继承的特性, Style, ControlTemplate
[源码下载] 背水一战 Windows 10 (6) - 控件 UI: 字体的自动继承的特性, Style, ControlTemplate 作者:webabcd 介绍背水一战 Windows 10 ...
- C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面
个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...
- Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z
http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...
- UniqueID,页面子控件唯一标示
aspx: <form id="form1" runat="server"> <asp :Repeater ID="MyDa ...
- 利用activeX控件在网页里自动登录WIN2003远程桌面并实时控制
首先要自己配置并打开受控端的WEB远程桌面服务,这个在“添加/删除windows组件”里有,我只在windows 2003 server里试过,没试过XP.下面我们在客户端安装微软提供的远程桌面客户端 ...
- 控件 UI: 字体的自动继承的特性, Style, ControlTemplate
字体的自动继承的特性 Style 样式 ControlTemplate 控件模板 示例1.演示字体的自动继承的特性Controls/UI/FontInherit.xaml <Page x:Cla ...
- 031. aps.net中数据绑定控件两种添加自动编号的方法
前端HTML代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defaul ...
- Android控件之MultiAutoCompleteTextView(自动匹配输入的内容)
一.功能 可支持选择多个值(在多次输入的情况下),分别用分隔符分开,并且在每个值选中的时候再次输入值时会自动去匹配,可用在发送短信,发邮件时选择联系人这种类型中 二.独特属性 android:comp ...
随机推荐
- 浅谈linux静态库、动态库。
动态库又叫动态共享文件(.so,Dynamic Shared Objects)和静态库(.a)都是将一些待重用的公共代码打包成一种特殊的重定位目标文件. 在使用时,连接器会将静态库中所有的代码,编译到 ...
- [LeetCode] Largest Number At Least Twice of Others 至少是其他数字两倍的最大数
In a given integer array nums, there is always exactly one largest element. Find whether the largest ...
- [LeetCode] Find K Closest Elements 寻找K个最近元素
Given a sorted array, two integers k and x, find the k closest elements to x in the array. The resul ...
- [JSOI2007]建筑抢修
Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的 入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快 ...
- [BZOJ]1064: [Noi2008]假面舞会
题目大意:n个人,k种假面,每人戴一种,戴第i种的可以看见第i+1种,戴第k种的可以看见第1种,给出m条关系表示一个人可以看到另一个人,问k可能的最大值和最小值.(n<=100,000,m< ...
- Python的数据类型——字符串
一.字符串的误解 计算机系统的每个内存单元都是唯一并且连续的物理地址,字符串在内存中一旦创建就被 操作系统分配一块唯一并且连续的地址.计算机系统不允许我们修改字符串中的内容,一旦我想 试图进行修改,系 ...
- Visual Studio 2015 无法命中断点
新安装操作系统后发现,vs2015无法命中断点. 在项目中设置生成调试信息:FULL 即可.
- 关于 Cannot forward after response has been committed的错误
这个错误顾名思义:就是在给客户端做出提交响应完毕后,就不能再次使用request的转发. 代码原先是这样的: package com.bdqn.jsp.study.web.filter; import ...
- Linux配置服务器的一点总结
一.Linux初始化服务 首先搞清楚四个概念: 进程:正在运行的程序,有自己独立的内存空间. 线程:是进程的下属单位,开销较进程小,没有自己独立的内存空间. 作业:由一系列进程组成,来完成某一项任务. ...
- H3C S3100交换机配置VLAN和远程管理
一.基本设置 1. console线连接成功 2. 进入系统模式 <H3C>system-view //提示符由<H3C> 变为 [H3C] 3. 更改设备名称 [H3C]sy ...