2013-01-03 63 views
3

我對自動化測試完全陌生。在參考一些教程後,我創建了一個自動化測試用例。我嘗試自動化的測試用例是在點擊某個表頭之後檢查排序是否正確。StaleElementReferenceException:元素不再連接到DOM:Selenium

我自動化測試用例失敗,但以下情況除外:

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

可有人請讓我知道這個問題的原因以及它如何解決?

任何幫助表示讚賞

+0

大量的討論在http://stackoverflow.com/questions/16166261/selenium-webdriver-stale-element-reference-exception。可能的欺騙? –

回答

6

StaleElementException有沒有告訴你,你已經在你的客戶端代碼引用(由findElement)DOM元素不存在了。在你的情況下,row1元素不再存在。這當然是一個時間問題,因爲點擊排序就在上面,並且不用擔心確保排序已經完成。如果沒有更多的瞭解如何實施,或需要多長時間,這將是我最好的猜測。如果排序結束,而你遍歷你的DOM對象,這些都將在DOM被重新排列,並在客戶端代碼丟失

3

好,StaleElement異常可真frustrating..escpecially同時用鍍鉻司機的工作......但作爲現在要解決的唯一方法就是用我稱之爲原始等待:

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

雖然純粹主義者可能會說,我們正在使用幻數,但一旦你知道安全等待幅度以後,我就知道在超過95%的情況下有效。

1

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

我希望這會有所幫助。

0

這是關於DOM改變,因爲一些JavaScript在頁面上發生交互時執行。所以如錯誤說元素已經過時,所以解決方法是再次執行driver.findElement以消除它。面臨同樣的問題,並解決它

相關問題