首页 > 解决方案 > Appium - Xpath 让直接子代不在 Android 上工作

问题描述

出于某种原因,我无法在 Android 上获取元素的所有直接子元素。显然,在元素中搜索子元素时 XPath 无法正常工作,或者 XPath 范围在 Appium 中未正确实现。

parentElement.findElements(By.xpath(...))

我尝试了什么:

*
./*
.//*
.//child::*
./child::*
//*
//child::*

我的结果要么是零,要么是所有节点(甚至在父元素之外),要么是所有子节点。

唯一对我有用的是:

.//*[@resource-id='RESOURCE-ID-OF-PARENT']/child::*

但这是非常糟糕的解决方法,因为可能有多个元素具有相同的资源 ID(仅供参考,我正在编写基于 Appium 的包装器)

我试图在这里搜索所有答案,但找不到任何可行的解决方案。

欢迎任何帮助,谢谢。

标签: androidxpathappiumchildren

解决方案


我找到了某种解决方法:

1) 编写一个比较两个元素的函数。由于提供的 equals 方法不适用于本机元素(Android、iOS),因此必须编写自己的实现。我正在比较最相关的属性,例如类、资源 ID 和内容描述以及大小、位置和边界。这应该在 99% 的情况下有效,除非存在两个相同的重叠元素。

2) 查询具有最准确属性的父元素 ( findElementsByXpath) 的 xpath - tagName、class、资源 ID 和 contentDescription。大多数情况下,只有一个元素,但如果有更多,请浏览列表并使用基于相等功能的比较。

3)标记列表中元素的索引,每当找到匹配项时,以这种格式运行另一个查询:

(//tagName[@class=... and @resource-id= ...etc...])[index]/child::*

请记住,Xpath 中的索引从 1 开始。结果列表是父元素的实际子元素。

解决方法不是最快的,但总比没有好。


推荐阅读