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

Posted

技术标签:

【中文标题】Selenium 错误 - 对远程 WebDriver 的 HTTP 请求在 60 秒后超时【英文标题】:Selenium Error - The HTTP request to the remote WebDriver timed out after 60 seconds 【发布时间】:2014-04-14 21:07:27 【问题描述】:

我已经使用 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 源?如果其他人可以提供任何建议,我希望尽可能不走那条路。

【问题讨论】:

我们在几个使用此设置的独立项目中遇到了完全相同的问题,但仍然没有解决方法。我们最好的选择是降级到旧版本的 WebDriver 和 Firefox 程序集。我们也不知道这种行为是由 WebDriver 还是 Firefox 引起的。 【参考方案1】:

我在使用 Chrome 驱动程序 (v2.23) / 通过 TeamCity 运行测试时遇到了类似的问题。我可以通过在 Chrome 选项中添加“no-sandbox”标志来解决这个问题:

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

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

【讨论】:

这也解决了我的问题。在几个月没有尝试之后,我无法再运行 chrome 测试了。谢谢fightc2 我的代码在 IIS 托管环境中运行良好并突然停止,但在我的单元测试中仍然有效。添加此行使其在 IIS 环境中再次工作。谢谢! 我把它命名为var options = new ChromeOptions(); options.AddArgument("--no-sandbox"); 现在在 C# 版本的 Webdriver 3.14 中工作。【参考方案2】:
new FirefoxDriver(new FirefoxBinary(),new FirefoxProfile(),TimeSpan.FromSeconds(180));

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

【讨论】:

也为我们修复了。当运行一个只创建 FF 驱动程序的基本脚本时,60 秒的超时在 100% 的时间里起作用。当运行我们的资源繁重的脚本时,它会在打开 FF 之前立即打开与数据库的连接/读取/写入/执行更多操作,60 超时将导致大约 50% 的时间失败。将超时时间增加到 3 分钟解决了这个问题。似乎 Webdriver 只需要多一点时间来让引擎预热。【参考方案3】:

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

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

不幸的是,这个问题似乎没有真正的解决方案。每当向 Selenium 开发人员 (see here) 提出此问题时,这是typical response:

我们需要一个可重现的场景,其中必须包含一个示例页面或指向可以重现问题的公共站点页面的链接。

如果您能够提交始终如一的可重现测试用例,那么这对于彻底解决此错误非常有帮助。

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

【讨论】:

【参考方案4】:

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));

【讨论】:

我在这里可能弄错了,但似乎最后一行没有效果。 PageLoad 本身就是一个 TimeSpan,而 .Add on TimeSpan 是一个纯函数,它不会修改 PageLoad 它只是返回一个新的 TimeSpan 被丢弃。【参考方案5】:

就我而言,我的按钮类型是submit 而不是button,我将Click 更改为Sumbit,然后一切正常。像下面这样,

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

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

顺便说一句,我已经尝试了这篇文章中的所有答案,但对我不起作用。

【讨论】:

【参考方案6】:

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

var timespan = TimeSpan.FromMinutes(3);

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

【讨论】:

您好,bewu,会采用如下格式吗? driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(5)); 不,不是这个等待 ImplicitlyWait 与查找元素有关。您需要更改默认(60 秒)驱动程序超时,当它等待请求继续时(如果我没记错的话)。无论如何,您必须找到设置 FF 驱动程序的构造函数并添加更多属性或更改超时的行。比如:driver = new FirefoxDriver(new FirefoxBinary(), new FirefoxProfile(path to your profile), TimeSpan.FromMinutes(3)); 对于 ChromeDriver,它看起来像 driver = new ChromeDriver(service, chromeDriverOptions, TimeSpan.FromMinutes(3));【参考方案7】:

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

【讨论】:

【参考方案8】:

就我而言,以上答案都没有完全解决我的问题。 我最终使用了 (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 进程。

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

【讨论】:

是的!我已经处理这个问题5个月了,这很有效!呜呜呜【参考方案9】:

我认为当您尝试访问您的网络驱动程序对象后会出现此问题

1) 一个窗口已经关闭,你还没有切换到父窗口

2) 您切换到的窗口还没有完全准备好,并且在您切换后已经更新

等待windowhandles.count 成为您所期望的既不考虑页面内容,也不考虑document.ready。我仍在寻找解决此问题的方法

【讨论】:

【参考方案10】:

在我的例子中,我发现这个错误发生在我们的团队构建服务器中。这些测试在我们的本地开发机器上运行。

问题是构建服务器上没有正确配置目标网站,所以无法正确打开浏览器。

我们使用的是 chrome 驱动程序,但我不确定这会有所不同。

【讨论】:

【参考方案11】:

问题是Click() 的评估在您的构建环境中超时。您可能想深入了解Click() 上发生的情况。

另外,请尝试为 Click() 添加重试,因为有时评估需要更长的时间,具体取决于网络速度等

【讨论】:

您好,重试选项不起作用,因为浏览器刚刚锁定。只有停止测试才能使浏览器继续。【参考方案12】:

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

我有一个 Selenium 测试,当它作为 Jenkins 作业的一部分在 vSphere 中托管并通过 RDP 管理的节点上运行时会失败。经过一些故障排除后,如果远程桌面已连接并获得焦点,则它会成功,但如果远程桌面断开连接甚至最小化,则会失败。

作为一种解决方法,我通过 vSphere 控制台而不是 RDP 登录,然后即使在关闭 vSphere 之后,测试也不再失败。这是一种解决方法,但我必须小心,切勿通过 RDP 登录,并且始终仅通过 vSphere 控制台进行管理。

【讨论】:

【参考方案13】:

尝试在 Windows 服务器(无人值守)上运行具有计划任务的无头 ChromeDriver 时,我遇到了同样的异常。为我解决的问题是以用户“Administrators”的身份运行任务(注意末尾的 S)。我也做了(我不知道它是否相关)是从任务“条件”选项卡中选择“任何连接”。

【讨论】:

【参考方案14】:

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

【讨论】:

【参考方案15】:

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

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

还有一个new FirefoxDriver(string geckoDriverDirectory, FirefoxOptions options, TimeSpan commandTimeout),它确实有效。但它没有记录,您需要手动指定geckoDriverDirectory,即使它已经在Path 中。

【讨论】:

【参考方案16】:

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

【讨论】:

【参考方案17】:

啊!今天在 ma​​cOS 上遇到了这个问题,问题很简单 - 建议安装新 Appium 版本的弹出窗口显示在远程 CI 构建服务器上。 p>

只需对其进行 VNC 处理并单击“稍后安装”即可修复它。

【讨论】:

【参考方案18】:

我在运行测试时也看到了这个问题,因此一直在寻找“为什么”和“如何解决”。

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

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

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

【讨论】:

【参考方案19】:

我遇到了这个问题。我忽略了更新 Selenium.WebDriver.ChromeDriver nuget 包以匹配我正在使用的 Chrome 版本。一旦我这样做了,问题就解决了。

【讨论】:

【参考方案20】:

对于 ChromeDriver,以下内容对我有用:

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

【讨论】:

以上是关于Selenium 错误 - 对远程 WebDriver 的 HTTP 请求在 60 秒后超时的主要内容,如果未能解决你的问题,请参考以下文章

自动化测试 selenium中WebDriver 和WebElement的区别

selenium爬取网易云

爬虫之selenium模块

Selenium 入门到精通系列:五

selenium登录 京东滑动验证码

selenium自动化模拟解锁