Selenium Error - 对远程WebDriver的HTTP请求在60秒后超时

时间:2014-03-11 10:13:22

标签: c# selenium selenium-webdriver nunit teamcity

我一直在使用Selenium数月,我们用它来自动化我们的一些内部测试流程。脚本一直很好。我最近使用FF 27.01升级到C#2.40.0 webdriver,我们的脚本现在在随机位置失败,出现以下错误。

[Portal.SmokeTest.SmokeRunTest.Booking] TearDown method failed. OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL htt(p)://localhost:7055/hub/session/56e99e88-ba17-4d12-bef1-c6a6367ccc2f/element timed out after 60 seconds.
  ----> System.Net.WebException : The operation has timed out
TearDown : OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL htt(p)://localhost:7055/hub/session/56e99e88-ba17-4d12-bef1-c6a6367ccc2f/window timed out after 60 seconds.
  ----> System.Net.WebException : The operation has timed out
[09:01:20]
[Portal.SmokeTest.SmokeRunTest.Booking] TearDown method failed. OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL htt(p)://localhost:7055/hub/session/56e99e88-ba17-4d12-bef1-c6a6367ccc2f/element timed out after 60 seconds.
  ----> System.Net.WebException : The operation has timed out
TearDown : OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL htt(p)://localhost:7055/hub/session/56e99e88-ba17-4d12-bef1-c6a6367ccc2f/window timed out after 60 seconds.
  ----> System.Net.WebException : The operation has timed out
   at OpenQA.Selenium.Support.UI.DefaultWait`1.PropagateExceptionIfNotIgnored(Exception e)
   at OpenQA.Selenium.Support.UI.DefaultWait`1.Until[TResult](Func`2 condition)
   at Portal.Test.Helpers.Process_Bookings.OpenBookings.SelectBooking(String bookingnumber)
   at Portal.SmokeTest.SmokeRunTest.Booking() in d:\TeamCityAgent\work\dac1dcea7f2e80df\SmokeTests\SmokeRunTest.cs:line 68
--WebException
   at System.Net.HttpWebRequest.GetResponse()
   at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)
--TearDown
   at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)
   at OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command commandToExecute)
   at OpenQA.Selenium.Firefox.Internal.ExtensionConnection.Execute(Command commandToExecute)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Close()
   at Portal.Test.Helpers.Setup.CloseWebdriver()
   at Portal.SmokeTest.SmokeRunTest.TearDown() in d:\TeamCityAgent\work\dac1dcea7f2e80df\SmokeTests\SmokeRunTest.cs:line 162
--WebException
   at System.Net.HttpWebRequest.GetResponse()
   at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)

我设法追踪到一行代码的最新错误:

_setup.driver.FindElement(By.XPath("//button[@class='buttonSmall lockBookingButton']")).Click();

令人讨厌的是,尝试解决问题很困难,就像我在本地计算机上运行测试一样,在调试过程中。另外,如果我通过构建机器上的NUNIT运行程序运行它,我正在运行测试,它也会通过。在使用Teamcity时,它似乎只是作为我们的自动构建运行过程的一部分而失败。就像我说的,这个问题已经好几个月了,并且唯一改变的是selenium webdriver套件。

之前我遇到过这个问题,在调试时,当调用Click()代码行时,Firefox似乎锁定了,只有停止测试才能让Firefox继续运行。这里有很多建议,包括修改webdriver源码?如果可能的话,如果有其他人可以提供任何建议,我不想走这条路。

19 个答案:

答案 0 :(得分:18)

new FirefoxDriver(new FirefoxBinary(),new FirefoxProfile(),TimeSpan.FromSeconds(180));

使用上面的代码行启动浏览器。它对我有用。

答案 1 :(得分:17)

我有一个类似的问题,使用Chrome驱动程序(v2.23)/通过TeamCity运行测试。我可以通过在Chrome选项中添加“no-sandbox”标记来修复此问题:

var options = new ChromeOptions();
options.AddArgument("no-sandbox");

我不确定FF驱动程序是否有类似的选项。根据我的理解,该问题与TeamCity在SYSTEM帐户下运行Selenium有关。

答案 2 :(得分:13)

我几个月前第一次遇到这个问题(也在click()命令上),从那以后它一直是我的问题。这似乎是.NET Selenium绑定的某种问题。这个关于IE驱动程序的人的博客文章有助于解释发生了什么:

http://jimevansmusic.blogspot.com/2012/11/net-bindings-whaddaymean-no-response.html

不幸的是,似乎并不能解决这个问题。每当此问题提交给Selenium开发人员(see here)时,这都是typical response

  

我们需要一个可重现的方案,必须包含一个示例页面或指向公共网站页面的链接,以便重现该问题。

如果您能够提交一致且可重复的测试用例,这可能会非常有助于将此错误放在一起。

也就是说,也许你可以在此期间尝试这种解决方法。如果您尝试click()的HTML按钮具有包含Javascript的onclick属性,请考虑使用JavascriptExecutor直接执行该代码,而不是调用click()命令。我发现直接执行onclick Javascript可以让我的一些测试通过。

答案 3 :(得分:3)

有类似的问题。尝试在驱动程序的构造函数中设置更多时间 - 添加例如。

var timespan = TimeSpan.FromMinutes(3);

var driver = new FirefoxDriver(binary, profile, timeSpan);

答案 4 :(得分:3)

在我的情况下,我的按钮的类型为submit而不是button,我将Click更改为Sumbit,然后将每件作品都更改为好。如下所示,

来自driver.FindElement(By.Id("btnLogin")).Click();

driver.FindElement(By.Id("btnLogin")).Submit();

顺便说一下,我已经尝试过这篇文章中的所有答案但不适合我。

答案 5 :(得分:2)

我认为当您尝试在

之后访问您的Web驱动程序对象时会出现此问题

1)窗口已关闭,您尚未切换到父

2)你切换到一个尚未准备就绪的窗口,并且在你切换后已经更新

等待windowhandles.count成为您期望的内容并不会考虑页面内容,也不会记录document.ready。我还在寻找解决这个问题的方法

答案 6 :(得分:2)

就我而言,这是因为我删除了chrome更新文件夹。重新安装chrome后,一切正常。

答案 7 :(得分:2)

Firefox也有同样的问题。我切换到带有选项的Chrome,此后一切都很好。

ChromeOptions options = new ChromeOptions();
 options.AddArgument("no-sandbox");

 ChromeDriver driver = new ChromeDriver(ChromeDriverService.CreateDefaultService(), options, TimeSpan.FromMinutes(3));
 driver.Manage().Timeouts().PageLoad.Add(System.TimeSpan.FromSeconds(30));

答案 8 :(得分:1)

在我的情况下,我发现在我们的团队构建服务器中发生了此错误。这些测试适用于我们当地的开发机器。

问题是目标网站在构建服务器上配置不正确,因此无法正确打开浏览器。

我们使用的是镀铬驱动程序,但我不确定是否有所作为。

答案 9 :(得分:1)

问题在于Click()的评估超过了您的构建环境..您可能想要了解Click()上发生的事情。

另外,尝试为Click()添加Retrys,因为根据网络速度等,评估需要更长的时间

答案 10 :(得分:0)

我在运行测试时也看到了这个问题,所以一直在寻找“为什么”和“如何修复”。

我最初的想法(在查看了屏幕截图失败和超时消息之后)是网站性能一定变得更糟,并且网站需要更长的时间来做一些导致问题的事情。

我找到了很多解决方案(我打算尝试)但是,似乎大多数解决方案都表明网站性能(反应时间)变慢了。如果您必须将等待 30 秒更改为等待 3 分钟,这确实可以让测试通过……但这是否意味着我们必须等待大约 3 分钟才能让网站执行某些操作?

问题:此错误消息是否有 90% 的时间可归因于网站性能下降?我阅读了上面提到的一些网站,听起来问题也可能与 chromedriver 导致延迟有关(可能与应用程序问题无关)。是否有人将此问题提交给他们的应用程序开发团队,或者您只是更改等待时间而不报告?

答案 11 :(得分:0)

在Windows Server上运行带有计划任务的无头ChromeDriver时,我遇到了同样的异常(无人值守)。为我解决的是以用户“ 管理员”的身份运行任务(请注意最后是S)。从任务“条件”选项卡的“任何连接”中选择了我也所做的(我不知道它是否相关)。

答案 12 :(得分:0)

就我而言,以上所有答案均无法完全解决我的问题。 我最终使用(no-sandbox)模式,具有延长的超时时间(driver = new RemoteWebDriver(new Uri("http://localhost:4444/wd/hub"), capability, TimeSpan.FromMinutes(3));)和页面加载超时(driver.Manage().Timeouts().PageLoad.Add(System.TimeSpan.FromSeconds(30));)的连接,所以现在我的代码如下:

    public IWebDriver GetRemoteChromeDriver(string downloadPath)
    {
        ChromeOptions chromeOptions = new ChromeOptions();
        chromeOptions.AddArguments(
            "start-maximized",
            "enable-automation",
            "--headless",
            "--no-sandbox", //this is the relevant other arguments came from solving other issues
            "--disable-infobars",
            "--disable-dev-shm-usage",
            "--disable-browser-side-navigation",
            "--disable-gpu",
            "--ignore-certificate-errors");
        capability = chromeOptions.ToCapabilities();

        SetRemoteWebDriver();
        SetImplicitlyWait();
        Thread.Sleep(TimeSpan.FromSeconds(2));
        return driver;
    }
    
    private void SetImplicitlyWait()
    {
        driver.Manage().Timeouts().PageLoad.Add(TimeSpan.FromSeconds(30));
    }


    private void SetRemoteWebDriver()
    {
        driver = new RemoteWebDriver(new Uri("http://localhost:4444/wd/hub"), capability, TimeSpan.FromMinutes(3));
    }

但是,正如我提到的,上述方法都不能解决问题,我不断收到错误消息,并且多个chromedriver.exe和chrome.exe进程处于活动状态(大约10个chromedriver和大约50个chrome)。

所以我在某处读到,在配置驱动程序之后,我应该等待几秒钟,然后再开始下一个测试,因此我在处理方法中添加了以下行:

    driver?.Quit();
    driver?.Dispose();
    Thread.Sleep(3000);

通过这种睡眠修改,我不再遇到超时错误,并且没有不必要地打开chromedriver.exe和chrome.exe进程。

希望我能像我那样长期帮助那些在这个问题上苦苦挣扎的人。

答案 13 :(得分:0)

Arrrgh!今天在 macOS 上遇到了这个问题,问题很简单-远程CI构建服务器上显示弹出窗口,提示安装新的 Appium 版本。

只需VNC,然后单击“ 稍后安装”即可对其进行修复。

答案 14 :(得分:0)

我们遇到了同样的问题。在我们的例子中,浏览器被登录弹出窗口(Windows身份验证)阻止,因此60秒后不会返回。向运行Chrome的Windows帐户添加正确的访问权限可以解决此问题。

答案 15 :(得分:0)

new FirefoxDriver(binary, profile, timeSpan)已过时。

您现在可以改为使用new FirefoxDriver(FirefoxDriverService.CreateDefaultService(), FirefoxOptions options, TimeSpan commandTimeout)

还有一个new FirefoxDriver(string geckoDriverDirectory, FirefoxOptions options, TimeSpan commandTimeout),它确实可以工作。但这是未记录的,即使已经在geckoDriverDirectory中,您也需要手动指定Path

答案 16 :(得分:0)

就我而言,问题出在SendKeys() and Remote Desktop上。发布到目前为止的解决方法:

  

我进行了Selenium测试,当它作为Jenkins作业的一部分在vSphere托管并通过RDP管理的节点上运行时会失败。经过一些故障排除后,事实证明,如果远程桌面已连接并聚焦,则可以成功,但是如果远程桌面已断开连接或什至最小化,则失败。

     

作为一种解决方法,我通过vSphere Console而不是RDP登录,然后即使关闭vSphere后测试也不再失败。这是一种解决方法,但我必须小心,永远不要通过RDP登录,而始终只能通过vSphere Console进行管理。

答案 17 :(得分:0)

将Selenium.WebDriver.ChromeDriver从2.40.0更改为2.27.0对我来说没问题

答案 18 :(得分:-1)

对于ChromDriver,以下对我有用:

string chromeDriverDirectory = "C:\\temp\\2.37";
 var options = new ChromeOptions();
 options.AddArgument("-no-sandbox");
 driver = new ChromeDriver(chromeDriverDirectory, options, 
 TimeSpan.FromMinutes(2));

Selenium 3.11版,ChromeDriver 2.37