由于某种原因,我无法在Android上获得该元素的所有直接子代。显然,在元素中搜索子元素时XPath无法正常工作,或者在Appium中未正确实现XPath范围。
parentElement.findElements(By.xpath(...))
我尝试过的事情:
*
./*
.//*
.//child::*
./child::*
//*
//child::*
我的结果为零,所有节点(甚至在父元素之外)或所有后代。
对我来说唯一有用的是:
.//*[@resource-id='RESOURCE-ID-OF-PARENT']/child::*
但这是非常差的解决方法,因为可能有多个具有相同资源ID的元素(仅供参考,我正在基于Appium编写包装器)
我试图在此处搜索所有答案,但找不到任何可行的解决方案。
欢迎任何帮助,谢谢。
答案 0 :(得分:0)
我找到了一种解决方法:
1)编写一个比较两个元素的函数。由于提供的equals方法不适用于本机元素(Android,iOS),因此必须编写自己的实现。我正在比较最相关的属性,例如类,资源ID和内容描述以及大小,位置和范围。除非存在两个相同的重叠元素,否则这种方法在99%的情况下应该可以工作。
2)查询具有最准确属性(tagName,类,资源ID和contentDescription)的父元素(findElementsByXpath
)的xpath。在大多数情况下,只有一个元素,但是如果有更多元素,请浏览列表并使用基于相等函数的比较。
3)标记列表中元素的索引,只要找到匹配项,就以这种格式运行另一个查询:
(//tagName[@class=... and @resource-id= ...etc...])[index]/child::*
请记住,Xpath中的索引从1开始。结果列表是父元素的实际子代。
解决方法不是最快的,但总比没有好。
答案 1 :(得分:0)
这完全是出于实验,但是Appium中的xpath处理似乎实际上并不是以所选节点作为根(正如您期望的那样)开始,而是以一个伪节点代替,该伪节点只包含该当前节点作为子节点(然后是下面的树)
我尝试了以下操作:.//*/child::*
,这似乎对我有用。