本文介绍了StaleElementReferenceException:元素不再附加到 DOM:Selenium的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对自动化测试完全陌生.在参考了一些教程后,我创建了一个自动化测试用例.我尝试自动化的测试用例是在单击表格的一个标题后检查排序是否正确.

I am completely new to automation testing. After referring some tutorials, I have created an automated test case. The test case I try to automate is to check whether the sorting worked correctly after I click on one of the headers of a table.

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

My automated test case fails with the following exception:

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"));

谁能告诉我这个问题的原因以及如何解决?

Can someone please let me know the cause of this isse and how it can be resolved?

感谢任何帮助

推荐答案

StaleElementException 是为了告诉您,您在客户端代码中引用的 DOM 元素(通过 findElement) 不再存在.在您的情况下, row1 元素不再存在.这肯定是一个时间问题,因为您点击排序就在上面,并且没有注意确保排序已经完成.如果没有更深入地了解排序是如何实现的,或者需要多长时间,这将是我最好的猜测.如果在您遍历 DOM 对象时排序结束,这些将在 DOM 中重新排列并丢失在您的客户端代码中

StaleElementException is there to tell you that a DOM element that you've referenced in your client code (by a findElement) doesn't exist anymore. In your case, the row1 element doesn't exist anymore. It is certainly a timing issue, as your click to sort is just above, and no care is taken to ensure the sort has finished. Without more insight in how the sort is implemented, or how long it takes, it'd be my best guess. If the sort ends while you iterate through your DOM objects, these will be rearranged in the DOM and lost in your client code

这篇关于StaleElementReferenceException:元素不再附加到 DOM:Selenium的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-30 08:58