【问题标题】:Test throws StaleElementReferenceException: either the element is no longer attached to the DOM or the page has been refreshed测试抛出 StaleElementReferenceException:元素不再附加到 DOM 或页面已刷新
【发布时间】:2017-10-13 07:53:19
【问题描述】:

我查看了在线论坛和本网站上的讨论并添加了等待功能。但是,它继续显示此错误 这是问题的代码:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import com.google.common.base.Function;

public class WebDriverNavigate {
    public static void main(String[] args) throws InterruptedException {
    System.setProperty("webdriver.gecko.driver",System.getProperty("user.dir")+"/GeckoDriver/geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
        driver.navigate().to("http://www.google.com");
        WebElement textbox = driver.findElement(By.id("lst-ib"));
        textbox.sendKeys("Search on Google");       
        WebDriverWait wait = new WebDriverWait(driver,10);
        wait.until(visibilityOfElementLocated(By.id("lst-ib")));
        driver.findElement(By.name("btnK")).click();;
        textbox.clear();                
        textbox.sendKeys("This is the second search");
        WebElement searchbutton2 = driver.findElement(By.id("fZl"));
        searchbutton2.click();
        driver.navigate().back();
        driver.navigate().forward();
        driver.navigate().refresh();

    }

    private static Function<WebDriver,WebElement> visibilityOfElementLocated(final By locator) {
        return new Function<WebDriver, WebElement>() {
            @Override
            public WebElement apply(WebDriver driver) {
                return driver.findElement(locator);
            }
        };
    }
}

这是 HTML sn-p:

<input class="gsfi" id="lst-ib" maxlength="2048" name="q" autocomplete="off" title="Search" value="Search on Google" aria-label="Search" aria-haspopup="false" role="combobox" aria-autocomplete="list" style="border: medium none; padding: 0px; margin: 0px; height: auto; width: 100%; background: transparent url(&quot;data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw%3D%3D&quot;) repeat scroll 0% 0%; position: absolute; z-index: 6; left: 0px; outline: medium none;" dir="ltr" spellcheck="false" type="text">

控制台上的错误消息:

线程“main”中的异常 org.openqa.selenium.StaleElementReferenceException:元素引用过时:元素不再附加到 DOM 或页面已刷新

【问题讨论】:

    标签: selenium-webdriver selenium-firefoxdriver


    【解决方案1】:

    我多次遇到这个问题,有时无法解决。

    首先,您应该找到具有 Wait 或 WaitFluent selenium 类的元素。因为也许您尝试在元素尚未加载之前找到它。类似的东西:

    new FluentWait<WebDriver>(driver)
                .withTimeout(IMPLICIT_TIMEOUT, TimeUnit.SECONDS)
                .pollingEvery(RETRY_TIME, TimeUnit.SECONDS)
                .ignoring(StaleElementReferenceException.class,
                          NoSuchElementException.class)
                .until(ExpectedConditions
                .visibilityOfElementLocated(By.xpath(xpath)));
    

    另一种方法是在 for 中尝试多次,其中包含 driver.sleep()。

    【讨论】:

    • 谢谢!看来我的代码重新排列错误。我已经回答了我是如何解决这个特定问题的。不过,我知道您的建议对我以后遇到类似问题很有用。
    • 欢迎您。如果它们有用,您可以投票给答案。
    【解决方案2】:

    大多数情况下,这是由于 DOM 正在更新并且您尝试访问更新/新元素。所以this Question&Answers 应该覆盖你。

    您也可以查看Selenium Documentation

    在大多数情况下explicit wait 有效。

    或者你可以忽略错误,直到元素可以点击

    new WebDriverWait(driver, timeout).ignoring(StaleElementReferenceException.class).until(ExpectedConditions.elementToBeClickable(By.name("btnK")));
    driver.findElement(By.name("btnK")).click();
    

    【讨论】:

    • 我尝试了您提供的代码。但是,它仍然显示相同的错误。我将尝试查看 Questions&Answers 中的其他解决方案是否有效。谢谢
    • 谢谢!看来我的代码重新排列错误。我已经回答了我是如何解决这个特定问题的。不过,我知道您的建议对我以后遇到类似问题很有用。
    【解决方案3】:

    我能够通过按以下顺序重新排列代码来解决问题:

            WebElement searchbutton = driver.findElement(By.name("btnK"));
            driver.findElement(By.name("btnK")).click();
            WebDriverWait wait = new WebDriverWait(driver,10);
            WebElement text2 = wait.until(visibilityOfElementLocated(By.id("lst-ib")));
            text2.clear();  
    

    看起来我试图在 click() 之前等待,但应该在 click() 之后但在 clear() 之前等待元素加载 现在它不会抛出那个错误

    感谢大家的建议和解决方案。我相信它们将来会在更复杂的代码问题中有用。

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 2014-06-06
      相关资源
      最近更新 更多