对 URL 的远程 WebDriver 服务器的 HTTP 请求...在 60 秒后超时
The HTTP request to the remote WebDriver server for URL ... timed out after 60 seconds
我将 Selenium 与 Internet Explorer Web 驱动程序 (IEDriverServer) 一起使用。出于某种原因,我找不到在那里打开这个错误的代码库。因此,如果有人也能指出我的方向,我将不胜感激。
这个问题似乎广泛分布在所有驱动程序中,这表明基本 Selenium 问题。但是 Selenium 有 already denied 这是他们的问题。目前,人们似乎使用了各种各样的黑客来克服持续存在的问题。
一个人 here on SO 似乎有类似的问题,并建议通过增加超时来解决这个问题,这对我来说听起来像是一个可怕的想法,因为这只会减慢我的整体测试速度。
我遇到了这些异常:
Message: The HTTP request to the remote WebDriver server for URL
http://localhost:24478/session/07896235-84ea-465e-a361-cb0ef5885ef2/url
timed out after 60 seconds. StackTrace: at
OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInfo
requestInfo) at
OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command
commandToExecute) at
OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute(Command
commandToExecute) at
OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String
driverCommandToExecute, Dictionary`2 parameters) at
OpenQA.Selenium.Remote.RemoteWebDriver.get_Url()
和
Message: The HTTP request to the remote WebDriver server for URL
http://localhost:24478/session/07896235-84ea-465e-a361-cb0ef5885ef2/window/rect
timed out after 60 seconds. StackTrace: at
OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInfo
requestInfo) at
OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command
commandToExecute) at
OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute(Command
commandToExecute) at
OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String
driverCommandToExecute, Dictionary`2 parameters) at
OpenQA.Selenium.Remote.RemoteWindow.get_Position()
我在对驱动程序的几次不同的随机调用中得到了这个。就像我尝试让浏览器处于最新状态时 Url,或者当我尝试点击浏览器中的某个元素时。
到目前为止,在我当前的测试中,我的测试似乎能够自行恢复并继续进行,因此仍会采取未来的措施。我有一些技巧我会继续尝试,但考虑到问题的随机性,实施和测试它们需要几天时间。
我正在使用 Nuget Selenium.WebDriver 包 v3.141.0
使用 IEDriverServer v3.8。由于驱动程序的另一个已知问题,我从 v3.9 回滚了。
有谁知道这个问题的修复方法,或者没有它的 IE 驱动程序版本?
这是我第一次推出 Selenium。到目前为止,我一直在使用 CodedUI,它运行良好,但自从微软宣布停止使用它后,我一直在尝试将 Selenium 产品作为在线产品的替代品。到目前为止,我已经克服了 Selenium 的大部分缺陷,让自己恢复了类似 CodedUI 的功能,希望这是最后一期了。
这是我启动驱动程序的基本调用:
/*
* Startup the correct Selenium browser driver.
*/
_Service = InternetExplorerDriverService.CreateDefaultService(seleniumPath);
var options = new InternetExplorerOptions()
{
// Mouse clicking takes a long time using NativeEvents, so trying turning it off
EnableNativeEvents = false
};
_Browser = new InternetExplorerDriver((InternetExplorerDriverService)_Service, options);
_Browser.Manage().Timeouts().PageLoad = new TimeSpan(0, 5, 0); // wait for 5 minutes
我创建了一些通用的重试方法。这是对 Selenium 限制的破解。 Selenium 有一些内置超时,可以而且应该在适当的地方使用,但并非所有对驱动程序的调用似乎都遵守这些超时。此外,并非所有驱动程序通信问题都是由于 Selenium 在未收到回复后自行超时造成的;如果问题是由于网络或权限问题,那么这些方法根本无济于事。
Selenium 中用于 PageLoad、Script 和 ImplicitWait 的主要超时应该用于解决特定于这些领域的超时问题。
这些方法(从其他来源修改)修复了一组非常狭窄的问题,即 Selenium 在调用过程中部分失去与 Web 驱动程序的连接,或者当它超时并且您没有其他方法可以延长超时时间时.它们通过启动对驱动程序的新调用来工作,在某些情况下,这可能会导致在浏览器中多次调用该操作,因此请谨慎使用它们。
/// <summary>
/// These retry methods are necessary because Selenium is incapable of handling timeouts
/// inside it's own system when it temporarily loses connection to the Driver.
/// Called like:
/// var return = RetryWebDriverServiceCall(f => object.method(param));
/// var return = RetryWebDriverServiceCall(f => object.attribute);
/// </summary>
/// <param name="serviceMethod"></param>
public delegate void VoidAction(params object[] oArgs);
public void RetryWebDriverServiceCall(VoidAction serviceMethod)
{
for (var loop = 0; loop < 3; loop++)
{
try
{
serviceMethod();
break;
}
catch (WebDriverException ex) // (WebDriverTimeoutException ex)
{
if (!ex.Message.Contains("timed out after 60 seconds") || loop >= 2)
throw new Exception($"UI Retry #: {loop}", ex);
System.Threading.Thread.Sleep(500);
}
}
}
public delegate T ParamsAction<T>(params object[] oArgs);
public T RetryWebDriverServiceCall<T>(ParamsAction<T> serviceMethod)
{
for (var loop = 0; loop < 3; loop++)
{
try
{
return serviceMethod();
}
catch (WebDriverException ex)
{
if (!ex.Message.Contains("timed out after 60 seconds") || loop >= 2)
throw new Exception($"UI Retry #: {loop}", ex);
}
}
throw new Exception("RetryWebDriverServiceCall failed");
}
我将 Selenium 与 Internet Explorer Web 驱动程序 (IEDriverServer) 一起使用。出于某种原因,我找不到在那里打开这个错误的代码库。因此,如果有人也能指出我的方向,我将不胜感激。
这个问题似乎广泛分布在所有驱动程序中,这表明基本 Selenium 问题。但是 Selenium 有 already denied 这是他们的问题。目前,人们似乎使用了各种各样的黑客来克服持续存在的问题。
一个人 here on SO 似乎有类似的问题,并建议通过增加超时来解决这个问题,这对我来说听起来像是一个可怕的想法,因为这只会减慢我的整体测试速度。
我遇到了这些异常:
Message: The HTTP request to the remote WebDriver server for URL http://localhost:24478/session/07896235-84ea-465e-a361-cb0ef5885ef2/url timed out after 60 seconds. StackTrace: at OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInfo requestInfo) at OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command commandToExecute) at OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute(Command commandToExecute) at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters) at OpenQA.Selenium.Remote.RemoteWebDriver.get_Url()
和
Message: The HTTP request to the remote WebDriver server for URL http://localhost:24478/session/07896235-84ea-465e-a361-cb0ef5885ef2/window/rect timed out after 60 seconds. StackTrace: at OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInfo requestInfo) at OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command commandToExecute) at OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute(Command commandToExecute) at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters) at OpenQA.Selenium.Remote.RemoteWindow.get_Position()
我在对驱动程序的几次不同的随机调用中得到了这个。就像我尝试让浏览器处于最新状态时 Url,或者当我尝试点击浏览器中的某个元素时。
到目前为止,在我当前的测试中,我的测试似乎能够自行恢复并继续进行,因此仍会采取未来的措施。我有一些技巧我会继续尝试,但考虑到问题的随机性,实施和测试它们需要几天时间。
我正在使用 Nuget Selenium.WebDriver 包 v3.141.0 使用 IEDriverServer v3.8。由于驱动程序的另一个已知问题,我从 v3.9 回滚了。
有谁知道这个问题的修复方法,或者没有它的 IE 驱动程序版本?
这是我第一次推出 Selenium。到目前为止,我一直在使用 CodedUI,它运行良好,但自从微软宣布停止使用它后,我一直在尝试将 Selenium 产品作为在线产品的替代品。到目前为止,我已经克服了 Selenium 的大部分缺陷,让自己恢复了类似 CodedUI 的功能,希望这是最后一期了。
这是我启动驱动程序的基本调用:
/*
* Startup the correct Selenium browser driver.
*/
_Service = InternetExplorerDriverService.CreateDefaultService(seleniumPath);
var options = new InternetExplorerOptions()
{
// Mouse clicking takes a long time using NativeEvents, so trying turning it off
EnableNativeEvents = false
};
_Browser = new InternetExplorerDriver((InternetExplorerDriverService)_Service, options);
_Browser.Manage().Timeouts().PageLoad = new TimeSpan(0, 5, 0); // wait for 5 minutes
我创建了一些通用的重试方法。这是对 Selenium 限制的破解。 Selenium 有一些内置超时,可以而且应该在适当的地方使用,但并非所有对驱动程序的调用似乎都遵守这些超时。此外,并非所有驱动程序通信问题都是由于 Selenium 在未收到回复后自行超时造成的;如果问题是由于网络或权限问题,那么这些方法根本无济于事。
Selenium 中用于 PageLoad、Script 和 ImplicitWait 的主要超时应该用于解决特定于这些领域的超时问题。
这些方法(从其他来源修改)修复了一组非常狭窄的问题,即 Selenium 在调用过程中部分失去与 Web 驱动程序的连接,或者当它超时并且您没有其他方法可以延长超时时间时.它们通过启动对驱动程序的新调用来工作,在某些情况下,这可能会导致在浏览器中多次调用该操作,因此请谨慎使用它们。
/// <summary>
/// These retry methods are necessary because Selenium is incapable of handling timeouts
/// inside it's own system when it temporarily loses connection to the Driver.
/// Called like:
/// var return = RetryWebDriverServiceCall(f => object.method(param));
/// var return = RetryWebDriverServiceCall(f => object.attribute);
/// </summary>
/// <param name="serviceMethod"></param>
public delegate void VoidAction(params object[] oArgs);
public void RetryWebDriverServiceCall(VoidAction serviceMethod)
{
for (var loop = 0; loop < 3; loop++)
{
try
{
serviceMethod();
break;
}
catch (WebDriverException ex) // (WebDriverTimeoutException ex)
{
if (!ex.Message.Contains("timed out after 60 seconds") || loop >= 2)
throw new Exception($"UI Retry #: {loop}", ex);
System.Threading.Thread.Sleep(500);
}
}
}
public delegate T ParamsAction<T>(params object[] oArgs);
public T RetryWebDriverServiceCall<T>(ParamsAction<T> serviceMethod)
{
for (var loop = 0; loop < 3; loop++)
{
try
{
return serviceMethod();
}
catch (WebDriverException ex)
{
if (!ex.Message.Contains("timed out after 60 seconds") || loop >= 2)
throw new Exception($"UI Retry #: {loop}", ex);
}
}
throw new Exception("RetryWebDriverServiceCall failed");
}