c# - 使用 WebBrowser 访问 DOM

标签 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

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

最佳答案

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

我建议测试您要查找的元素是否存在(img 标记,视情况而定)。类似的东西

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

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

关于c# - 使用 WebBrowser 访问 DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42495828/

相关文章:

c# - 数据绑定(bind)主窗口的标题以查看模型的属性

c# - ASP.NET 和 Java Servlets/JSP 之间的技术差异

c# - VBA 中自定义 COM 类中的 IntelliSense

c# - 数组中的 ArgumentOutOfRange 异常

c# - 在运行时在代码隐藏中选择资源文件

asp.net - C#.net Web 应用程序项目中缺少 "Models"文件夹

.net - WPF 列表框项目不自动换行

c# - 为什么前瞻后端线 anchor 不起作用?

.net - 几个大的或许多小的 dll

c# - ListBox 上的项目显示为类名