4

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

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

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

有人可以让我知道这个问题的原因以及如何解决吗?

任何帮助表示赞赏

4

4 回答 4

9

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

于 2013-01-03T09:54:00.760 回答
4

好吧,StaleElement 异常可能真的很令人沮丧……尤其是在使用 chrome 驱动程序时……但到目前为止,唯一的解决方法是简单地使用我所谓的 Raw 等待:

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

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

于 2013-11-19T11:43:52.283 回答
2

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

我希望这有帮助。

于 2014-07-11T14:32:33.743 回答
0

这与 DOM 更改有关,因为当页面上发生交互时会执行一些 javascript。因此,由于错误表明元素已过时,因此解决方案是再次执行 driver.findElement 以摆脱它。遇到同样的问题并解决了

于 2015-05-14T05:25:09.203 回答