【问题标题】:Stale element just after FindFind 之后的陈旧元素
【发布时间】:2021-09-22 18:34:18
【问题描述】:

我在 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() 上得到了异常,这对我来说毫无意义。

【问题讨论】:

  • DOM 要么仍在更新,要么在滚动后更新。你可能不需要那个卷轴。 click 方法将自动滚动到视图中。如果需要,您可以尝试/捕获单击调用...如果捕获到陈旧元素异常,请重新获取该元素。 (或者只是在滚动后或获取元素之前使用一段时间的睡眠,具体取决于导致过时元素的原因。)
  • 我添加了滚动条,因为它帮助我防止了其他一些异常,但这可能完全是一个不同的问题。

标签: java selenium grails groovy selenium-chromedriver


【解决方案1】:

有几种技术可以实现网页。在某些此类技术中,Web 元素会出现然后重新构建,以便 Selenium 将这些元素检测为可见/可点击,但这些元素会立即重新构建,因此初始引用变得陈旧。
使用 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

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多