2011-09-07 11 views
14

Ho una pagina ASP.NET e alcune classi personalizzate che recuperano la pagina web specificata e restituiscono il corpo di questa pagina.Come ottenere il rendering html (elaborato da Javascript) nel controllo 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; 
    } 

Ma che cosa ho bisogno - perché faccio alcune operazioni aggiuntive oltre DOM da jQuery è ottenere HTML DOM, invece di fonte,..

+1

Quindi, ciò che serve è il codice HTML DOM dopo javascript aveva modificato esso?Lo vuoi come una stringa? –

risposta

15

Ecco una soluzione che ho trovato per arrivare al rendering HTML (DOM) dopo javascript è stato eseguito:

Posizionare un controllo WebBrowser denominato WebBrowser1 sul Modulo di classe Form1.

[Form1.cs [Design]]

Poi per l'uso di codice:

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

Modificare il WebBrowser1.Navigate (" http://localhost:6489/Default.aspx ") parametro in Form1_Load alla pagina il cui DOM dopo essere stato elaborato da javascript che si desidera ottenere.

è possibile accedere al DOM modificato nel metodo CallServerSideCode(), ad esempio:

doc.GetElementById("myDataTable"); 

oppure è possibile accedere al rendering HTML in questo modo:

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

questa è un'ottima risposta Răzvan Panda !!! Ho usato il tuo codice per leggere un po 'di fusione fredda in modo dinamico e ho funzionato fino a quando non ho dovuto ricostruire il mio syetem. ORA, non riesco a vedere i dati effettivi resi (html interni/esterni) non riescono a restituire ciò che vedo. c'è un altro posto o metodo che posso usare per ritirarlo ?? – CocoaNewBee

+0

@CocoaNewBee: Non conosco altro modo, ho imparato questo modo di accedervi tramite la ricerca. Il modo in cui l'hai descritto, è come, non potresti averlo anche in un altro modo. –

+3

Perché non farlo in webBrowser1_DocumentCompletato come webBrowser1.Document.GetElementsByTagName ("HTML") [0] .OuterHtml – George

4

Come George ha detto in una delle i commenti, in teoria è possibile ottenere il DOM in webBrowser1_DocumentCompleted semplicemente usando:

+1

Questo funziona non è uno scherzo. –

2

Prima un po 'di background. Ho cercato di carpire informazioni da una pagina web. Il contenuto di questa pagina web è dinamico. Quello che intendo per dinamica è che la pagina web carica più informazioni mentre scorri verso il basso fino alla fine della pagina. Il contenuto HTML cambia mentre scorri fino alla fine della pagina. Sfortunatamente l'oggetto Browser Web non aggiorna automaticamente queste informazioni. Ha ancora il documento originale che è stato caricato per la prima volta tramite la funzione webbrowser.navigate. Le informazioni aggiornate sono disponibili per HTMLElementCollection.

Il seguente codice non ha funzionato per me.

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

ho rotto la dichiarazione di cui sopra come segue

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

funzionato come un fascino. Spero che questo aiuti anche qualcuno.

+0

Grazie. Questo mi ha aiutato. – user1422348

0

Un altro modo sarebbe quello di impostare un timer sul modulo, quindi quando il timer colpisce, la pagina sarà rifatta e sarà possibile analizzare la pagina.

-1

È possibile ottenere

webBrowser1.Document.Body.OuterHtml

Problemi correlati