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之间的依赖关系。 这些依赖关系可能会导致死锁情况…
更多信息在这里 。
对于任何想做出相同调整的人,我都做了:
-
获取selenium源。 然后检查你正在使用的相同的代码分支。
-
在FireFoxBinary.cs中:
一世。 无论您在哪find
RedirectStandardError = true
,都可以更改为RedirectStandardError = false
。II。 无论您在哪find
RedirectStandardOutput = true
,都可以更改为RedirectStandardOutput = false
。 (对于非Windows,在Executable.cs中也有一个)III。 在ConsoleOutput中,将“return this.stream.ReadToEnd()”改为“return”“'
-
与您的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."
这是我在这里使用的解决方法。 所以,这一切都是有道理的。
在四种不同的情况下发生在我身上:
-
原因是我所查询的窗口句柄已经closures或者处于closures阶段。 如果是这种情况,最好在查询之前检查窗口是否存在。 如果您想避免60秒的超时时间,则应该更改创buildFirefox实例的方式,以减less60秒的延迟时间:
新的FirefoxDriver(“FfBinaryPath”,FfProfileInstance,TimeSpan.FromSeconds(5));
-
原因是Flash插件“保护模式”。 这种情况发生在我只在windows 7和8下运行的时候,他们在jenkins的工作下,超时并没有偶尔发生。 为了解决这个问题,我运行了Firefox Selenium实例,禁用了flash安全模式:
FfProfile.SetPreference(“dom.ipc.plugins.flash.disable-protected-mode”,true);
-
另一个原因,也是非零星的,在Jenkins和Flash相关的情况下,使用Firefox版本45时发生。为了解决这个问题,我必须降级到版本44或者替代地卸载Flash。
-
内部浏览器的原因:有时浏览器需要超过一分钟才能响应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 )
参数
- InternetExplorerDriverServerDirectory :
- types:System.String
- 包含IEDriverServer.exe的目录的完整path
- 选项
- types:OpenQA.Selenium.IE.InternetExplorerOptions
- InternetExplorerOptions用于初始化驱动程序
- 的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是包含实例化驱动程序的类