StaleElementReferenceException:元素不再附加到DOM:硒(StaleE

2019-08-05 10:06发布

我完全新的自动化测试。 指一些教程后,我已经创建了一个自动化测试用例。 测试情况下,我尝试自动化是检查是否排序正确的工作后,我点击表格的标题之一。

我的自动化测试案例失败,出现以下异常:

org.openqa.selenium.StaleElementReferenceException: Element is no longer attached to the DOM
Command duration or timeout: 12 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/stale_element_reference.html
Build info: version: '2.25.0', revision: '17482', time: '2012-07-18 21:08:56'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '2.6.35-30-generic',     java.version: '1.6.0_20'
Driver info: driver.version: RemoteWebDriver
Session ID: 95b80ea0-26ac-45e0-a407-79f5b687504a
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:188)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:498)
at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:244)
at org.openqa.selenium.remote.RemoteWebElement.findElements(RemoteWebElement.java:169)
at org.openqa.selenium.remote.RemoteWebElement.findElementsByTagName(RemoteWebElement.java:240)
at org.openqa.selenium.By$ByTagName.findElements(By.java:312)
at org.openqa.selenium.remote.RemoteWebElement.findElements(RemoteWebElement.java:151)
at Sorting.sorting_column(Sorting.java:68)

以下是代码:

        //Fetching values from the column of a table
    WebElement table = driver.findElement(By.id("dnn_ctr381_View_DealerList_ctl00"));
    List<WebElement> rows = table.findElements(By.tagName("tr"));

    for (WebElement row : rows) {

        List<WebElement> cells = row.findElements(By.tagName("td"));
        if (!cells.isEmpty() && cells.get(0).isDisplayed()) {
            a = cells.get(0).getText();
        }
        b[i] = a;
        i++;
    }
    //Click on column header to sort   
    driver.findElement(By.cssSelector("html body#Body form#Form div#container.container div#Wrapper div#Main div#Panes div#ContentsContainer.box-shadow div#Contents div#Content div#dnn_ContentPane.MainContent div.DnnModule div.dnnPEMContNotitle div#dnn_ctr381_ContentPane.dnnPEMContNotitleBody div#dnn_ctr381_ModuleContent.DNNModuleContent div#dnn_ctr381_View_dnn_ctr381_View_DealerListPanel div#dnn_ctr381_View_DealerList.RadGrid table#dnn_ctr381_View_DealerList_ctl00.rgMasterTable thead tr th.rgHeader a")).click();
    WebElement table1 = driver.findElement(By.id("dnn_ctr381_View_DealerList_ctl00"));
    List<WebElement> rows1 = table1.findElements(By.tagName("tr"));
    for (WebElement row1 : rows1) {
        List<WebElement> cells1 = row1.findElements(By.tagName("td"));// Exception here
        if (!cells1.isEmpty() && cells1.get(0).isDisplayed()) 
            {

         c = cells1.get(0).getText();

       }

异常是从该行:

List<WebElement> cells = row1.findElements(By.tagName("td"));

有人可以请让我知道这个ISSE的原因以及如何解决?

任何帮助表示赞赏

Answer 1:

StaleElementException有没有告诉你,你已经在你的客户端代码引用(通过DOM元素findElement )不存在了。 在你的情况下, row1元素不存在了。 这当然是一个时机的问题,因为你的点击排序就在上面,并没有小心以确保排序已经完成。 如果没有排序是如何实现更深入的了解,还是需要多长时间,它会是我最好的猜测。 如果当您通过DOM对象循环排序结束后,这些将在DOM被重新排列,并在客户端代码丢失



Answer 2:

那么,StaleElement异常可真frustrating..escpecially铬司机工作时......但截至目前要解决的只是用我称之为原始等待的唯一途径:

try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

虽然纯粹主义者可能会说,我们正在使用幻数,但一旦你知道安全等待幅度以后,我知道它是有效的在95%以上的情况。



Answer 3:

使用webDriverwait ,使司机等到元素位于DOM。

WebDriverWait wait = new WebDriverWait(driver,20);

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*

[@id='mndf']/form/fieldset/table/thead/tr/th")));

使用输出语句中的元素是否位于与否。

System.out.println("element located");

我希望这有帮助。



Answer 4:

它与DOM改变监守一些JavaScript时的相互作用发生在页面上得到执行的事情。 因此,作为错误是这么说的解决办法是再做driver.findElement摆脱其元素已变得陈旧。 面对同样的问题,解决它



文章来源: StaleElementReferenceException: Element is no longer attached to the DOM: Selenium