いくつかのヘルパー メソッドでいくつかの Selenium2 API 呼び出しをラップして遊んでいますが、例外をキャッチしていても、予想される例外が処理されません。コードは次のとおりです。
public static bool IsElementPresent(this IWebDriver driver, By by)
{
var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5));
wait.IgnoreExceptionTypes(new Type[] { typeof(WebDriverException) });
try
{
wait.Until(drvr => drvr.FindElement(by));
return true;
}
catch (NoSuchElementException)
{
return false;
}
catch (System.TimeoutException)
{
return false;
}
}
場合によっては、存在しないと予想される要素に対してテストを行っているため、NoSuchElementException をキャッチして false を返します。呼び出しコードは次のようになります。
bool areYouThere = IsElementPresent(driver, By.CssSelector("li[name=elementThatsNotInTheDom");
wait.Until(drvr => drvr.FindElement(by));
「NoSuchElementException was unhandled by user code」というメッセージが表示されてデバッガーで呼び出しが停止しますが、その例外を明確に処理しています。
最終的な解決策ではこのパターンを使用しないため、これは重大な問題ではありません。ほとんどの場合、さまざまなアイデアをいじっているだけで、これを行うためのより良い方法がありますが、その理由について非常に興味がありますこの例外は、私が明確に処理しているときは処理されません。
編集
興味深いことに、ジェネリックを追加しても
catch (Exception) {
return false;
}
メソッドにはまだキャッチされていません。
編集2
実際、私は上記のミスポーク - 一般的な例外は最終的にキャッチされますが、そこに到達すると WebDriverTimeoutException として発生します。
そしてこちらがアハ!一瞬:
WebDriverWait.Until() は WebDriverTimeoutException のみをスローします。.Net ドキュメントは不完全ですが、Ruby ドキュメントはもう少し有益です。したがって、ラムダが期待する例外クラスをスローし、適切な待機期間の後、WebDrierWait.Until() が WebDriverTimeoutException をスローすると考えられます。これは、try/catch ブロックをラムダに移動することで確認できます。
wait.Until(drvr => {
try {
drvr.FindElement(by);
return true;
} catch (OpenQA.Selenium.NotFoundException) {
return false;
} catch (System.TimeoutException) {
return false;
} catch (Exception) {
return false;
}
});
この状況では、適切な例外がキャッチされます。謎解き!