2014-02-06 116 views
2

有時候,當我執行這樣的代碼:硒的webdriver - StaleElementReferenceException使用點擊()時

webDriver.findElement(By.xpath("//*[@class='classname']")).click(); 

我得到這個異常: org.openqa.selenium.StaleElementReferenceException:元素不再附加到DOM 我知道我可以重試,但是有誰知道爲什麼會發生這種情況,以及我如何防止它發生?

+0

似乎這個元素已從Document中刪除。也許有些JavaScript刪除它。也許你的代碼執行得太快,並且該元素不會出現在一些JavaScript邏輯之後? –

+0

看看這個 - [陳舊元素引用異常](http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp) – Husam

回答

0
webDriver.findElement(By.xpath("//*[@class='classname']")) 

返回一個WebElement對象。

WebElement對象始終將一個節點引用到HTML DOM樹(在您的Web瀏覽器的內存中)。

當DOM樹中的節點不再存在時,您會得到此異常。 WebElement對象仍然存在,因爲它位於JVM的內存中。這是一種「斷鏈」。您可以調用WebElement上的方法,但它們會失敗。

2

我有同樣的問題。

我的解決辦法是:

webDriver.clickOnStableElement(By.xpath("//*[@class='classname']")); 
... 
     public void clickOnStableElement(final By locator) { 
      WebElement e = new WebDriverWait(driver, 10).until(new ExpectedCondition<WebElement>(){ 
       public WebElement apply(WebDriver d) { 
        try { 
         return d.findElement(locator); 
        } catch (StaleElementReferenceException ex) { 
         return null; 
        } 
       } 
      }); 
      e.click(); 
     } 

希望它會幫助你。 ;)

+0

這真的幫了我。非常感謝你。 – user1853840