2

いくつかのヘルパー メソッドでいくつかの 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;
    }
});

この状況では、適切な例外がキャッチされます。謎解き!

4

1 に答える 1

0

これはロングショットかもしれませんが、私が持っている唯一の考えは、2 つのNoSuchElementExceptionクラス間に名前の競合があり、コードがもう一方をスローしている間に名前空間からアクセスできる方を処理しているということです。

于 2012-12-21T13:55:44.917 に答える