对URL的远程WebDriver服务器的HTTP请求..60秒后超时



我正在将Selenium与Internet Explorer Web驱动程序(IEDriverServer)一起使用。出于某种原因,我找不到它在那里打开这个bug的代码库。所以,如果有人能给我指明方向,我将不胜感激

这个问题似乎广泛分布在所有驱动程序中,这表明存在基本的Selenium问题。但硒已经否认这是他们的问题。目前,人们似乎使用了各种各样的黑客手段来克服这一持续存在的问题。

SO上的一个人似乎也有类似的问题,建议通过增加超时来解决这个问题,这对我来说听起来是个可怕的想法,因为这只会减慢我的测试速度。

我得到了这些例外:

消息:对URL的远程WebDriver服务器的HTTP请求http://localhost:24478/session/07896235-84ea-465e-a361-cb0ef5885ef2/网址60秒后超时。StackTrace:位于OpenQA。Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInforequestInfo)OpenQA。Selenium.Remote.HttpCommandExecutor.Execute(命令commandToExecute)OpenQA。Selenium.Remote.DriverServiceCommandExecutor.Execute(命令commandToExecute)OpenQA.Senium.Remote.RemoteWebDriver.Execute(字符串driverCommandToExecute,字典`2个参数)OpenQA.Senium.Remote.RemoteWebDriver.get_Url()

消息:对URL的远程WebDriver服务器的HTTP请求http://localhost:24478/session/07896235-84ea-465e-a361-cb0ef5885ef2/窗口/矩形60秒后超时。StackTrace:位于OpenQA。Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInforequestInfo)OpenQA。Selenium.Remote.HttpCommandExecutor.Execute(命令commandToExecute)OpenQA。Selenium.Remote.DriverServiceCommandExecutor.Execute(命令commandToExecute)OpenQA.Senium.Remote.RemoteWebDriver.Execute(字符串driverCommandToExecute,字典`2个参数)OpenQA.Selemenium.RemoteWindow.get_Position()

我在对驱动程序的几个不同的随机调用中得到了这个。比如当我尝试获取浏览器的当前Url时,或者当我尝试单击浏览器中的某个元素时。

到目前为止,在我目前的测试中,我的测试似乎能够自我恢复并继续进行,因此未来仍将采取行动。我还有一些技巧要尝试,但考虑到问题的随机性,实施和测试它们需要几天时间。

我使用的是NugetSelenium.WebDriver软件包v3.141.0使用IEDriverServer v3.8。由于驱动程序的另一个已知问题,我从v3.9回滚。

有人知道这个问题的解决方案吗,或者IE驱动程序的一个版本没有它吗?

这是我第一次推出硒。到目前为止,我已经使用了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");
}

最新更新