2014-01-31 48 views
1

Selenium Webdriver + java。 我的代碼:Selenium Webdriver。錯誤'org.openqa.selenium.StaleElementReferenceException:元素不再有效'

public List<UserData> getUsers() { 
     List<UserData> users = new ArrayList<UserData>(); 
     WebElement userList = driver.findElement(By.id("Users")); 
     isElementDisplayed(By.xpath("//table[@id='Users']/*/tr[position() > 1]"), 10); 
     List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='Users']/*/tr[position() > 1]")); 
     for (WebElement tableRow : tableRows) {  
      List<WebElement> cells = tableRow.findElements(By.tagName("td")); 
      UserData user = new UserData(); 
      user.fio = cells.get(2).getText(); 
      user.login = cells.get(3).getText(); 
      user.rank = cells.get(4).getText(); 
      user.cabinet = cells.get(5).getText(); 
      users.add(user); 
      }  
     return users; 

}

後,我從表中刪除用戶,方法拋出:

org.openqa.selenium.StaleElementReferenceException:元素沒有 不再有效

here:

List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='Users']/*/tr[position() > 1]")); 

如何解決此錯誤,而無需刷新頁面?

請注意! 這不是

Element is no longer attached to the DOM 

錯誤

+0

函數'isElementDisplayed(by,int)'在做什麼? – n1r3

+0

我有一種感覺,錯誤與您在代碼中指定的那個行上面的行有關,您在其中調用'isElementDisplayed'。請提供此方法的代碼。 –

回答

0

我在想,刪除用戶重建通過JavaScript DOM的一部分。因此,雖然頁面沒有重新加載,但html已經改變,導致Selenium拋出一個陳舊元素。如果html被重建,Selenium說所有以前發現的元素現在都是陳舊的,必須重新提供。

即使原始元素仍處於新刷新的DOM中,也會發生這種情況。如果它已被重建Selenium認爲最好是安全然後抱歉,因此使一切無效。

0

我可以部分解決問題。 在行:

List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='Users']/*/tr[position() > 1]")); 

,我用我的方法waitForStableElements

... 
List<WebElement> tableRows = waitForStableElements(By.xpath("//table[@id='Users']/*/tr[position() > 1]")); 
... 
     public List<WebElement> waitForStableElements(final By locator) { 
      return new WebDriverWait(driver, 10).until(new ExpectedCondition<List<WebElement>>(){ 
       public List<WebElement> apply(WebDriver d) { 
       try { 
        return d.findElements(locator); 
       } catch (StaleElementReferenceException ex) { 
        return null; 
       } 
       } 
      }); 
      } 

它工作正常。 但「StaleElementReferenceException」錯誤是行反正拋出:

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

反正我有刪除用戶後刷新頁面。 希望這可以幫助解決類似問題的人。 感謝您的回答! ;)

相關問題