Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Selenium WebDriver偶尔抛出超时异常_C#_.net_Testing_Selenium_Webdriver - Fatal编程技术网

C# Selenium WebDriver偶尔抛出超时异常

C# Selenium WebDriver偶尔抛出超时异常,c#,.net,testing,selenium,webdriver,C#,.net,Testing,Selenium,Webdriver,在我们的项目上使用selenium进行ui测试。我们正在运行最新版本2.30.0。 我们使用FirefoxWebDriver并运行Firefox19.0 一般来说,当我在VisualStudio中运行ui测试时,ui测试可以在本地甚至服务器端工作。我们的ui测试几乎在构建服务器上执行。它在我通过VisualStudio手动测试的同一台服务器上使用相同的部署 但在buildserver上执行ui测试时,我们偶尔会遇到以下问题: Test(s) failed. OpenQA.Selenium.Web

在我们的项目上使用selenium进行ui测试。我们正在运行最新版本2.30.0。 我们使用FirefoxWebDriver并运行Firefox19.0

一般来说,当我在VisualStudio中运行ui测试时,ui测试可以在本地甚至服务器端工作。我们的ui测试几乎在构建服务器上执行。它在我通过VisualStudio手动测试的同一台服务器上使用相同的部署

但在buildserver上执行ui测试时,我们偶尔会遇到以下问题:

Test(s) failed. OpenQA.Selenium.WebDriverException : The HTTP request to the remote WebDriver server for URL http://localhost:7056/hub/session/bed1d0e7-efdc-46b6-ba07-34903519c44d/element/%7B8717bb19-96c7-44d3-b0ee-d4b989ae652d%7D/click timed out after 60 seconds.
      ----> System.Net.WebException : The operation has timed out
       at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)
       at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
--WebException
   at System.Net.HttpWebRequest.GetResponse()
   at OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request)
基本上,测试点击了一个上传按钮,在这个按钮上,输入字段之前填充了一个文件。由于文件非常小,因此只需几秒钟即可完成。 然而,有时会达到60秒的时限

有没有办法隔离潜在的问题?或者以前有人遇到过同样的问题?
任何提示,不胜感激。谢谢。

