2017-02-03 24 views
0

我已經使用點擊頁面上的某些下拉菜單下面的方法:爲什麼在下面的方法中拋出StaleElementReferenceException?

protected void selectIthElementOffAllDropDowns(String selectElement, int entryOfDropdown) { 

    ICollection<IWebElement> allElements = driver.FindElements(By.CssSelector(selectElement)); 

    foreach(IWebElement element in allElements) { 
     if(element.IsDisplayed) { 
      new SelectElement(element).SelectByIndex(entryOfDropdown); 
     } 
    } 
} 

的代碼按預期執行時間70%左右。但是,它偶爾會拋出一個StaleElementReferenceException。當這個被拋出它在該行拋出:

new SelectElement(element).SelectByIndex(entryOfDropdown); 

什麼我不明白的是element.IsDisplayed怎麼是真實的,但根據當元素已經完全或者刪除被拋出此錯誤的硒文檔here該元素不再附加到DOM。任何人都可以解釋如何引發這個錯誤?另外,爲什麼if語句中的條件是真的,如果這個錯誤被正確地拋出?

注:我使用chromedriver運行這些測試與OpenQA.Selenium

回答

0

這通常發生在發現的元素,做它的行動之間的頁面重新加載。

在做任何動作之前,務必確保元素在那裏。

在您使用foreach做一些動作與對象的列表/陣列/收藏,如果在任何時候在頁面加載,然後這些對象丟失這種情況下,他們不會被視爲附加到頁面。

問題在於,在找到對象後,頁面會更改狀態或重新加載=>您有一個未連接到頁面的對象,並且無法使用它。如果你有多個對象,並且你循環它們,那麼陳舊元素的機會將會有更高的速度。

我不知道下面的例子有多正確:假設你有頁面的對象/頁面的一個實例,你搜索某個元素並且你有元素的對象,頁面重新加載=>實例丟失並且新建一個,現在你有一些對象不會被記錄到頁面對象中,它們不會被附加到這個頁面,類似的元素在那裏,但不是你的對象,你將不得不尋找和爲您的元素創建新對象。

它可以隨時更改,包括在if條件被評估並輸入if之後。

相關問題