c# – 使用WebBrowser访问DOM

页面上执行 javascript之后,我需要访问HTML文档的DOM.我有以下代码连接到URL并获取文档.
问题是它修改后不会得到DOM
public class Custombrowser
{
    public Custombrowser()
    {
        //
        // Todo: Add constructor logic here
        //
    }

    protected string _url;
    string html = "";
    Webbrowser browser;

    public string GetWebpage(string url)
    {
        _url = url;
        // Webbrowser is an ActiveX control that must be run in a
        // single-threaded apartment so create a thread to create the
        // control and generate the thumbnail
        Thread thread = new Thread(new ThreadStart(GetWebPageWorker));
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
        thread.Join();
        string s = html;
        return s;
    }

    protected void GetWebPageWorker()
    {
        browser = new Webbrowser();
        //  browser.ClientSize = new Size(_width,_height);
        browser.ScrollBarsEnabled = false;
        browser.ScriptErroRSSuppressed = true;
        //browser.DocumentCompleted += browser_DocumentCompleted;
        browser.Navigate(_url);

        // Wait for control to load page
        while (browser.ReadyState != WebbrowserReadyState.Complete)
            Application.DoEvents();

        Thread.Sleep(5000);


        var documentAsIHtmlDocument3 = (mshtml.IHTMLDocument3)browser.Document.DomDocument;

        html = documentAsIHtmlDocument3.documentElement.outerHTML; 


        browser.dispose();
    }


}

我希望有人可以帮我解决这个问题

解决方法

如果客户端脚本确实在IE7中执行,那么问题可能只是时间.即使文档的加载完成,您也不能确切地知道JS脚本将被执行.在等待5秒钟之前,试图达到documentElement听起来像是一个理想的好主意;在实践中,元素可能存在于此之前.或者,也许网络缓慢,只是提取jQuery脚本需要5秒钟.

我建议测试你正在寻找的元素的存在(一个img标签,视情况而定).沿线的东西

while (browser.Document.GetElementsByTagName("img").Count == 0) {
    Application.DoEvents();
}

这样,你不需要Thread.Sleep行.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...