Как получить обработанный 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