使用WebBrowser访问DOM

时间:2017-02-27 21:09:41

标签: c# asp.net .net dom webbrowser-control

我需要在页面上执行javascript后访问HTML文档的DOM。我有以下代码连接到URL并获取文档。 问题是它在用javascript

修改后永远不会得到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();
    }


}

The DOM from google chrome developer tool

The DOM I get in my code

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

3 个答案:

答案 0 :(得分:3)

如果客户端脚本确实正如您所说的那样在IE7中执行,那么问题可能只是时间问题。即使文档的加载完成后,您也无法确切地知道何时将执行JS脚本。在尝试达到documentElement之前等待5秒听起来像理论上的好主意;在实践中,元素可能存在于此之前。或者,网络可能很慢,仅仅提取jQuery脚本需要5秒钟。

我建议测试你正在寻找的元素是否存在(img标签,视情况而定)。

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

这样,您就不需要Thread.Sleep行。

答案 1 :(得分:2)

我看不到这里执行的js,但我想你可以找到确切更新的元素并将on事件处理程序附加到onprpertychange事件时,就像这里给出的解决方案一样: C# WebBrowser control -- Get Document Elements After AJAX?

如果js按类而不是想法翻转元素,那么你可以从这里借用逻辑: How to select a class by GetElementByClass and click on it programmically

答案 2 :(得分:1)

检查IE7中页面的呈现方式。我想你缺少的标签是jQuery添加的,页面上的jQuery 2.2.4版本不支持IE7。我认为WebBrowser类确实包含了IE7,即使你的PC上有更新版本的IE。

如果您拥有该页面,请尝试添加jQuery migrate插件。