我有以下屏幕快照中概述的方案:


因此,我构建了一些代码,这些代码将允许我单击左侧的条形图。每次,它都会在右侧显示关系条形图。如果条形图在左侧特别大,则可能需要一段时间才能显示右侧的关系条形图。为了解决这个问题,我建立了一个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

09-19 22:13