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

我正在尝试使用以下结构单击元素:

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)。

如果我删除点,我总是会得到页面上的第一个元素——而不是列表中每个父元素的子元素。


幕布斯6054654
浏览 191回答 3
3回答

慕沐林林

我通过将我的更新XPath为:/descendant::input[@value = 'Delete']我现在能够识别正确的元素。但是,我仍然不清楚为什么原来的XPath不起作用,而这个起作用 - 因为根据几篇文章,我读到 '//' 是后代或自我的简写和 . 添加,以便搜索相对于父元素开始。所以这个原因对我来说仍然没有意义。如果有人可以提供带有解释的更新答案,我将选择该答案作为问题的答案,而不是我自己的答案。

隔江千里

使用 css 选择器而不是 xpath 尝试下面的代码。List<WebElement> rows = driver.findElements(By.cssSelector("#savedCartViewForm .a-row"));rows.forEach(row -> {&nbsp; &nbsp; WebElement deleteButton = row.findElement(By.cssSelector("input[value = 'Delete']"));&nbsp; &nbsp; 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 -> {&nbsp; &nbsp; WebElement deleteButton = row.findElement(By.xpath(".//input[@value = 'Delete']"));&nbsp; &nbsp; System.out.println(deleteButton.getAttribute("aria-label"));});

Smart猫小萌

这是 Selenium 变得复杂的地方之一。Xpath 功能取决于几件事。有些浏览器支持原生 Xpath,有些则不支持(假设这总是会发生变化)。一些驱动程序使用本机浏览器实现,而另一些则不使用(假设这总是会发生变化)。如果由于某种原因不支持本机,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 简写。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java