查找后的陈旧元素

Stale element just after Find

为了说明,我在 Groovy 中使用 ChromeDriver。

我知道,如果您保存一个元素,页面发生变化,然后您尝试访问它,通常会出现陈旧元素异常。 但我的问题是,当我刚刚获得它时,有时会随机出现该错误。

我的代码看起来像这样:

def elem = new WebDriverWait(driver, timeout).until(ExpectedConditions.elementToBeClickable(By.xpath(xpath)))
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", elem)
elem.click()

在 elem.click() 上我得到了异常,这对我来说毫无意义。

有多种技术可以实现网页。在某些此类技术中,Web 元素出现然后重新构建,以便 Selenium 将这些元素检测为 visible/clickable,但这些元素会立即重新构建,因此初始引用变得陈旧。
使用 Selenium 在此类页面上工作的最简单的解决方法是使用 try-catch 的循环,如下所示:

public boolean retryingFindClick(String xpath) {
    int attempts = 0;
    while(attempts < 5) {
        try {
            def elem = new WebDriverWait(driver, timeout).until(ExpectedConditions.elementToBeClickable(By.xpath(xpath)))
            ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", elem)
            elem.click()
            return true;
        } catch(StaleElementException e) {
        }
        attempts++;
    }
    return false;
}

有关详细信息,请参阅 here