对于多个并发的IE8实例,WatiN挂起“about:blank”

时间:2011-05-18 18:53:14

标签: internet-explorer watin

我正在尝试使用最新版本的WatiN测试多个网站。

如果尝试同时运行多个测试,WatiN最终会抛出异常“ Internet Explorer忙碌时超时”。发生这种情况是因为Internet Explorer最终“卡住”试图连接到“ about:blank ”。

运行时环境:

  • Windows 7专业版
  • Internet Explorer 8(版本8.0.7600.16385)
  • WatiN(Version 2.1.0.1196)

我已将问题提炼到以下简单的c#控制台程序中。要重新创建问题,请从Visual Studio创建一个新的c#.NET 3.5控制台程序,添加对WatiN.Core.dll的引用,编译,然后运行。在我的机器上大约10秒后,IE挂起“about:blank”,最终WatiN超时并产生异常。

增加WatiN超时只会延迟问题。

有没有人见过这个问题?你能用我的示例程序重现问题吗?任何解决方案?

[代码]

namespace IEBugUsingWatiN
{
    using System;
    using System.Collections.Generic;
    using System.Threading;
    using WatiN.Core;

    class Program
    {
        const int MAX_THREADS = 7;
        volatile static bool _stopAll = false;

        static void Main( string[] args )
        {
            Console.WriteLine( "Initializing WatiN." );

            var watinSettings = WatiN.Core.Settings.Instance;

            watinSettings.AutoCloseDialogs = false;
            watinSettings.AutoMoveMousePointerToTopLeft = false;
            watinSettings.AutoStartDialogWatcher = false;
            watinSettings.HighLightElement = false;
            watinSettings.SleepTime = 200;
            watinSettings.WaitUntilExistsTimeOut = 15;

            Console.WriteLine( "Creating threads." );

            List<Thread> threads = new List<Thread>();

            for ( int numThreads = 0 ; numThreads < MAX_THREADS ; ++numThreads )
            {
                var thread = new Thread( ThreadFunc );
                thread.IsBackground = true;
                thread.SetApartmentState( ApartmentState.STA );
                thread.Start();
                threads.Add( thread );
            }

            Console.WriteLine( "Press Enter key to end tests..." );
            Console.ReadLine();

            _stopAll = true;

            Console.WriteLine( "Waiting for all threads to end..." );

            foreach ( var thread in threads )
            {
                thread.Join();
            }

            Console.WriteLine( "Done." );
        }

        static void ThreadFunc()
        {
            while ( !_stopAll )
            {
                WatiN.Core.IE ie = null;

                try
                {
                    ie = new WatiN.Core.IE();
                    ie.GoTo( "http://www.hertz.com" );
                }
                catch ( System.Exception ex )
                {
                    _stopAll = true;
                    Console.WriteLine( "EXCEPTION: {0}", ex.Message );
                }

                if ( null != ie )
                {
                    ie.Close();
                    ie = null;
                }

                Thread.Sleep( TimeSpan.FromSeconds( 1 ) );
            }
        }
    }
}

[更新]

Microsoft已确认这是一个已知错误。长话短说,IE(特别是 wininet.dll )在某些情况下会泄漏连接。唯一建议的解决方法是在运行测试后显式终止所有Internet Explorer流程实例。 “修复”不太可能,因为这对于YEARS来说是一个问题,他们害怕破坏与现有应用程序的兼容性。

仅供参考,这就是微软所说的:

  

最好的解决方法可能是   以某种间隔杀死并重启IE   在您的测试运行自动化期间您   可以在一些常规的重启IE   间隔或有某种   代码中的检测逻辑。什么时候   你进入这种情况IE不会   能够提出任何要求,所以我   期待申请   收到 BeforeNavigate 事件(如果   你下沉这个事件)设置一个计时器   当计时器触发检查时   看你是否得到了   URL的 DocumentComplete 事件(您可能不会这样做)。这是一个   很好的迹象表明你遇到了   问题所以你可以继续杀人和   此时重新启动IE进程。

     

......这种做法没有解决   wininet连接丢失的根本原因   但同时也没有   控制范围内的实用方法   去做这个。只是提供一些   透视你如何进入这个   情况...

     

每当有ActiveX组件时   (例如msxml发出AJAX请求)   发出HTTP请求和Tab   托管该组件的窗口   在回复之前关闭   收到,IE会有机会   如果失去了wininet连接   ActiveX不会中止调用。这个   正是在赫兹发生的事情   场景。该页面正在运行脚本   发出AJAX请求。 IE窗口   然后在回复之前关闭   回来。部分拆除   页面,IE调用ActiveX   (在这种情况下是MSXML)通知   关闭时控制。该   然后,控制可以中止该连接   被摧毁。 MSXML没有   中止此处的连接   泄漏。这个问题根深蒂固   在IE的设计架构和它如何   与第三方组件交互。   因此,你很有可能   在网站上遇到这个问题   有AJAX请求。这些年来   有多个错误被打开   这个问题,但所有这些错误   由于申请量高而被拒绝   比较风险。部分困难   提供修复是IE没有   总是知道ActiveX就是   一个人建立联系。

     

Wininet不会暴露任何机制   对于第三方控件重置或   清理wininet连接丢失。   默认情况下,IE6 / 7每个有2个连接   服务器,而IE8有6这样   行为可能不太明显   IE8。有一个注册表项   记录在这里   http://support.microsoft.com/kb/183110   你可以尝试增加数量   可用的连接。不过这个   只是推迟了这个问题。这是   为什么我提到了唯一可支持的   重置wininet状态的方法是   重启IE进程。

0 个答案:

没有答案