如何在C#单元测试中等待SHDocVw InternetExplorerClass.DocumentComplete事件?

时间:2019-03-07 19:59:17

标签: .net windows com-interop shdocvw shdocvw.internetexplorer

我有一个单元测试代码,需要在IE中打开一个页面,并在文档完成后执行某些操作。该页面包含重定向,并在最后加载Silverlight(我们被困了一年)。

代码如下:

using System;
using System.Threading;
using System.Windows.Forms;
using Common;
using NUnit.Framework;
using SHDocVw;

namespace Web
{
    partial class ForEachWebServer
    {
        private class IEEvent
        {
            public object Url;

            public void OnDocumentComplete(object pDisp, ref object URL)
            {
                Url = URL;
            }
        }

        [Test, Category("non-ui"), Category("xap")]
        [SkipTestExecutionForServicesBinding]
        public void XAPDownload()
        {
            var ieEvent = new IEEvent();
            var ie = new InternetExplorerClass();
            ie.DocumentComplete += ieEvent.OnDocumentComplete;
            ie.Visible = true;
            ie.Navigate("ceridian.com");
            while (ieEvent.Url == null)
            {
                Application.DoEvents();
                Thread.Sleep(50);
            }
            Console.WriteLine($"Navigation complete: {ieEvent.Url}");
        }
    }
}

但是ieEvent.Url永远是null。另外,如果我仍在等待循环结束的同时尝试访问ie.Busy,我会得到:

System.Runtime.InteropServices.COMException: 'The object invoked has disconnected from its clients. (Exception from HRESULT: 0x80010108 (RPC_E_DISCONNECTED))'

我在做什么错了?

编辑1

我在这里有一个功能齐全的项目-https://dev.azure.com/MarkKharitonov0271/_git/BrowserTest

  • 在不带任何参数的情况下运行时,它将打开WebBrowser Windows窗体控件,导航到www.ceridian.com,并在{em> ceridian 的DocumentComplete事件到达时打开一个模式对话框。关闭对话框将结束应用程序。
  • 使用单个命令行参数运行时,说 X ,它将使用InternetExplorer COM对象打开IE浏览器,导航到http://www.X.com,并在{{1}时打开模式对话框。 }事件到达 X 。关闭对话框将结束应用程序。

现在,所有功能都适用于:

  1. 用于 www.ceridian.com -DocumentComplete
  2. 的WebBrowser控件 www.live.com
  3. IE窗口-BrowserTest.exe
  4. www.google.com
  5. IE窗口-BrowserTest.exe live

但是,运行BrowserTest.exe google永远不会打开模式对话框。因此,代码一定有问题,但是呢?

0 个答案:

没有答案