我正在使用xpath与Java和Selenium WebDriver从网页上的XML树中选择一个节点。我需要选择一个节点,它是一个带有class =“red-button”的超链接,并且是一个带有class =“step”的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为null,因此WebDriver无法找到该元素。我在Java逻辑中做错了什么,还是需要修复xpath查询?
答案 0 :(得分:0)
您的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的//
而不是/