Selenium WebDriver偶尔抛出Timeoutexception

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

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

但是当uitesting在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) 

基本上,testing点击一个上传button,其中input字段之前填充了一个文件。 由于该文件非常小,因此可以在几秒钟内完成。 不过60秒钟的时间有时会达到。

任何想法如何隔离潜在的问题? 或者之前运行任何人到同一个问题? 任何提示赞赏。 谢谢。

我得到了同样的错误:.NET WebDriver:2.37,FF:25.0.1。 我注意到Firefox已经locking,直到退出我的testing应用程序,所以我构build了Firefox的debugging版本,发现写入stderr时发生了locking。 这给了我更改webdriver代码的线索,以便它不再redirect标准输出和错误,这解决了我的问题。 看来WebDriver以某种方式阻止了std错误。 来自MSDN:

同步读取操作引入StandardErrorstream的调用者读取和写入该stream的subprocess之间的依赖关系。 这些依赖关系可能会导致死锁情况…

更多信息在这里 。

对于任何想做出相同调整的人,我都做了:

  1. 获取selenium源。 然后检查你正在使用的相同的代码分支。

  2. 在FireFoxBinary.cs中:

    一世。 无论您在哪findRedirectStandardError = true ,都可以更改为RedirectStandardError = false

    II。 无论您在哪findRedirectStandardOutput = true ,都可以更改为RedirectStandardOutput = false 。 (对于非Windows,在Executable.cs中也有一个)

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

  3. 与您的WebDriver.dll构build和replace。

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

我会有兴趣知道是否有其他人发现相同的。

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

希望这将很快得到解决。

更新

看来,Firefox v25目前不支持。 看到这个评论 。

2014年2月25日更新

看到这个更新 :

好的,这个问题一般不会在IE中performance出来,或者从评论中看来是如此。 我希望人们尝试使用Firefox和Chrome,而.NET绑定2.40.0(将在本文编写之时将成为下一个版本)或更高版本,看看是否还在发生。

自从2.35.0以来,我在Chrome上看到的这种情况的报告更less,所以我需要知道这是否仍然是.NET绑定和最近的chromedriver.exe的问题。

2.40.0可能会解决至less一个在Firefox中可能导致这个问题的问题。

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

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

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

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

  1. 原因是我所查询的窗口句柄已经closures或者处于closures阶段。 如果是这种情况,最好在查询之前检查窗口是否存在。 如果您想避免60秒的超时时间,则应该更改创buildFirefox实例的方式,以减less60秒的延迟时间:

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

  2. 原因是Flash插件“保护模式”。 这种情况发生在我只在windows 7和8下运行的时候,他们在jenkins的工作下,超时并没有偶尔发生。 为了解决这个问题,我运行了Firefox Selenium实例,禁用了flash安全模式:

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

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

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

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

在我的情况下,该网页是不完全加载。 一些Facebook插件似乎加载太久。 我试图捕捉exception并操纵未完成的dom,但是这并没有给我任何结果。 🙁

约翰

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

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

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

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

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

参数

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

我的代码

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

我们在项目上面临类似的问题。 这个问题与Selenium或我们的应用程序无关。 这是超时,因为该项目的构build服务器configuration应该在5分钟内超时。 但是我们所有的testing在5分钟内都没有完成,因此由于超时问题,构build失败了。

我们还遇到了firefox-19的一个问题,testing用于随机失败。 不知何故,firefox-10只为我们的seleniumtesting工作。

试试这个代码:

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

我也有同样的问题,但只在Firefox驱动程序。 结果可能与您使用驱动程序Navigate方法有关,它会尝试与页面交互太快。 调用下面的代码在Navigate(我也build议在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)!"); } } 
 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); } } 

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

如果元素可以在那里,也有一个不同的版本,但不一定是可见的。

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

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