【问题标题】:Selenium WebDriver throws Timeout exceptions sporadicallySelenium WebDriver 偶尔抛出超时异常
【发布时间】:2013-02-22 11:28:28
【问题描述】:

在我们的项目中使用 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 秒的超时。

任何想法如何隔离根本问题?或者以前遇到过同样的问题? 任何提示表示赞赏。谢谢。

【问题讨论】:

  • 什么浏览器和那个浏览器的版本?
  • @Arran 感谢您的提示。更新了问题。
  • 只是好奇,自从更新到 FF 19 后,这种情况发生得更多了吗?
  • 这个问题是this issue在issue tracker中的体现。代码库中this changeset 中的错误消息已更改。有一个blog post 解释了最终解决问题的困难。
  • 当文件 100% 完成时,页面中是否有任何变化?以前没有的东西。 (例如文本说“文件上传现已完成”。如果答案是肯定的,您可以编写一个简单的循环,尝试在相当长的时间(120 秒)内抓取该元素,然后再尝试单击上传按钮。如果它失败意味着上传出现问题或网站运行速度相当慢。

标签: c# .net testing selenium webdriver


【解决方案1】:

我遇到了同样的错误:.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

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

    三。在 ConsoleOutput 中,将 'return this.stream.ReadToEnd()' 更改为 'return ""'

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

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

我很想知道其他人是否也有同样的想法。

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

希望这会很快得到解决。

更新

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

2014 年 2 月 25 日更新

this update

好的,这个问题一般不会在 IE 中表现出来,或者它 从 cmets 看来。我希望人们尝试使用 Firefox 和 Chrome 和 .NET 绑定 2.40.0(将是 写这篇文章的时间)或以后,看看这是否仍在发生。

自 2.35.0 以来,我在 Chrome 中看到的这种情况发生的报告越来越少,所以我 需要知道这是否仍然是 .NET 绑定和 最近的 chromedriver.exe。

2.40.0 可能会修复至少一个在 Firefox 中可能导致此问题的问题。

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

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

这是我在这里使用的解决方法。所以,这一切都说得通。

【讨论】:

  • 使用 Selenium.2.43.1,FireFoxBinary.cs 上没有名为 RedirectStandardError 的参数。我在构建服务器上遇到与 Firefox32 相同的错误...
  • @demokritos - 根据上次更新,在 2.40.0 及更高版本中进行了修复以删除重定向。因此,您遇到的问题很可能是由其他问题引起的。
【解决方案2】:

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

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

    new FirefoxDriver("FfBinaryPath", FfProfileInstance, TimeSpan.FromSeconds(5));

  2. 原因是 Flash 插件“保护模式”。 这种情况仅在 Windows 7 和 8 下发生在我身上,当时他们在 Jenkins 作业下运行,超时并没有偶尔发生。 为了修复它,我在禁用 flash 安全模式的情况下运行了我的 Firefox selenium 实例:

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

  3. 在使用 Firefox 版本 45 时,发生了在 Jenkins 下与 Flash 相关的另一个非偶发原因。为了解决此问题,我不得不降级到版本 44 或卸载 Flash。

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

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

【讨论】:

    【解决方案3】:

    我在超时时遇到了同样的错误。我使用的是 IEDriverServer(64 位)并且在长的 sendKey 命令上它会超时。

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

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

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

    public InternetExplorerDriver(
        string internetExplorerDriverServerDirectory,
        InternetExplorerOptions options,
        TimeSpan commandTimeout
    )
    

    参数

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

    我的代码

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

    【讨论】:

    • 什么是IEDriverServer.exe btw,我们可以在哪里下载?但在我的情况下是 Firefox。谢谢
    【解决方案4】:

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

    约翰

    【讨论】:

      【解决方案5】:

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

      我们还遇到了 firefox-19 的问题,测试过去常常随机失败。不知何故,firefox-10 仅适用于我们的 selenium 测试。

      【讨论】:

        【解决方案6】:

        试试这个代码:

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

        【讨论】:

        • 感谢提示,会试一试。
        【解决方案7】:

        我也有同样的问题,但只是在 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)!");
            }
        }
        

        【讨论】:

          【解决方案8】:
          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 not found 失败,它就像一个魅力。

          如果元素可以存在,则还有一个不同的版本,但不必是可见的。

          只需使用ExpectedConditions.ElementExists(selector) 而不是ExpectedContitions.ElementIsVisible(selector)

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

          【讨论】:

            猜你喜欢
            • 2016-09-16
            • 2018-07-14
            • 2017-07-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-21
            • 2012-05-17
            • 1970-01-01
            相关资源
            最近更新 更多