为什么Selenium WebDriver无法在catch子句

时间:2015-04-22 13:06:16

标签: c# internet-explorer selenium selenium-webdriver webdriver

我正在尝试使用Internet Explorer开发一个用于点击内容的黑客攻击。我的目标是让我可以使用一种方法,首先尝试正常的Click(),如果失败将执行SendKeys("\n"),这似乎是公认的解决方法。

这是我的尝试

public void ClickByCssSelectorIeSafe(string cssSelector)
{
    try
    {
        _driver.FindElement(By.CssSelector(cssSelector)).Click();
    }
    catch (WebDriverException)
    {
        _driver.FindElement(By.CssSelector(cssSelector)).SendKeys("\n");
    }
}

当单击成功时,一切正常,但是当我在try子句中得到WebDriverException时,catch子句中的FindElement失败,即使它在try子句中成功。为什么呢?

另一个有趣的观点是,在某些情况下,我可以看到Click()在浏览器中成功,但它仍会抛出异常并最终出现在catch子句中。

我想要这个,因为我们在Chrome,Firefox和IE中运行我们的测试,我不希望IE浏览器无处不在。

catch子句中失败的FindElement的异常消息如下所示

A first chance exception of type 'OpenQA.Selenium.WebDriverException' occurred in WebDriver.dll

Additional information: The HTTP request to the remote WebDriver server for URL 
http://localhost:58124/session/21337088-7630-4709-a902-0a5d1bc7a669/element timed out after 60 seconds.

try子句中单击失败的异常消息如下所示

A first chance exception of type 'OpenQA.Selenium.WebDriverException' 
occurred in WebDriver.dll

Additional information: The HTTP request to the remote WebDriver server for URL 
http://localhost:58124/session/21337088-7630-4709-a902-0a5d1bc7a669/element/bcee1534-00e6-4155-b4cc-7171db39f112/click timed out after 60 seconds.

2 个答案:

答案 0 :(得分:1)

尝试将代码更改为以下内容,以便解决问题。

public void ClickByCssSelectorIeSafe(string cssSelector)
{
    IWebElement element = null;
    try
    {
        element = _driver.FindElement(By.CssSelector(cssSelector));
        element.Click();
    }
    catch (NoSuchElementException e)
    {
        Console.WriteLine("element not found. {0}", e.Message);
        //do something here when your element is not found
    }
    catch (WebDriverException e)
    {
        if (element != null) element.SendKeys("\n");
    }
}

现在你会知道在找到元素或点击它时是否抛出异常并且仍然​​能够处理这两种情况。

但是,看起来你在这两种情况下都会出现超时问题,这表明浏览器/ AUT挂起/没有响应。检查selenium服务器和节点日志以获取更多信息,以找出抛出异常之前发生的事情。

答案 1 :(得分:1)

我最终在日志中找到了这个:D 2015-04-27 14:01:08:497 Browser.cpp(379) Browser busy property is true.,它引导我朝着正确的方向前进。

我面临的问题似乎是网页很忙,并且不允许我与之互动。我找到了一个建议here来设置 页面加载超时并在发生这种情况时处理(吞下)异常。那很有效。

换句话说,如果页面繁忙,我只是吞下异常,如果因某些其他原因导致点击失败,我会执行SendKeys("\n")黑客攻击。

所以当我初始化我的驱动程序时,我会这样做:

driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5));

我的扩展方法现在看起来像这样:

    public static void ClickWithIeHackFailover(this IWebElement element)
    {
        try
        {
            element.Click();
        }
        catch (WebDriverException e)
        {
            if (e.Message != "Timed out waiting for page to load.")
            {
                element.SendKeys("\n");
            }
        }
    }

感谢@ user903039帮助我找到问题。