Подтвердить что ты не робот

Использование WebBrowser в консольном приложении

Я хочу использовать его для вызова некоторых скриптов JS на веб-странице. У меня есть это:

    static void Stuff()
    {
        WebBrowser browser = new WebBrowser();
        browser.Navigate("http://www.iana.org/domains/example/");
        HtmlDocument doc = browser.Document;
        //doc.InvokeScript("someScript");
        Console.WriteLine(doc.ToString());
    }

    static void Main(string[] args)
    {
        Console.WriteLine("hi");
        var t = new Thread(Stuff);
        t.SetApartmentState(ApartmentState.STA);
        t.Start();
    }

Вопрос 1: При попытке получить doc.ToString() я получаю исключение "ссылка на объект не установлен". Почему?

Вопрос 2: Как получить некоторые данные из документа HTML в основную программу? WebBrowser требуется отдельный поток, для которого требуется статический метод, который не может вернуть какое-либо значение. Как мне вернуться, скажем, doc к Main(), чтобы я мог что-то с этим сделать?

4b9b3361

Ответ 1

Правильная идея, неправильное выполнение. WebBrowser.Navigate() только сообщает веб-браузеру, чтобы начать навигацию к веб-странице, которую вы просили. Для этого требуется время, например, сотни миллисекунд. Internet Explorer внутренне запускает потоки, чтобы выполнить задание. Он сообщает вам, когда это делается путем поднятия события DocumentCompleted. Вы не ждете этого, чтобы сначала разбился город.

Следующая проблема заключается в том, что событие DocumentCompleted не будет повышаться в вашем коде. Вы должны соблюдать контракт STA, это требует, чтобы вы накидали контур сообщения. Что всемогущий способ, которым фоновый поток, такой как тот, который IE использует для извлечения веб-страницы, сообщает вашему потоку, что задание выполнено.

Код шаблона, который вам нужен, доступен в этом ответе.