就我而言,页面根本没有完全加载。某些facebook插件似乎加载时间过长。我尝试捕获异常并操纵未完成的dom,但这没有给我任何结果:(


John

我们在项目中遇到了类似的问题。该问题与Selenium或我们的应用程序无关。它正在超时,因为该项目的生成服务器配置应该在5分钟内超时。但我们的所有测试都没有在5分钟内完成,因此生成因随机超时问题而失败

我们的firefox-19也有问题,测试通常会随机失败。不知何故,firefox-10只适用于我们的selenium测试。

请尝试以下代码:

  DesiredCapabilities caps = DesiredCapabilities.Firefox();   

 //set the timeout to 120 seconds
 IWebDriver driver = new RemoteWebDriver(new Uri("<app_url>"), caps, TimeSpan.FromSeconds(120));
DesiredCapabilities=DesiredCapabilities.Firefox();
//将超时设置为120秒
IWebDriver-driver=新的RemoteWebDriver(新Uri(“”),大写,TimeSpan.FromSeconds(120));

我遇到了同样的错误:.NET WebDriver:2.37,FF:25.0.1。我注意到Firefox一直处于锁定状态,直到我退出测试应用程序,所以我构建了Firefox的调试版本,发现锁定发生在它写入stderr时。这为我提供了更改WebDriver代码的线索,使其不再重定向standard out和error解决了我的问题。似乎WebDriver以某种方式阻止了std错误。来自MSDN:

同步读取操作在调用方之间引入了依赖关系 从StandardError流读取和子进程写入 这些依赖关系可能导致死锁情况

更多信息

对于任何想做同样调整的人,我做了:-

  • 获取Selenium源代码。然后检查您正在使用的同一代码分支

  • 在FireFoxBinary.cs中:

    i、 无论您在哪里找到
    RedirectStandardError=true
    ,请更改为
    RedirectStandardError=false

    ii.无论您在哪里找到
    RedirectStandardOutput=true
    ,请更改为
    RedirectStandardOutput=false
    (对于非Windows,Executable.cs中也有一个)

    iii.在ConsoleOutput中,将“return this.stream.ReadToEnd()”更改为“return”“”

  • 用您的WebDriver.dll构建并替换WebDriver.dll

  • 免责声明:这对我有效,但你的问题可能不同。而且据我所知,这除了禁用控制台输出之外没有其他负面影响,但可能还有其他我不知道的副作用

    我很想知道是否有其他人也发现了同样的问题

    既然我已经解决了我的问题,我不会再深入挖掘了。如果Selenium group的任何成员想要更多的信息/日志/调整,我很乐意这样做

    希望这会很快得到解决

    更新

    目前似乎不支持Firefox v25。请参阅

    2014年2月25日更新

    见:

    好的,这个问题通常不会在IE中表现出来,或者说是这样 从评论中可以看出。我希望人们尝试使用Firefox和 Chrome和.NET绑定2.40.0(将是 写这篇文章的时间)或更晚,看看这是否还在发生

    自从2.35.0以来,我在Chrome上看到的关于这种情况的报道越来越少,所以我 需要知道.NET绑定和 最近的chromedriver.exe

    2.40.0可能对Firefox中可能导致此问题的至少一个问题进行了修复

    这为我解决了这个问题。查看更改日志,从2014年1月31日起,有一个删除控制台日志重定向的提交:

    "No longer redirecting console output for Firefox in .NET bindings."
    

    这是我在这里使用的解决方法。因此,这一切都是有意义的。

    在四种不同的场景中发生在我身上:

  • 原因是我查询的窗口句柄已经关闭或处于关闭阶段。 如果是这种情况,最好在查询窗口之前检查窗口是否仍然存在。 如果要避免60秒的长超时时间,应更改创建Firefox实例的方式以减少60秒延迟:

    新的FirefoxDriver(“FfBinaryPath”,FfProfileInstance,TimeSpan.FromSeconds(5))

  • 原因是闪存插件“保护模式”。 这种情况只在Windows7和Windows8下发生,当它们在Jenkins作业下运行时,超时并不是偶然发生的。 为了修复它,我在禁用flash安全模式的情况下运行了Firefox selenium实例:

    SetPreference(“dom.ipc.plugins.flash.disable protected mode”,true)

  • 另一个原因,也是非偶发性的,在Jenkins的领导下,与Flash有关,发生在使用Firefox版本45时。为了解决这个问题,我不得不降级到版本44或选择性地卸载Flash

  • 内部浏览器原因:有时浏览器需要一分钟以上才能响应Selenium调用。在这种情况下,将浏览器命令超时设置为60秒以上可以解决此问题。例如:

    新的FirefoxDriver(“FfBinaryPath”,FfProfileInstance,TimeSpan.FromMinutes(3));

  • 我们用这个
    public static IWebElement WaitForElementVisible(By selector, uint timeout = Config.DefaultTimeoutSec)
        {
            IWebDriver driver = Browser.Instance.Driver;
    
            if (timeout > 0)
            {
                WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));
    
                wait.Until(ExpectedConditions.ElementIsVisible(selector));
                return driver.FindElement(selector);
            }
            else
            {
                // Search for element without timeout 
                return driver.FindElement(selector);
            }
        }
    
    public InternetExplorerDriver(
        string internetExplorerDriverServerDirectory,
        InternetExplorerOptions options,
        TimeSpan commandTimeout
    )
    
    InternetExplorerOptions options = new InternetExplorerOptions();
            IWebDriver driver = new InternetExplorerDriver("C:/Users/jeff/AppData/Local/Microsoft/WindowsApps", options, TimeSpan.FromSeconds(120));
    
    public void VerifyPageIsLoaded()
    {
        var pageLoaded = false;
    
        for (var i = 0; i < DefaultTimeout.Timeout.Seconds; i++)
        {
            Thread.Sleep(1000);
    
            if (WebDriver.ExecuteJavaScript<string>("return document.readyState").Equals("complete"))
            //jQuery.active might cause problems on some browser or browserstack so I commented it out
            //&& WebDriver.ExecuteJavaScript<bool>("return jQuery.active == 0").Equals(true))
            {
                pageLoaded = true;
                break;
            }
    
            Thread.Sleep(1000);
        }
    
        if (!pageLoaded)
        {
            throw new Exception("Page was not with complete state)!");
        }
    }