Ansicht generierte Quelle (nach AJAX / JavaScript) in C #

Ist es ein Weg, um den generierten Quellcode einer web-Seite (der code, nachdem alle AJAX-Aufrufe und JavaScript-DOM-Manipulationen stattgefunden haben) von einer C# - Anwendung ohne öffnen einen browser aus dem code?

Anzeigen der ersten Seite mit einem WebRequest oder WebClient Objekt funktioniert ok, aber wenn die Seite macht intensiven Gebrauch von JavaScript zu ändern, den DOM auf die Seite laden, dann werden diese nicht bieten ein genaues Bild von der Seite.

Habe ich versucht, mit Selen und Watin UI-testing-frameworks, und Sie funktionieren perfekt und versorgen die generierte Quelle, wie es erscheint, nachdem alle JavaScript-Manipulationen abgeschlossen sind. Leider, Sie tun dies durch die Eröffnung einer eigentlichen web-browser, was sehr langsam ist. Ich habe implementiert eine Selen-server, die Abladungen diese Arbeit auf eine andere Maschine, aber es ist immer noch eine erhebliche Verzögerung.

Gibt es eine .Net-Bibliothek, die das laden und Parsen einer Seite (wie ein browser) und spuckte den generierten code? Klar, Google und Yahoo sind nicht die öffnung der Browser für jede Seite, die Sie möchten, spider (natürlich kann Sie haben mehr Ressourcen als mir...).

Ist es, die Bibliothek oder bin ich, Pech gehabt, es sei denn, ich bin bereit, zu zerlegen, den Quellcode einer open-source-browser?

LÖSUNG

Gut, danke allen für Sie sind, helfen. Ich habe eine funktionierende Lösung, dass ist über 10X schneller als Selen. Woo!

Dank dieser alte Artikel aus beansoftware ich war in der Lage, das System zu nutzen.Windows.Formen.WebBrowser-Steuerelement, um die Seite herunterzuladen und zu Parsen, dann gib em die generierte Quelle. Auch wenn sich das Steuerelement in Windows.Formen, können Sie immer noch ausführen Asp.Net (was ich auch Tue), nur daran erinnern, zum System hinzufügen.Fenster.Formen, auf die Ihr Projekt verweist.

Gibt es zwei Bemerkenswerte Dinge über den code. Zunächst das WebBrowser-Steuerelement aufgerufen wird, in einem neuen thread. Dies ist, weil es laufen muss auf eine single threaded apartment.

Zweite, die GeneratedSource variable in zwei Orten. Dies ist nicht durch eine intelligente design-Entscheidung 🙂 ich arbeite noch daran und aktualisiert diese Antwort, wenn ich fertig bin. wb_DocumentCompleted() mehrfach aufgerufen wird. Erst, wenn der erste HTML-Code wird heruntergeladen, wenn dann wieder mal die erste Runde von JavaScript vervollständigt. Leider, die Website, die ich bin Schaben hat 3 verschiedene Laststufen. 1) Laden anfänglichen HTML-2) muss bei der ersten Runde der JavaScript DOM-manipulation 3) pause für eine halbe Sekunde, dann eine zweite Runde von JS DOM-manipulation.

Für einige Grund, die zweite Runde ist nicht die Ursache von der wb_DocumentCompleted () - Funktion, aber es ist immer gefangen, wenn wb.ReadyState == Abzuschließen. Warum also nicht entfernen Sie Sie aus wb_DocumentCompleted()? Ich bin mir immer noch nicht sicher, warum es ist nicht, es erwischt und das ist, wo die beadsoftware Artikel empfohlen, es zu setzen. Ich werde weiter in Sie suchen. Ich wollte nur zu veröffentlichen diesen code, so dass jeder, der interessiert ist, kann es verwenden. Genießen Sie!

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

InformationsquelleAutor der Frage Michael La Voie | 2009-08-20

Schreibe einen Kommentar