3 回答
TA贡献2016条经验 获得超9个赞
我通过将我的更新XPath
为:
/descendant::input[@value = 'Delete']
我现在能够识别正确的元素。但是,我仍然不清楚为什么原来的XPath
不起作用,而这个起作用 - 因为根据几篇文章,我读到 '//' 是后代或自我的简写和 . 添加,以便搜索相对于父元素开始。所以这个原因对我来说仍然没有意义。
如果有人可以提供带有解释的更新答案,我将选择该答案作为问题的答案,而不是我自己的答案。
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"));
});
TA贡献1911条经验 获得超7个赞
这是 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 实现可在以下位置获得:
由于您已经解决了问题的解决方案是后裔或自我,但由于速记版本“//”在 Wicked Good XPath 中意味着其他内容,因此您没有得到预期的结果。
TL;博士;
在为 Selenium 测试构建 Xpath 时不要使用 Xpath 简写。
添加回答
举报