C'è un modo per visualizzare la sorgente generata di una pagina Web (il codice dopo che tutte le chiamate AJAX e le manipolazioni del DOM JavaScript hanno avuto luogo) da un'applicazione C# senza aprire una browser dal codice?Visualizza origine generata (dopo AJAX/JavaScript) in C#
La visualizzazione della pagina iniziale utilizzando un oggetto WebRequest o WebClient funziona correttamente, ma se la pagina utilizza ampiamente JavaScript per modificare il DOM al caricamento della pagina, questi non forniscono un'immagine accurata della pagina.
Ho provato con Selenium e Watin framework di test UI e funzionano perfettamente, fornendo la sorgente generato come appare dopo tutte JavaScript manipolazioni sono completati. Sfortunatamente, lo fanno aprendo un vero browser web, che è molto lento. Ho implementato un server di selenio che scarica questo lavoro su un'altra macchina, ma c'è ancora un notevole ritardo.
C'è una libreria .Net che caricherà e analizzerà una pagina (come un browser) e sputerà il codice generato? Chiaramente, Google e Yahoo non aprono i browser per ogni pagina che vogliono spider (ovviamente potrebbero avere più risorse di me ...).
Esiste una tale libreria o sono sfortunato a meno che non sia disposto a analizzare il codice sorgente di un browser open source?
SOLUZIONE
Bene, grazie a tutti per l'aiuto che sei. Ho una soluzione di lavoro che è circa 10 volte più veloce del selenio. Corteggiare!
Grazie a questo old article from beansoftware sono riuscito a utilizzare il controllo System.Windows.Forms.WebBrowser per scaricare la pagina e analizzarla, quindi fornire la sorgente generata. Anche se il controllo è in Windows.Forms, è ancora possibile eseguirlo da Asp.Net (che è quello che sto facendo), basta ricordare di aggiungere System.Window.Forms ai riferimenti del progetto.
Ci sono due cose notevoli sul codice. Innanzitutto, il controllo WebBrowser viene chiamato in una nuova discussione. Questo perché deve essere eseguito su un single threaded apartment.
In secondo luogo, la variabile GeneratedSource è impostata in due posizioni. Questo non è dovuto a una decisione di progettazione intelligente :) Ci sto ancora lavorando e aggiornerò questa risposta quando ho finito. wb_DocumentCompleted() è chiamato più volte. Innanzitutto quando viene scaricato l'HTML iniziale, quindi di nuovo quando viene completato il primo round di JavaScript. Sfortunatamente, il sito che sto analizzando ha 3 diverse fasi di caricamento. 1) Carica l'HTML iniziale 2) Effettua il primo giro di manipolazione del DOM di JavaScript 3) sospendi per mezzo secondo poi esegui un secondo round di manipolazione del JS DOM.
Per qualche motivo, il secondo round non è causato dalla funzione wb_DocumentCompleted(), ma viene sempre rilevato quando wb.ReadyState == Complete. Quindi, perché non rimuoverlo da wb_DocumentCompleted()? Non sono ancora sicuro del motivo per cui non è stato catturato lì ed è qui che l'articolo del software dei perline ha raccomandato di inserirlo. Continuerò a esaminarlo. Volevo solo pubblicare questo codice in modo che chiunque sia interessato possa usarlo. Godere!
using System.Threading;
using System.Windows.Forms;
public class WebProcessor
{
private string GeneratedSource{ get; set; }
private string URL { get; set; }
public string GetGeneratedHTML(string url)
{
URL = url;
Thread t = new Thread(new ThreadStart(WebBrowserThread));
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
return GeneratedSource;
}
private void WebBrowserThread()
{
WebBrowser wb = new WebBrowser();
wb.Navigate(URL);
wb.DocumentCompleted +=
new WebBrowserDocumentCompletedEventHandler(
wb_DocumentCompleted);
while (wb.ReadyState != WebBrowserReadyState.Complete)
Application.DoEvents();
//Added this line, because the final HTML takes a while to show up
GeneratedSource= wb.Document.Body.InnerHtml;
wb.Dispose();
}
private void wb_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser wb = (WebBrowser)sender;
GeneratedSource= wb.Document.Body.InnerHtml;
}
}
Si potrebbe provare a incidere fonti Firebug. –
Il mio tentativo sarebbe stato anche con Watin e amici. Ottima domanda! – orip
Prova a eseguire il tuo codice con "http://www.host.com/path/page.html?ast=3" o "http://gwt.google.com/samples/Showcase/Showcase.html". Noterai che non recupera l'HTML corretto. Qualche idea su come risolverlo? – Cosmo