Selenium - 尝试单击几个“删除”按钮,但获取StaleElementReferenceException

时间:2015-07-27 19:28:51

标签: java html selenium selenium-webdriver

我试图通过找到所有相应的“删除”按钮然后单击它们来删除页面上的多个元素。但是,我收到了一个'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(); }

1 个答案:

答案 0 :(得分:1)

制作无限循环,当你找不到更多“删除”按钮时退出:

while (true) {
    try {
        SeleniumCommands.waitClickByCss("[id^=removeForm_]");
    } catch (TimeoutException e) {
        break;
    }

    SeleniumCommands.waitClickById(ManageCommands.CONFIRMMODALOKBUTTON);
}

如有必要,请添加明确的等待。