【问题标题】:Find parent of an element using Xpath in Appium在 Appium 中使用 Xpath 查找元素的父元素
【发布时间】:2020-04-25 23:02:49
【问题描述】:

这个问题很受欢迎,但我找到的答案对我不起作用。

所以,我有以下代码sn-p:

MobileElement room = driver.findElement (By.xpath ("//android.widget.TextView[@text = 'Test Room']"));
//Doing some stuff with the room element
MobileElement roomContainer = room.findElement (By.xpath ("./.."));

我得到了room 变量,用它做一些事情。然后我尝试搜索这个元素的父元素,但我得到了NoSuchElement 异常。

我尝试了不同的 Xpath 组合,但都没有奏效:

".//..",  "//..",  "/..",  ".."

但是,当我使用整个查询从驱动程序中搜索时,它可以工作:

driver.findElement (By.xpath ("//android.widget.TextView[@text = 'Test Room']/.."))

但在这种特殊情况下,我需要直接从 room 元素中搜索。有什么建议吗?

【问题讨论】:

  • ./.. 是跳转到直接父级的正确表达式。正如您已经提到它不起作用,请尝试在 Xpath 中使用 parent 函数。请添加 html,以便它帮助您获得正确的响应。
  • 你可以试试 '../..' 它指向父节点吗?
  • @Sooraj Android 中没有 HTML。我使用的是 Appium,而不是 Selenium。
  • @Muzzamil 试过了,没用。
  • @LexSav,对不起,我指的是应用源

标签: java android xpath automated-tests appium


【解决方案1】:

尽管您可以根据您的问题找到具有以下 xpath 的父节点。

driver.findElement (By.xpath ("//android.widget.TextView[@text = 'Test Room']/.."))

但是您想使用 ./.. 从当前子节点定位父节点,而不是为父节点编写完整的 xpath。

我们可以通过反向方法来实现它,我们可以为父节点编写完整的 xpath,我们可以在父节点中找到子节点,而不是整个页面或 DOM。

MobileElement roomContainer = driver.findElement (By.xpath ("//android.widget.TextView[@text = 'Test Room']/.."))

MobileElement room = roomContainer.findElement (By.xpath ("//android.widget.TextView[@text = 'Test Room']"));

OR

MobileElement room = roomContainer.findElement (By.id ("item_rooms_list_tv_room_name]"));

注意:父节点也有用于定位的资源 ID,但我不确定它是否唯一,因为我看不到其他 2 个 viewGroup 节点,所以我使用 xpath 作为父节点。

【讨论】:

  • 我明白了。那么有没有办法从子元素向上一个节点到父元素呢?我们只能从父母到孩子,仅此而已?
  • @LexSav 我们可以转到父节点,我在 appium-andriod 和 selenium 中使用 ./..。但它不适用于你的情况,我不能说它为什么会发生?但我试图为您提供类似的解决方案,但采用不同的方法。
【解决方案2】:

尝试使用以下 Xpath:

MobileElement roomContainer = room.findElement(By.xpath("./parent::android.view.ViewGroup"));

【讨论】:

  • 正如我已经提到的,完整的 Xpath 可以工作:"//android.widget.TextView[@text = 'Test Room']/.."。我对如何直接从特定元素上升一个节点感兴趣:room.findElement (By.xpath ("./.."));
  • 没用 :( 用点和斜线尝试了不同的变体。另外,用parentparent::node() 尝试了一些变体 - 结果是一样的。
【解决方案3】:

试试"//.."

示例: 你有 child_element

您的代码应如下所示:

child_element.findElement(By.xpath("//..")) should get parent

【讨论】:

  • 请在您的回答中添加描述,我还没有意识到您的建议
猜你喜欢
  • 2018-07-09
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
相关资源
最近更新 更多