我有以下屏幕快照中概述的方案:
因此,我构建了一些代码,这些代码将允许我单击左侧的条形图。每次,它都会在右侧显示关系条形图。如果条形图在左侧特别大,则可能需要一段时间才能显示右侧的关系条形图。为了解决这个问题,我建立了一个fluentWait方法,如下所示:
public static void fluentWaitOnRelationalBarChartSelector(InternetExplorerDriver driver)
{
WebElement relationalBarSelect = (new WebDriverWait(driver, 20))
.until(ExpectedConditions.elementToBeClickable(By.tagName("rect")));
relationalBarSelect.click();
}
但是,并非总是如此,但有时,在控制台中出现如下错误:
Exception in thread "main" org.openqa.selenium.StaleElementReferenceException: Element is no longer valid
(WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 33 milliseconds
我不确定的是为什么在我等待20秒后33毫秒后会发生这种超时?有什么办法可以满足我
StaleElementReferenceException
的需求吗?任何帮助,将不胜感激。
最佳答案
StaleElementReferenceException
是一个非常痛苦且非常具体的元素。通常,这意味着该元素由于与您的设置有关的很多问题而无法与硒交互。为了解决这个问题,人们使用了两种不同的机制(至少据我所知)。 FluentWait
可能会挽救您的生命。类似于以下内容:
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
取自here。值得一提的是,它还允许您等待忽略其他异常的元素。
如果这不起作用,则估计可能足以使该元素准备进行交互的循环次数。不是我的最爱,但可以。
public void StaleElementHandleByID (String elementID){
int count = 0;
while (count < 4){
try {
WebElement yourSlipperyElement= driver.findElement(By.id(elementID));
yourSlipperyElement.click();
} catch (StaleElementReferenceException e){
e.toString();
System.out.println("Trying to recover from a stale element :" + e.getMessage());
count = count+1;
}
count = count+4;
}
取自here