2014-12-19 106 views
0

我已經設置了一個具有WebDriver.FindElements()屬性獲取值的類。Selenium WebDriver FindElements沒有返回足夠的值

public IList<IWebElement> ListObjectElements 
    { 
     get 
     { 
      var container = WebDriver.FindElement(By.Id("objects")); 
      return container.FindElements(By.XPath("//*[contains(@id, 'id_')]")); 
     } 
    } 

我還實現了測試用例來測試添加新功能。

所有步驟都成功了。當我嘗試在添加新後返回新列表時,它錯過了1個項目。

我設置了一個斷點來觀察值。該物業ListObjectElements有10個項目,但返回newList只有9

var newList = clientpage.ListObjectElements; 

    return newList; 

如果我添加了Thread.Sleep(),返回newList有10個項目與屬性相同ListObjectElements。

如何在不使用Thread.Sleep()的情況下得到準確的結果?

在此先感謝您的幫助。

+1

當訪問所需的元素時,可能最後一項沒有正確加載。請嘗試使用更大的隱含等待時間,以便將所有元素都計算在內。 – Subh 2014-12-19 07:03:50

+0

該屬性具有我需要的所有元素(10個項目),但從屬性分配的變量只有9個項目。 我也設置隱含等待10秒 – 2014-12-19 09:28:46

回答

2

聽起來您正在自動化的網站會將代表對象的元素動態添加到DOM,並且您的代碼將丟失在元素實際添加到DOM之前執行FindElements的競態條件。你需要在代碼中實現某種等待。您可能可以利用WebDriverWait構造,其中的.NET實現可在WebDriver.Support程序集中獲得。該結構可以類似於下面的方式來使用:

// Assumes 'driver' is a valid IWebDriver instance. 
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); 
wait.Until<bool>((d) => 
{ 
    return clientPage.ListObjectElements.Count > 9; 
}); 

更具體語境中你的測試用例把這將是這個樣子,這取決於你的架構和願望:

// Assume that the element you click on to add a new element 
// is stored in the variable 'element', and your IWebDriver 
// variable is 'driver'. 
int originalCount = clientPage.ListObjectElements.Count; 
element.Click(); 

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5)); 
wait.Until<bool>((d) => 
{ 
    return clientPage.ListObjectElements.Count > originalCount; 
}); 

return clientPage.ListObjectElements; 
+0

我發現了這個問題。這是因爲在添加新項目後有序列表。我應該意識到這一點。無論如何,感謝您的幫助。 – 2014-12-22 02:54:08

+0

對於許多新手Selenium人來說,這仍然非常有用,他們可能會嘗試獲取僅在xhr請求完成後纔會出現在頁面上的ajax搜索結果行,從而使Wait API成爲唯一選擇。 – 2017-05-25 11:33:19

相關問題