Как ждать события SHDocVw InternetExplorerClass.DocumentComplete в модульном тесте C #? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть код модульного теста, который должен открыть страницу в 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. Управление веб-браузером для www.ceridian.com - BrowserTest.exe
  2. IE окно для www.live.com - BrowserTest.exe live
  3. IE окно для www.google.com - BrowserTest.exe google

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

...