为了账号安全,请及时绑定邮箱和手机立即绑定

Selenium:无法从父元素中提取子元素

Selenium:无法从父元素中提取子元素

幕布斯6054654 2022-07-14 09:44:54
我正在尝试使用以下结构单击元素:parentElement.findElement(XPath of Child Element);但是,这会抛出org.openqa.selenium.NoSuchElementException.我目前正在使用XPath:抓取(父)元素列表.//*[@id='savedCartViewForm']/div/div。这标识了正确的元素列表(按预期工作)。获得列表后,我将应用该功能:parentElement.findElement(By.xpath(XPath));使用XPath:.//input[contains(@aria-label,'Delete')]和.//input[contains(@value,'Delete')]然而这会触发org.openqa.selenium.NoSuchElementException。我已经在 SO 上研究了几个小时,并根据几篇文章添加了“。” 在两个斜杠之前,这意味着相对于父级(而不是相对于整个 DOM)。如果我删除点,我总是会得到页面上的第一个元素——而不是列表中每个父元素的子元素。
查看完整描述

3 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

我通过将我的更新XPath为:

/descendant::input[@value = 'Delete']

我现在能够识别正确的元素。但是,我仍然不清楚为什么原来的XPath不起作用,而这个起作用 - 因为根据几篇文章,我读到 '//' 是后代或自我的简写和 . 添加,以便搜索相对于父元素开始。所以这个原因对我来说仍然没有意义。

如果有人可以提供带有解释的更新答案,我将选择该答案作为问题的答案,而不是我自己的答案。


查看完整回答
反对 回复 2022-07-14
?
隔江千里

TA贡献1906条经验 获得超10个赞

使用 css 选择器而不是 xpath 尝试下面的代码。


List<WebElement> rows = driver.findElements(By.cssSelector("#savedCartViewForm .a-row"));

rows.forEach(row -> {

    WebElement deleteButton = row.findElement(By.cssSelector("input[value = 'Delete']"));

    System.out.println(deleteButton.getAttribute("aria-label"));

});

使用 xpath:


List<WebElement> rows = driver.findElements(By.xpath("//form[@id = 'savedCartViewForm']//div[contains(@class, 'a-row')]"));

rows.forEach(row -> {

    WebElement deleteButton = row.findElement(By.xpath(".//input[@value = 'Delete']"));

    System.out.println(deleteButton.getAttribute("aria-label"));

});


查看完整回答
反对 回复 2022-07-14
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

这是 Selenium 变得复杂的地方之一。Xpath 功能取决于几件事。

  1. 有些浏览器支持原生 Xpath,有些则不支持(假设这总是会发生变化)。

  2. 一些驱动程序使用本机浏览器实现,而另一些则不使用(假设这总是会发生变化)。

  3. 如果由于某种原因不支持本机,Selenium 将退回到 Wicked Good Xpath 支持。

对于不同的浏览器和不同的驱动程序二进制版本,您现在可能具有不同的功能。让我们假设所有本机实现都 100% 符合规范。

如果您遇到回退到 Wicked Good Xpath 的驱动程序二进制/浏览器版本,它并不完全 100% 符合规范,您可能会看到以下错误:

https://github.com/google/wicked-good-xpath/issues/43

现在请记住,Selenium 使用了 Wicked good Xpath 的分叉版本,因此它可能与上面的有所不同。从历史上看 // 在 Selenium 世界中并不意味着后代或自我,它意味着搜索整个 DOM。Wicked Good Xpath 的当前 Selenium 实现可在以下位置获得:

https://github.com/SeleniumHQ/selenium/tree/07a18746ff756e90fd79ef253a328bd7dfa9e6dc/third_party/js/wgxpath

由于您已经解决了问题的解决方案是后裔或自我,但由于速记版本“//”在 Wicked Good XPath 中意味着其他内容,因此您没有得到预期的结果。

TL;博士;

在为 Selenium 测试构建 Xpath 时不要使用 Xpath 简写。


查看完整回答
反对 回复 2022-07-14
  • 3 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信