作者: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)的更多相关文章

  1. App控件定位

    本文将分享Android相关基础知识和Android APP控件定位工具的使用方法. Android基础知识 Android布局 Android是通过容器的布局属性来管理子控件的位置关系(iOS去掉了 ...

  2. 背水一战 Windows 10 (6) - 控件 UI: 字体的自动继承的特性, Style, ControlTemplate

    [源码下载] 背水一战 Windows 10 (6) - 控件 UI: 字体的自动继承的特性, Style, ControlTemplate 作者:webabcd 介绍背水一战 Windows 10 ...

  3. C# Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面

    个人理解,开发应用程序的目的,不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景也最为复杂,包括但不限于:表格记录查询.报表查询.导出文件查询等等 ...

  4. Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z

    http://www.cnblogs.com/zuowj/p/4504130.html 不论是B/S或是C/S结构类型,无非就是实现可供用户进行查.增.改.删,其中查询用到最多,开发设计的场景 也最为 ...

  5. UniqueID,页面子控件唯一标示

    aspx: <form id="form1" runat="server">     <asp :Repeater ID="MyDa ...

  6. 利用activeX控件在网页里自动登录WIN2003远程桌面并实时控制

    首先要自己配置并打开受控端的WEB远程桌面服务,这个在“添加/删除windows组件”里有,我只在windows 2003 server里试过,没试过XP.下面我们在客户端安装微软提供的远程桌面客户端 ...

  7. 控件 UI: 字体的自动继承的特性, Style, ControlTemplate

    字体的自动继承的特性 Style 样式 ControlTemplate 控件模板 示例1.演示字体的自动继承的特性Controls/UI/FontInherit.xaml <Page x:Cla ...

  8. 031. aps.net中数据绑定控件两种添加自动编号的方法

    前端HTML代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Defaul ...

  9. Android控件之MultiAutoCompleteTextView(自动匹配输入的内容)

    一.功能 可支持选择多个值(在多次输入的情况下),分别用分隔符分开,并且在每个值选中的时候再次输入值时会自动去匹配,可用在发送短信,发邮件时选择联系人这种类型中 二.独特属性 android:comp ...

随机推荐

  1. HTML笔记04---计时事件

    JavaScript运动01 计时事件 1.语法:var t=setTimeout("javascript语句",毫秒); setTimeout() 方法会返回某个值.在上面的语句 ...

  2. 原生js代码挑战之动态添加双色球

    var ballArr = []; //存放已有的红球,用来排除重复和排序window.onload = function(){ var btn = document.createElement(&q ...

  3. Java学习图形界面+网络编程案例---------网络简易通讯

    主要思想: 主类继承JPanel,在构造方法中将JFrame设成空布局:在其中适当位置添加组件:实现事件监听处理 DATE:2015-10-31 服务器端代码: /** * @author Oyc * ...

  4. 一、spring的成长之路——代理设计模式

    java常用的设计模式详解: 1.代理模式(JDK的动态代理) [IDept.java] ​ 这是一个简单的就接口,进行数据的更新 package com.itcloud.pattern.proxy; ...

  5. [LeetCode] Accounts Merge 账户合并

    Given a list accounts, each element accounts[i] is a list of strings, where the first element accoun ...

  6. 深入java多线程一

    涉及到 1.线程的启动(start) 2.线程的暂停(suspend()和resume()) 3.线程的停止(interrupt与异常停止,interrupt与睡眠中停止,stop(),return) ...

  7. Linux数据流重定向与管道

    数据流重定向简单来说就是把原本应该输出到某处(比如说屏幕)的数据,重定向其输出目的地,到其他的地方(比如文件). linux中的输入与输出: 标准输入(stdin):默认从键盘输入 标准输出(stdo ...

  8. [COGS 2287][HZOI 2015]疯狂的机器人

    Description 题库链接 现在在二维平面内原点上有一只机器人,他每次可以选择向右走,向左走,向下走,向上走和不走(每次如果走只能走一格).机器人不能走到横坐标是负数或者纵坐标是负数的点上. 给 ...

  9. 【网络流】【BZOJ1221】【HNOI2001】软件开发

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1221 题意:你有3种方法进行对毛巾的处理,不同的处理方法有不同的cost,问你要如何规划才 ...

  10. 【NOIP2011TG】solution

    老师最近叫我把NOIPTG的题目给刷掉,于是就开始刷吧= = 链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&ta ...