在控制台应用程序中使用WebBrowser

Hui*_*Hui 14 c# multithreading webbrowser-control

我想用它来调用网页上的一些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();
    }
Run Code Online (Sandbox Code Playgroud)

问题1:当我尝试获取时,我得到"对象引用未设置"异常doc.ToString().为什么?

问题2:如何从HTML文档中将一些数据导入主程序?WebBrowser需要一个单独的线程,这需要一个不能返回任何值的静态方法.如何返回,比如说,docMain()这样我就可以用它做什么?

Han*_*ant 13

正确的想法,错误的执行.WebBrowser.Navigate()仅告知Web浏览器开始导航到您要求的网页.这需要时间,通常为数百毫秒.Internet Explorer在内部启动线程以完成工作.它通过引发DocumentCompleted事件告诉您何时完成.你不要等待,所以先崩溃城市.

下一个问题是您的代码中不会引发DocumentCompleted事件.你必须遵守STA合同,它要求你抽一个消息循环.这是一个强大的方式,后台线程,如IE用于检索网页线程,告诉您的线程作业已完成.

您需要的样板代码可在此答案中找到.

  • 只是注意事项:当试图在没有用户交互的情况下自动化WebBrowser控件时,除非设置`webBrowser.ScriptErrorsSuppressed = true`*(尽管它的名称,它禁止所有对话框,否则会遇到弹出对话框的严重问题)不只是脚本错误)*.[另请参阅](http://stackoverflow.com/a/20612526/238419). (2认同)