我正在使用带有Java和Selenium WebDriver的xpath从网页上的XML树中选择一个节点。我需要选择的节点是类="红色按钮"的超链接,并且是类="步骤"的div元素的后代(不是直接子级)。这是我的代码:
List<WebElement> goButton = driver.findElements(By.xpath("/div[@class="step"]/a[@class="red-button"]"));
if(goButton.get(0)!= null){
continueButton.get(0).click();
}
我需要等待红色按钮元素出现,因为它是动态加载的。这就是为什么我选择使用 findElements() 方法而不仅仅是 findElement()。我的理解是 findElements() 池化 DOM,直到它找到元素或超时。 当我运行我的代码时,我得到:
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
这意味着goButton为空,因此WebDriver找不到该元素。 我在 Java 逻辑中做错了什么,还是需要修复 xpath 查询?
您的 XPATH 不正确。
/div
将找到一个紧邻根 DOM 节点下的div。 您希望在开头//div
,//a
找到链接。 以下是一些解决方案。
使用CSS(比xpath更干净,更快)。
List<WebElement> goButton = driver.findElements(By.cssSelector("div.step a.red-button"));
使用 XPATH(如果你真的坚持使用它。
List<WebElement> goButton = driver.findElements(By.xpath("//div[@class='step']//a[@class='red-button']"));
由于您正在寻找后代,而不是孩子,因此您需要使用 xpath 的//
而不是/