新手区 请教一个关于 XPath 绝对路径的问题

Erichthionius · August 24, 2016 · Last by replied at August 26, 2016 · 2159 hits

背景:
我是在根据论坛上的一些帖子做基于uiautomatorviewer 二次开发,开发录制功能实现可以录制一些简单脚本,但是现在遇到一个问题
如图:

我要如何获取这个“下载”按钮的XPath绝对路径呢?
我的思路:
我只要获取到listview那层开始就可以,不必获得从根节点开始的路径,我现在卡住的是,我要如何知道所选节点的父节点的父节点...这样一层层上去直到那个Listview那个节点。
用while循环可以吗?,还是有更好的思路去获取这个控件的唯一定位?
了解的人可以点拨一下吗?

共收到 13 条回复 时间 点赞

解析整个 xml ,每个节点变成 node 对象,然后递归从你这个元素节点开始找 node 的 parent 吧?

不过搞个绝对路径有什么意义?

#1楼 @chenhengjie123 我是想获取这个“下载”按钮的唯一定位方式,这几个“下载”按钮的属性都一样,没办法区分,我想到这个发子,不知道可行不?您有没有好的法子😬

直接获取下载元素的元素集,然后通过index决定使用哪个下载不行么?

#4楼 @iriszhang 这几个下载元素的index都是0,没办法根据这个区别的。

#3楼 @xdf 谢谢你告诉我这个消息,我去找找app-inspector的源码看看,不知道找不找的到。😂

人写代码时,一般写成这样
//android.widget.TextView[text()='疯狂俄罗斯人']/parent::*/parent::*/following-sibling::*[1]/android.widget.Button[text()='下载']
如果想从包含“下载”的按钮推断出上面这个 Xpath,还需要一些信息来判断 parent 有几个、following-sibling 有几个,比如固定的结构(父节点的父节点的第一个弟节点),或者一个锚点(id是“appname”的祖先节点),但这些都可能改变。用过的录制回放工具没有处理这种情况的,需要人再去改,改的时候 FirePath 这种工具就足够方便了。

另一种录制回放的思路是:如果录制时点第三个按钮成功,那回放时点第三个按钮也应该是成功的

#7楼 @sanlengjingvv 但是我们老大给我的要求是,当点击“下载”按钮,就直接可以生成这样的路径

//android.widget.TextView[text()='疯狂俄罗斯人']/parent::*/parent::*/following-sibling::*[1]/android.widget.Button[text()='下载']

然后在封装一下直接生成可运行的脚本,尽量人不用在去改脚本。不过我才接触测试不到一个月,搞这个有点吃力😂

通过比较xy坐标来判断下载按钮属于哪个游戏的,然后拼出来路径。可行么。

#9楼 @nickli 我看阿里那个mqc录制工具录制出来的脚本,针对这种情况就是利用坐标和控件id双重限制来实现定位,不过这录制出来的脚本就太有限制性了,换一个分辨率不同的手机,这个路径就行不通了。

场景1:

  1. 上架新游“疯狂俄罗斯人”
  2. 进入全部新游
  3. 下载“疯狂俄罗斯人”
    场景2: 下载任意app
    场景3:
  4. 搜索“疯狂俄罗斯人”
  5. 下载“疯狂俄罗斯人”

场景1,上架一般是Web后台操作的,先不说
场景2,//android.widget.Button[text()='下载’][1]这种Xpath就足够了
场景3,给 ListViewItem 加个 ID,给游戏名称加个 ID ,从被点击的“下载”向上找到 ListViewItem 的 ID 停止,再向下遍历找到游戏名称的 ID ,就可以拼出这种Xpath了

//android.widget.TextView[text()='疯狂俄罗斯人']/parent::*/parent::*/following-sibling::*[1]/android.widget.Button[text()='下载']

其实,就先按“父节点的父节点的第一个弟节点“这种固定规则生成,App界面树结构变了改录制代码后重新录制。先实际用起来,说不定层级就很少变呢?说不定用的人觉得这种非常智能的自动生成不重要呢?说不定老大改想法了呢?说不定使用场景明确以后就有更好的实现方法了呢?

#11楼 @sanlengjingvv 我看到一个帖子是遍历把属性都相同的控件放到一个list里面,然后去判断点的是第几个,uiautomatorviewer 功能扩展实践

这样感觉比给出绝对路径的要简单,反正不管了,先试试这个思路,昨天搞了一天那个绝对路径没出来。

#10楼 @star8 是对比坐标 对比游戏名和下载按钮的坐标 这两个坐标肯定有相似性的 Y轴误差肯定在一个范围内 通过这个就可以确定下载按钮是哪个游戏的 分辨率应该影响不大。

Erichthionius 关闭了讨论 07 Dec 09:24
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up