c# – 使用WebBrowser访问DOM

前端之家收集整理的这篇文章主要介绍了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行.

猜你在找的C#相关文章