Как ждать события SHDocVw InternetExplorerClass.DocumentComplete в модульном тесте C#?

У меня есть код модульного теста, который должен открыть страницу в 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

  • При запуске без каких-либо параметров он открывает элемент управления Windows Forms WebBrowser, переходит на сайт www.ceridian.com и открывает модальное диалоговое окно, когда DocumentComplete событие прибывает для ceridian. Закрытие диалогового окна завершает приложение.
  • При запуске с одним аргументом командной строки, скажем, X, он открывает браузер IE с помощью COM-объекта InternetExplorer, переходит на http://www.x.com/ и открывает модальное диалоговое окно, когда DocumentComplete событие прибывает для X. Закрытие диалогового окна завершает приложение.

Теперь все отлично работает для:

  1. Элемент управления WebBrowser для www.ceridian.com - BrowserTest.exe
  2. IE окно для www.live.com - BrowserTest.exe live
  3. IE окно для www.google.com - BrowserTest.exe google

Но работает BrowserTest.exe ceridian никогда не открывает модальное диалоговое окно. Итак, что-то должно быть не так с кодом, но что???

0 ответов

Другие вопросы по тегам