2016-10-25 16 views
2

私は要素がページに表示されていない(表示されているかそうでないか)ことを確認したいテストを書いています。私はさまざまな記事(this oneのような)を読んで、要素の検出を空のリストで行う方法を読んだ。それは要素が存在することを確認する反対のテストでうまく動作します。しかし、要素が存在しない場合、私は一貫して、回転の60秒後にWebDriverExceptionタイムアウトを取得しています: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

暗黙の待機がアクティブになっているようです。 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 :Chromeブラウザでポイント(411,675)で要素をクリックできません)。それは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:

スデープリーは既に提案しています。

2

このようなものはありますか?

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

ありがとうSudeepthi、今私のテストに合格しています。 :)問題は、例外がキャッチされる前にWebDriverが各ボタンの1分間回転していることを意味します。したがって、陽性の症例が約40秒しかかからない場合は、検査に4分かかります。私はもっ​​と効率的なアプローチを実現する方法を探しています。 – Elininja

0

別の解決方法は明示的な待機を使用します。 Javaでは(擬似コード;あなたは変換する必要があると思い)このような何かが働くだろう:

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

要素がページに表示されるまで、10秒ごとに、ポーリングを待機します。ここで

関連する問題