尝试/捕获不处理Selenium2 FindElement的异常

时间:2012-12-21 13:10:03

标签: .net try-catch selenium-webdriver

我正在使用一些辅助方法包装一些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;
    }
});

在这种情况下,会捕获相应的异常。神秘解决了!

1 个答案:

答案 0 :(得分:0)

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