我正在尝试在一些辅助方法中包装一些 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”,但我显然正在处理该异常。
这不是一个关键问题,因为我不会在我的最终解决方案中使用这种模式 - 我主要只是在玩不同的想法,并且有更好的方法来做到这一点,但我很好奇为什么当我清楚地处理它时,这个异常是未处理的。
编辑
有趣的是,即使我添加了一个泛型
catch (Exception) {
return false;
}
对于它仍然没有被抓住的方法。
编辑 2
实际上我在上面说错了 - 通用异常最终被捕获,但是当它到达那里时,它是一个 WebDriverTimeoutException。
这是啊哈!片刻:
WebDriverWait.Until() 只抛出 WebDriverTimeoutException;.Net 文档不完整,但Ruby 文档的指导性稍强一些。所以我认为正在发生的是 lambda 抛出了我期望的异常类,并且在适当的等待期之后,WebDrierWait.Until() 抛出了 WebDriverTimeoutException。我可以通过将我的 try/catch 块移动到 lambda 中来确认这一点,因此:
wait.Until(drvr => {
try {
drvr.FindElement(by);
return true;
} catch (OpenQA.Selenium.NotFoundException) {
return false;
} catch (System.TimeoutException) {
return false;
} catch (Exception) {
return false;
}
});
在这种情况下,将捕获适当的异常。谜团已揭开!