2016-07-26 60 views
0

工作時,如何在StaleElementReferenceException我們定義我們的頁面對象與@FindBy註釋,如:與PageFactory

@FindBy(name="foo") 
WebElement fooElement; 

每當我調用這個對象fooElement,需要嘗試與識別上述name=foo,對不對?

那麼爲什麼我會得到StaleElementReferenceException

如何克服這一點?

我不希望在這裏(比第工廠等)再次按照另一種方法,每當我看到StaleElement這樣的:

WebElement fooElement=driver.findElement(By.name("foo")) 

有人可以幫我在這?

+1

請描述你的enviorement,語言你正在使用或框架。 –

回答

-1

例外StaleElementReferenceException意味着位於的元素不再出現在頁面中。通常在目標元素位於頁面更改之前和剛剛使用時添加。 這裏是展示問題的示例:

// trigger the update of the page 
driver.findElement(By.name("foo1")).click(); 

// at this step the page is not yet updated, so the located element is not from the updated page. 
WebElement element = driver.findElement(By.name("foo2")); 

// at this step, the page is updated, the element is now deleted 
element.click(); // throws `StaleElementReferenceException` 

爲了解決這個問題,你可以等待上一個元素變得陳舊:

fooElement1.click(); 

new WebDriverWait(driver, 10) 
    .until(ExpectedConditions.stalenessOf(fooElement1)); 

fooElement2.click(); 

您也可以等待新的元素變得可見:

new WebDriverWait(driver, 10) 
    .until(ExpectedConditions.visibilityOf(fooElement3)); 

fooElement2.click(); 

底線是,你需要等待這可能是異步更新的結果的特定狀態。

請注意,一個簡單的方法是重試,它會再次找到元素並給出新的參考。但我不會推薦它,因爲該命令可以在更新前執行:

try { 
    fooElement.click(); 
} catch (StaleElementReferenceException ex) { 
    fooElement.click(); 
} 
+0

「異常StaleElementReferenceException意味着找到的元素不再出現在頁面中......」這不太準確。如果底層DOM節點以任何方式(或其父層)發生了變化,則會拋出異常。該元素可能仍然存在,但需要重新找到。捕捉異常後重新找到元素的最終選項可能是處理此問題的最佳方法。 –

+0

@Aaron戴維斯,感謝您的意見,但我不同意。只有在頁面中不存在找到的元素(文檔或DOM)時纔會引發此異常。驅動程序(至少Firefox和Chrome)檢查該元素是主容器的後代,它是窗口或框架中的「文檔」對象。只要元素附加到文檔中,即使您更改了祖先,後代或移動元素,也不會引發異常。 –

+0

嗯,只是再次檢查文件。據說,當元素被刪除或從DOM中刪除元素(例如元素被定位,然後JS庫刪除底層DOM節點並用具有相同信息的另一個DOM節點替換它)時發生異常。 http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp –

0

它的工作對我來說..

public static void StaleHandle(WebElement element) 
    { 
     for(int i=0; i<5;i++) 
     try 
     { 
      // whatever actions performed by the element. 
      break; 
     } 
     catch(StaleElementReferenceException e) 
     { 

      System.out.println("Trying to recover from a stale element :" + e.getMessage()); 

     } 

    } 
相關問題