加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用WebBrowser访问DOM

发布时间:2020-12-15 06:39:02 所属栏目:百科 来源:网络整理
导读:在页面上执行 javascript之后,我需要访问HTML文档的DOM.我有以下代码连接到URL并获取文档. 问题是它修改后不会得到DOM public class CustomBrowser{ public CustomBrowser() { // // TODO: Add constructor logic here // } protected string _url; string h
在页面上执行 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行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读