Selenium WebDriver偶尔会抛出超时异常

时间:2013-03-07 10:06:32

标签: c# .net testing selenium webdriver

在我们的项目中使用selenium进行ui测试。我们正在运行最新版本2.30.0。 我们使用Firefox WebDriver并运行Firefox 19.0。

一般来说,当我在Visual Studio中运行ui测试时,ui测试在本地甚至服务器端工作。我们的ui测试在我们的构建服务器上得到了很好的执行。它在我通过Visual Studio手动测试的同一台服务器上使用相同的部署。

但是,当ui测试在buildserver上执行时,偶尔会遇到以下问题:

Test(s) failed. OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://localhost:7056/hub/session/bed1d0e7-efdc-46b6-ba07-34903519c44d/element/%7B8717bb19-96c7-44d3-b0ee-d4b989ae652d%7D/click timed out after 60 seconds.
      ----> System.Net.WebException : The operation has timed out
       at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)
       at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
--WebException
   at System.Net.HttpWebRequest.GetResponse()
   at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)

基本上,测试点击上传按钮,其中输入字段之前填充了文件。由于文件非常小,因此可在几秒钟内完成。 然而,有时会达到60秒的时间。

有关如何隔离潜在问题的任何想法?或者之前让任何人遇到同样的问题? 任何提示赞赏。感谢。

8 个答案:

答案 0 :(得分:8)

我遇到了同样的错误:.NET WebDriver:2.37,FF:25.0.1。我注意到Firefox在我退出测试应用程序之前就锁定了,所以我构建了Firefox的调试版本,发现在写入stderr时发生了锁定。这给了我更改webdriver代码的线索,以便它不再重定向标准输出和错误,这解决了我的问题。似乎WebDriver以某种方式阻止了std错误。来自MSDN:

  

同步读取操作在调用者之间引入依赖关系   读取StandardError流和子进程写入   那条小溪。这些依赖项可能会导致死锁条件......

更多信息here

对于任何想要进行同样调整的人: -

  1. 获取Selenium来源。然后查看您正在使用的相同代码分支。

  2. 在FireFoxBinary.cs中:

    我。无论您在哪里找到RedirectStandardError = true,请更改为RedirectStandardError = false

    II。无论您在哪里找到RedirectStandardOutput = true,请更改为RedirectStandardOutput = false。 (对于非Windows,在Executable.cs中也有一个)

    III。在ConsoleOuput中,将'return this.stream.ReadToEnd()'更改为'return'“'

  3. 使用您的构建和替换WebDriver.dll。

  4. 免责声明:这对我有用,但您的问题可能会有所不同。另据我所知,除了禁用控制台输出之外,这没有任何副作用,但可能还有其他副作用,我不知道。

    我很想知道是否有其他人发现了同样的事情。

    既然我已经解决了我的问题,我就不会深入了解。如果Selenium组成员想要更多信息/日志/调整,我会很乐意这样做。

    希望很快就会得到修复。

    <强>更新

    目前似乎不支持Firefox v25。见this comment

    2014年2月25日更新

    请参阅this update

      

    好的,这个问题一般不会在IE中表现出来,或者说也是如此   似乎来自评论。我希望人们尝试使用Firefox和   Chrome和.NET绑定2.40.0(将是下一个版本的   写这篇文章的时间)或以后,看看这是否还在发生。

         

    自从2.35.0以来,我在Chrome浏览器中发现这种情况的报道较少,所以我   需要知道这是否仍然是.NET绑定和a的问题   最近的chromedriver.exe。

         

    2.40.0可能至少解决了Firefox中可能导致此问题的一个问题。

    这解决了我的问题。查看更改日志,从2014年1月31日开始提交以删除控制台日志记录重定向:

    "No longer redirecting console output for Firefox in .NET bindings."
    

    这是我在这里使用的解决方法。所以,这一切都有道理。

答案 1 :(得分:6)

