Selenium 向远程WebDriver服务器发送的URL的HTTP请求。。。60秒后超时

Selenium 向远程WebDriver服务器发送的URL的HTTP请求。。。60秒后超时,selenium,selenium-iedriver,Selenium,Selenium Iedriver,我正在将Selenium与Internet Explorer Web驱动程序(IEDriverServer)一起使用。出于某种原因,我找不到代码库来打开这个bug。因此,如果有人也能为我指明方向,我将不胜感激 这个问题似乎广泛存在于所有驱动程序中,这表明存在一个基本问题。但是硒有它是他们的问题。目前,似乎有相当广泛的各种各样的黑客用来克服正在进行的问题 一个人似乎也有类似的问题,他建议通过增加超时来克服这个问题,这对我来说是个可怕的想法,因为这只会降低我的测试速度 我得到了以下例外情况: 消息:

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

这个问题似乎广泛存在于所有驱动程序中,这表明存在一个基本问题。但是硒有它是他们的问题。目前,似乎有相当广泛的各种各样的黑客用来克服正在进行的问题

一个人似乎也有类似的问题,他建议通过增加超时来克服这个问题,这对我来说是个可怕的想法,因为这只会降低我的测试速度

我得到了以下例外情况:

消息:对远程WebDriver服务器的URL的HTTP请求 60秒后超时。StackTrace:在 OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInfo 请求信息)在 OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(命令 命令执行)在 OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute(命令 命令执行)在 OpenQA.Selenium.Remote.RemoteWebDriver.Execute(字符串 driverCommandToExecute,Dictionary`2个参数)位于 OpenQA.Selenium.Remote.RemoteWebDriver.get_Url()

消息:对远程WebDriver服务器的URL的HTTP请求 60秒后超时。StackTrace:在 OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInfo 请求信息)在 OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(命令 命令执行)在 OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute(命令 命令执行)在 OpenQA.Selenium.Remote.RemoteWebDriver.Execute(字符串 driverCommandToExecute,Dictionary`2个参数)位于 OpenQA.Selenium.Remote.RemoteWindow.get_Position()

我给司机打了几个不同的随机电话。例如,当我尝试获取浏览器的当前Url时,或者当我尝试单击浏览器中的某个元素时

在我目前的测试中,到目前为止,我的测试似乎能够自我恢复并继续进行,因此未来的操作仍在进行中。我有一些黑客,我仍将尝试,但由于问题的随机性,实施和测试它们需要几天时间

我正在使用Nuget Selenium.WebDriver包v3.141.0 使用IEDriverServer v3.8。由于驱动程序的另一个已知问题,我从v3.9回滚

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

这是我第一次推出硒。到目前为止,我一直在使用CodedUI,它运行得非常好,但自从微软宣布停止使用CodedUI以来,我一直在尝试将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中PageLoad、Script和ImplicitWait的主要超时应该用于修复特定于这些区域的超时问题

这些方法(从另一个来源修改)修复了一组非常狭窄的问题,即Selenium在调用过程中部分断开与web驱动程序的连接,或者当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无法处理超时
///在它自己的系统中,当它暂时失去与驱动程序的连接时。
///被称为:
///var return=RetryWebDriverServiceCall(f=>object.method(param));
///var return=RetryWebDriverServiceCall(f=>object.attribute);
/// 
/// 
公共委托无效操作(参数对象[]oArgs);
公共void RetryWebDriverServiceCall(VoidAction serviceMethod)
{
for(变量循环=0;循环<3;循环++)
{
尝试
{
serviceMethod();
打破
}
catch(WebDriverException ex)/(WebDriverTimeoutException ex)
{
如果(!ex.Message.Contains(“60秒后超时”)| |循环>=2)
抛出新异常($“UI重试#::{loop}”,ex);
系统.线程.线程.睡眠(500);
}
}
}
公共委托T参数(参数对象[]桨);
public T RetryWebDriverService调用(ParamsAction服务方法)
{
for(变量循环=0;循环<3;循环++)
{
尝试
{
返回serviceMethod();
}
捕获(WebDriverException ex)
{
如果(!ex.Message.Contains(“60秒后超时”)| |循环>=2)
抛出新异常($“UI重试#::{loop}”,ex);
}
}
抛出新异常(“RetryWebDriverServiceCall失败”);
}

IE驱动程序的代码是Selenium存储库的一部分。如果您有一个可复制的案例,您可以在Selenium存储库中为IE驱动程序打开一个问题。但是,请注意,一个可复制的案例将包括一个站点(HTML页面或公共URL),Selenium代码可以针对该站点执行。没有