【问题标题】:Appium - Xpath to get direct children not working on AndroidAppium - Xpath 让直接子代不在 Android 上工作
【发布时间】:2019-07-26 02:00:11
【问题描述】:

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

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

我尝试了什么:

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

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

唯一对我有用的是:

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

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

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

欢迎任何帮助,谢谢。

【问题讨论】:

  • 一些附加信息可能会有所帮助。你能描述一下你正在寻找什么样的子元素吗?子元素是否无法以其他方式访问?我知道您可能无法分享太多内容,但是 uiautomator 屏幕的层次结构树的屏幕截图可能会有所帮助,特别是如果您可以突出显示您的“父”和潜在的子元素,理想情况下是父元素和至少一个子元素的属性.
  • 当然。例如,我想获取回收站视图的所有项目。好吧,我不是在谈论任何特定的层次结构树。我想构建一个包装类,它允许我找到给定 Appium Element(WebElement 类及其子类)对象的所有(无论哪种)子对象。

标签: android xpath appium children


【解决方案1】:

我找到了某种解决方法:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    这纯粹来自实验,但似乎 Appium 中的 xpath 处理实际上并不是以所选节点作为根开始(如您所料),而是使用一个假节点而不是仅包含当前节点作为子节点(然后是它下面的树)

    我尝试了以下方法:.//*/child::*,这似乎对我有用。

    【讨论】:

      猜你喜欢
      • 2016-12-28
      • 2020-01-27
      • 2022-01-22
      • 2016-11-20
      • 2016-08-14
      • 1970-01-01
      • 2013-11-01
      • 2014-10-23
      • 2015-12-17
      相关资源
      最近更新 更多