2011-09-07 17 views
14

Tengo una página ASP.NET y alguna clase personalizada que capta la página web especificada, y devuelve este cuerpo de página.¿Cómo se renderiza html (procesado por Javascript) en el control WebBrowser?

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

Pero lo que necesito - es conseguir DOM HTML, en lugar de origen, porque hago algunas operaciones adicionales con respecto DOM por jQuery..

+1

Así que lo que necesita es el HTML DOM después Javascript había modificado?¿Lo quieres como una cadena? –

Respuesta

15

Aquí es una solución que encontré para llegar al HTML representado (DOM) después de ejecutar JavaScript fue:

Coloque un control WebBrowser llamado WebBrowser1 en el formulario de la clase Form1.

[Form1.cs [Diseño]]

A continuación, para su uso código:

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

Cambiar el WebBrowser1.Navigate (" http://localhost:6489/Default.aspx ") parámetro en Form1_Load a la página cuyo DOM después de ser procesado por javascript desea obtener.

Se puede acceder al DOM modificado en el método CallServerSideCode(), por ejemplo:

doc.GetElementById("myDataTable"); 

o se puede acceder al HTML representado como esto:

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

esa es una gran respuesta Răzvan Panda !!! Usé tu código para leer una fusión fría de la página de renderizado dinámico y funcionó hasta que tuve que reconstruir mi syetem. AHORA, no puedo ver que los datos renderizados reales (interno/externo) html no devuelvan lo que veo. ¿Hay algún otro lugar o método que pueda usar para retirarlo? – CocoaNewBee

+0

@CocoaNewBee: No sé de ninguna otra manera, aprendí esta forma de acceder a ella mediante la investigación. La forma en que lo describiste es como, tampoco podrías obtenerlo de otra manera. –

+3

¿Por qué no hacerlo en webBrowser1_DocumentCompleted como webBrowser1.Document.GetElementsByTagName ("HTML") [0] .OuterHtml – George

4

Como George dijo en una de los comentarios, en teoría, puede obtener el DOM en webBrowser1_DocumentCompletado con solo usar:

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

Esto funciona, no es broma. –

2

Primero un poco de fondo. He estado tratando de eliminar información de una página web. El contenido de esta página web es dinámico. Lo que quiero decir por dinámico es que la página web carga más información a medida que se desplaza hacia abajo hasta la parte inferior de la página. El contenido HTML cambia a medida que se desplaza hacia la parte inferior de la página. Lamentablemente, el objeto del navegador web no actualiza esta información automáticamente. Todavía tiene el documento original que se cargó primero a través de la función webbrowser.navigate. La información actualizada está disponible en el HTMLElementCollection.

El siguiente código no funcionó para mí.

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

Rompí la declaración anterior de la siguiente manera

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

funcionó de maravilla. Espero que esto ayude a alguien también.

+0

Gracias. Esto me ayudó. – user1422348

0

Otra forma sería establecer un temporizador en el formulario, luego, cuando el temporizador llegue, la página se habrá rendido y podrá analizar la página.

-1

Puede obtener

webBrowser1.Document.Body.OuterHtml

Cuestiones relacionadas