2016-10-25 69 views
2

我正在寫一個測試,我想驗證一個元素不存在於頁面上(顯示或以其他方式)。我讀過各種文章(如this one)如何使用空白或不空白列表執行元素檢測。這適用於驗證元素存在的相反測試。然而,當元素不存在,我一直得到一個WebDriverException超時後紡紗的60秒:See screenshot here當元素不在DOM中時,爲什麼Selenium Webdriver findElements(By.Id)會超時?

元素檢測功能是這樣的:

public bool isButtonPresent(string buttonType) 
    { 
     switch (buttonType) 
     { 
      case "Button 1": 
       return !(Driver.FindElements(By.Id("Button 1 ID Here")).Count == 0); 
      case "Button 2": 
       return !(Driver.FindElements(By.Id("Button 2 ID Here")).Count == 0); 
      case "Button 3": 
       return !(Driver.FindElements(By.Id("Button 3 ID Here")).Count == 0); 
     } 
     return false; 
    } 

謝謝您的時間!

+0

順便說一句,我正在運行Selenium 2.53.1 – Elininja

+2

似乎隱式等待被激活。在調用FindElements之前關閉它:driver.Manage()。Timeouts()。ImplicitlyWait(TimeSpan.FromMilliseconds(0));' –

+0

這就像一個魅力Florent一樣工作,謝謝!如果你可以把這個解決方案放在答案中,我很樂意標記它。另外,如果你有更詳細的解釋爲什麼這會起作用,那對我和其他未來的觀衆來說都是很好的選擇。 – Elininja

回答

1

下面是選項:
選項1:

// Specify the amount of time the driver should wait when searching for an element if it is not immediately present. Specify this time to 0 to move ahead if element is not found. 
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0)); 
// InvisibilityOfElementLocated will check that an element is either invisible or not present on the DOM. 
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(byLocator)); 

通過這種方法,如果你的下一個動作是點擊任何元素,有時你會得到一個錯誤(org.openqa.selenium.WebDriverException :點擊(411,675)處的元素無法點擊Chrome瀏覽器。它可以在Firefox中正常工作。

選項2:

// Set the implicit timeout to 0 as we did in option 1 
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(0)); 
WebDriverWait wait = new WebDriverWait(Driver.Browser, new TimeSpan(0, 0, 15)); 
try 
{ 
    wait.Until(FindElement(By)); 
} 
catch(WebDriverException ex) // Catch the WebDriverException here 
{ 
    return; 
} 

在這裏,我們正在等待隱爲0,找到的元素。如果元素不存在,它會嘗試接下來的15秒(您可以方便地更改此數字)。如果超時,請完成該功能。

選項3:

Sudeepthi已經提示它。

Drivers._driverInstance.FindElement(by).Displayed; 
2

會有這樣的工作嗎?

public static bool IsElementPresent(By by) 
{ 
    try 
    { 
     bool b = Drivers._driverInstance.FindElement(by).Displayed; 
     return b; 
    } 
    catch 
    { 
     return false; 
    } 
} 
+0

謝謝Sudeepthi,現在通過我的測試。 :)問題是,這意味着WebDriver在異常被捕獲之前正在旋轉一分鐘。所以,當正面情況只需要約40秒時,測試需要4分鐘。我仍在尋找一種方法來提高效率。 – Elininja

0

另一種解決方案是使用明確的等待。在Java(僞代碼,你就必須翻譯)像這樣的工作:

wait.until(ExpectedConditions.not(ExpectedConditions.invisibilityOfElementLocated(by)), 10, 1000) 

,將等待,直到出現在頁面上的元素,輪詢一次,共10秒鐘。

相關問題