【问题标题】:Try/Catch not handling exceptions from Selenium2 FindElementTry/Catch 不处理来自 Selenium2 FindElement 的异常
【发布时间】:2012-12-21 13:10:03
【问题描述】:

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

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

【问题讨论】:

  • 我无法谈论您的异常处理问题,但通常我通过使用 getElements() 并检查结果列表中的大小为 0 来检查缺失的元素。
  • @BobPaulin 这正是我的计划。
  • @cori,在这样的时代,看看Selenium的源码:selenium.googlecode.com
  • 非常有用:没有发现这会返回“WebDriverTimeout”异常,而不是其他地方的“TimeoutException”。

标签: .net try-catch selenium-webdriver


【解决方案1】:

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

【讨论】:

  • 好主意,但不;它们都是 OpenQA.Selenium.NoSuchElementExeption。为了安全起见,我想,我完全合格了,还尝试捕获 OpenQA.Selenium.NotFoundException,它是 NoSuchElementException 的父类 - 在任何一种情况下都没有乐趣......
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 2016-09-13
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多