我试图通过找到所有相应的“删除”按钮然后单击它们来删除页面上的多个元素。但是,我收到了一个'StaleElementReferenceException',因为我从DOM中删除了元素,并且不确定如何优雅地解决这个问题。
这是我的代码:
List<WebElement> removeButtons = SeleniumCommands.findElementsByCss("[id^=removeForm_]");
System.out.println(removeButtons.size());
for (int i = removeButtons.size()-1; i >= 0; i--) {
SeleniumCommands.wait.until(ExpectedConditions.visibilityOf(removeButtons.get(i)));
removeButtons.get(i).click();
SeleniumCommands.waitClickById(ManageCommands.CONFIRMMODALOKBUTTON);
}
}
以下是删除按钮的一些HTML ...
<input id="removeForm_615" class="btn remove-task btn-danger" type="button" form_id="615" value="Remove" name="removeForm_615"/>
每个removeForm在下划线后面都有唯一的ID。
是否有更有效的方法以这种方式从DOM中删除元素,以便在for循环风格或类似方法中摆脱我的StaleElementReferenceException?
更新:这是当前编辑的代码:
while (true) {
try {
SeleniumCommands.waitClickByCss("[id^=removeForm_]");
} catch (NoSuchElementException e) {
break;
}
SeleniumCommands.waitClickById(ManageCommands.CONFIRMMODALOKBUTTON);
try { Thread.sleep(500); } catch (InterruptedException ie) { ie.getMessage(); }
}
当我执行此操作时,我收到了TimeoutException
,因为它仍在继续尝试查找By.selector: [id^=removeForm_]
内容。如何修复它以便按预期抛出NoSuchElementException
?
供参考:
public static void waitClickByCss(String css) { wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(css))).click(); }
答案 0 :(得分:1)
制作无限循环,当你找不到更多“删除”按钮时退出:
while (true) {
try {
SeleniumCommands.waitClickByCss("[id^=removeForm_]");
} catch (TimeoutException e) {
break;
}
SeleniumCommands.waitClickById(ManageCommands.CONFIRMMODALOKBUTTON);
}
如有必要,请添加明确的等待。