.net Try/Catch不处理来自Selenium2 FindElement的异常

.net Try/Catch不处理来自Selenium2 FindElement的异常,.net,try-catch,selenium-webdriver,.net,Try Catch,Selenium Webdriver,我正在一些助手方法中包装一些Selenium2API调用,但即使我捕获了预期的异常,也没有处理它们。代码如下: public static bool IsElementPresent(this IWebDriver driver, By by) { var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5)); wait.IgnoreExceptionTypes(new Type[] { typeof(WebDriverE

我正在一些助手方法中包装一些Selenium2API调用,但即使我捕获了预期的异常,也没有处理它们。代码如下:

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;
    }
}
在某些情况下,我针对一个我希望不存在的元素进行测试,因此我捕获NosTouchElementException并返回false;调用代码如下所示:

bool areYouThere = IsElementPresent(driver, By.CssSelector("li[name=elementThatsNotInTheDom");
wait.Until(drvr=>drvr.FindElement(by))调用在调试器中停止,并显示“NoTouchElementException未被用户代码消息处理”,但我显然正在处理该异常

这不是一个关键问题,因为我不打算在我的最终解决方案中使用此模式-我主要只是在玩弄不同的想法,有更好的方法来实现这一点,但我非常好奇,为什么在我清楚地处理它时,此异常未得到处理

编辑

有趣的是,即使我添加了一个泛型

catch (Exception) {
    return false;
}
对于这个方法来说,它仍然是未知的

编辑2

实际上,我在上面说错了——最终捕获到了通用异常,但当它到达那里时,它是一个WebDriverTimeoutException

这是啊哈!时刻:

WebDriverWait.Until()只抛出WebDriverTimeoutException;这些建议是不完整的,但这些建议更具启发性。因此,我认为发生的是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;
    }
});

在这种情况下,将捕获相应的异常。谜团解开了

这可能不太可能,但我唯一的想法是,两个
NoSuchElementException
类之间可能存在名称冲突,您正在处理可从命名空间访问的一个类,而代码正在抛出另一个类。

我无法说明异常处理的问题,但通常我会使用getElements()检查缺少的元素并在结果列表中检查大小是否为0。@BobPaulin这正是我的计划。@cori,在这种情况下,请查看Selenium的源代码:非常有用:没有发现这会返回“WebDriverTimeout”异常而不是其他地方的“TimeoutException”。这是一个好主意,但不是;它们都是OpenQA.Selenium.NoSuchElementExeption。为了安全起见,我想,我完全限定了它,并尝试捕获OpenQA.Selenium.NotFoundException,这是NoTouchElementException的父类-在任何情况下都没有乐趣。。。。