Как получить обработанный html (обработанный Javascript) в элементе управления WebBrowser?

У меня есть страница 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;
    }

Но мне нужно - он получает DOM html вместо источника. потому что я делаю некоторые дополнительные операции над DOM с помощью jQuery.

Ответы

Ответ 1

Вот одно из решений, которое я нашел, чтобы получить обработанный HTML (DOM) после запуска javascript:

Поместите элемент управления WebBrowser с именем webBrowser1 в форму класса Form1.

[Form1.cs [Design]]

Затем для использования кода:

[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;
            }
        }
    }
}

Измените параметр webBrowser1.Navigate( " http://localhost:6489/Default.aspx" ) в Form1_Load на страницу с DOM после обработки с помощью javascript, который вы хотите получить.

Вы можете получить доступ к модифицированной DOM в методе CallServerSideCode(), например:

doc.GetElementById("myDataTable");

Или вы можете получить доступ к отображаемому HTML следующим образом:

var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml;

Ответ 2

Как сказал Джордж в одном из комментариев, теоретически вы можете просто получить DOM в webBrowser1_DocumentCompleted, просто используя:

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml;

Ответ 3

Сначала немного фона. Я пытаюсь очистить информацию с веб-страницы. Содержание этой веб-страницы является динамическим. То, что я подразумеваю под динамикой, - это то, что веб-страница загружает больше информации при прокрутке вниз до нижней части страницы. Содержимое HTML изменяется при прокрутке до нижней части страницы. К сожалению, веб-браузер не обновляет эту информацию автоматически. Он по-прежнему имеет исходный документ, который сначала загружается через функцию webbrowser.navigate. Обновленная информация доступна для HTMLElementCollection.

Следующий код не работал у меня.

webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml

Я нарушил вышеуказанное утверждение следующим образом

    Dim eCollections As HtmlElementCollection
    Dim strDoc As String
    eCollections = WB.Document.GetElementsByTagName("HTML")
    strDoc = eCollections(0).OuterHtml

Работал как шарм. Надеюсь, это тоже поможет кому-то.

Ответ 4

Другой способ - установить таймер в форме, затем, когда таймер пойдет, страница будет повторно отображена, и вы сможете проанализировать страницу.

Ответ 5

Вы можете получить

webBrowser1.Document.Body.OuterHtml