如何在WebBrowser控件中获取渲染的html(由Javascript处理)?

Den*_*fer 14 html c# browser asp.net jquery

我有一个ASP.NET页面和一些获取指定网页的自定义类,并返回此页面正文.

protected String GetHtml()
{
          Thread thread = new Thread(new ThreadStart(GetHtmlWorker));
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
    return docHtml;
}

protected void GetHtmlWorker()
{
    using (WebBrowser browser = new WebBrowser())
    {

                browser.ScriptErrorsSuppressed = true;
        browser.Navigate(_url);

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

        docHtml = browser.DocumentText;
    }
Run Code Online (Sandbox Code Playgroud)

但我需要的是 - 它获取DOM html而不是源代码.因为我通过jQuery对DOM做了一些额外的操作.

Răz*_*nda 16

这是我发现在运行javascript后获取呈现的HTML(DOM)的一个解决方案:

在Form1类的Form上放置一个名为webBrowser1的WebBrowser控件.

[Form1.cs的[设计]

然后代码使用:

[Form1.cs中]

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WebBrowserTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.webBrowser1.ObjectForScripting = new MyScript();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://localhost:6489/Default.aspx");
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            webBrowser1.Navigate("javascript: window.external.CallServerSideCode();");
        }

        [ComVisible(true)]
        public class MyScript
        {
            public void CallServerSideCode()
            {
                var doc = ((Form1)Application.OpenForms[0]).webBrowser1.Document;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

将Form1_Load中的webBrowser1.Navigate(" http:// localhost:6489/Default.aspx ")参数更改为您希望获取的javascript处理后的DOM页面.

您可以在CallServerSideCode()方法中访问修改后的DOM,例如:

doc.GetElementById("myDataTable");
Run Code Online (Sandbox Code Playgroud)

或者您可以像这样访问呈现的HTML:

var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml;
Run Code Online (Sandbox Code Playgroud)

  • 为什么不在webBrowser1_DocumentCompleted中这样做,如webBrowser1.Document.GetElementsByTagName("HTML")[0] .OuterHtml (3认同)

jim*_*das 6

正如乔治在其中一条评论中所说的那样,理论上你可以通过以下方式获取webBrowser1_DocumentCompleted中的DOM:

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml;
Run Code Online (Sandbox Code Playgroud)