查找后的陈旧元素
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
为了说明,我在 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