在四种不同的情况下发生在我身上:

  1. 原因是我查询的窗口句柄已经关闭或处于关闭阶段。 如果是这种情况,最好在查询之前检查窗口是否仍然存在。 如果要避免60秒的超时超时,则应更改创建Firefox实例的方式以减少60秒延迟:

    新的FirefoxDriver(“FfBinaryPath”,FfProfileInstance,TimeSpan.FromSeconds(5));

  2. 原因是flash插件“保护模式”。 这种情况发生在我只在Windows 7和8下,当他们在Jenkins工作下运行时,暂停没有偶尔发生。 为了解决这个问题,我在禁用闪存安全模式的情况下运行了我的Firefox selenium实例:

    FfProfile.SetPreference(“dom.ipc.plugins.flash.disable-protected-mode”,true);

  3. 另一个原因,也是非常零星的,在Jenkins和Flash相关的情况下,在使用Firefox 45版时发生。为了解决这个问题,我不得不降级到版本44或者以替代方式卸载Flash。

    < / LI>
  4. 内部浏览器原因:有时浏览器需要超过一分钟才能响应Selenium调用。在这种情况下,将浏览器命令超时设置为60秒以上可以解决问题。例如:

    new FirefoxDriver("FfBinaryPath", FfProfileInstance, TimeSpan.FromMinutes(3));

答案 2 :(得分:4)

我在超时方面遇到了同样的错误。我正在使用IEDriverServer(64位)和长sendKey命令它会超时。

原因是默认超时似乎是60秒。

解决了我的问题是我使用一种方法实例化驱动程序,该方法可以让您输入IEDriverServer的位置,驱动程序的选项和超时值。

文档链接:http://seleniumhq.github.io/selenium/docs/api/dotnet/

InternetExplorerOptions options = new InternetExplorerOptions();
        IWebDriver driver = new InternetExplorerDriver("C:/Users/jeff/AppData/Local/Microsoft/WindowsApps", options, TimeSpan.FromSeconds(120));

参数

  1. InternetExplorerDriverServerDirectory
    • 类型:System.String
    • 包含IEDriverServer.exe
    • 的目录的完整路径
  2. 选项
    • 类型:OpenQA.Selenium.IE.InternetExplorerOptions
    • 用于初始化驱动程序的InternetExplorerOptions
  3. 的CommandTimeout
    • 类型:System.TimeSpan
    • 等待每个命令的最长时间
  4. 我的代码

    QCustomPlot

答案 3 :(得分:3)

在我的情况下,页面根本没有完全加载。一些facebook插件似乎加载太长时间。我尝试捕获异常并操纵不完整的dom,但这并没有给我任何结果。 :(

约翰

答案 4 :(得分:1)

我们的项目遇到了类似的问题。这个问题与Selenium或我们的应用程序无关。它超时了,因为该项目的构建服务器配置应该在5分钟内超时。但是我们所有的测试都没有在5分钟内完成,因此构建因随机超时问题而失败。

我们还遇到了firefox-19的问题,这些测试曾经随机失败。不知何故,firefox-10仅适用于我们的硒测试。

答案 5 :(得分:1)

试试这段代码:

  DesiredCapabilities caps = DesiredCapabilities.Firefox();   

 //set the timeout to 120 seconds
 IWebDriver driver = new RemoteWebDriver(new Uri("<app_url>"), caps, TimeSpan.FromSeconds(120));

答案 6 :(得分:1)

我也有同样的问题,但仅限于Firefox驱动程序。事实证明,它可能与您何时使用驱动程序Navigate方法有关,并且它尝试与页面进行过快的交互。调用下面的代码在Navigate上为我修复它(我也建议在FindElement之前使用它):

public void VerifyPageIsLoaded()
{
    var pageLoaded = false;

    for (var i = 0; i < DefaultTimeout.Timeout.Seconds; i++)
    {
        Thread.Sleep(1000);

        if (WebDriver.ExecuteJavaScript<string>("return document.readyState").Equals("complete"))
        //jQuery.active might cause problems on some browser or browserstack so I commented it out
        //&& WebDriver.ExecuteJavaScript<bool>("return jQuery.active == 0").Equals(true))
        {
            pageLoaded = true;
            break;
        }

        Thread.Sleep(1000);
    }

    if (!pageLoaded)
    {
        throw new Exception("Page was not with complete state)!");
    }
}

答案 7 :(得分:0)

public static IWebElement WaitForElementVisible(By selector, uint timeout = Config.DefaultTimeoutSec)
    {
        IWebDriver driver = Browser.Instance.Driver;

        if (timeout > 0)
        {
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));

            wait.Until(ExpectedConditions.ElementIsVisible(selector));
            return driver.FindElement(selector);
        }
        else
        {
            // Search for element without timeout 
            return driver.FindElement(selector);
        }
    }

我们使用它来防止这样的元素未发现失败,它就像一个魅力。

如果Element可以在那里,也有不同的版本,但不一定要可见。

只需使用ExpectedConditions.ElementExists(selector)代替ExpectedContitions.ElementIsVisible(selector)

edit:Browser.Instance.Driver是一个包含实例驱动程序的类