我正在使用一些辅助方法包装一些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;
}
}
在某些情况下,我正在测试我希望 not 存在的元素,所以我捕获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 docs不完整,但Ruby docs稍微有点指导性。所以我认为正在发生的是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;
}
});
在这种情况下,会捕获相应的异常。神秘解决了!
答案 0 :(得分:0)
这可能是一个很长的镜头,但我唯一的想法是,两个NoSuchElementException
类之间可能存在名称冲突,并且您正在处理可从命名空间访问的类,而代码正在抛出另一个