Laden...

WebBrowser JavaScript

Erstellt von programmer444 vor 9 Jahren Letzter Beitrag vor 9 Jahren 3.690 Views
P
programmer444 Themenstarter:in
5 Beiträge seit 2012
vor 9 Jahren
WebBrowser JavaScript

Hallo miteinander;)

mein Problem ist folgendes: Ich möchte in c# eine Webseite mit js (JavaScript) herunterladen. Allerdings reicht es nicht einfach den code herunterzuladen und dann in einen HTML Parser zu geben, sondern ich brauche den code nachdem das js ausgeführt wurde, denn der js code fügt einen weiteren code zum HTML hinzu. Probiert habe ich: WebClient, HttpRequest + Response und den WebBrowser von der System.Windows.Forms dll.

Mit WebBrowser schien es zu funktionieren, wenn ich mit den Funktionen Navigate und DocumentText gearbeitet habe, allerdings trat dann das Problem auf, dass ich jedes mal bestätigen musste ob ich js weiter ausführen will (weil die Skripts anscheinend Fehler hatten). Dies sollte allerdings automatisch fortgesetzt werden. Zu diesem Problem habe ich genau 1 halb-funktionierende Lösung gefunden und da klappte es ungefähr 1 von 5 malen das der code nach Ausführung der js Skripts gespeichert wurde.

Mit dem WebBrowser habe ich auch die Funktion ScriptErrorsSuppressed ausprobiert, allerdings wird hier das Fenster nur unterdrückt und das js wird nicht weiter ausgeführt.

PS: Mit Google Chrome ging es eine Webseite mit der Option "Vollständig herunterladen" nachdem laden von js zu speichern.

Ich wäre sehr dankbar wenn mir jemand helfen könnte

LG programmer

C
2.122 Beiträge seit 2010
vor 9 Jahren

Ich schätze da wirst du keine reine Klasse in .NET finden die das macht, denn für sowas gibts Browser. Das Webbrowser Obekt anzapfen ist also schon die richtige Richtung.

Nur, wenn du falsches Javascript hast bleibt natürlich dem Browser (der im Webbrowser Objekt aktiv ist) auch nicht viel übrig als irgendwann aufzugeben. Das wäre aber mit jeder anderen Klasse das selbe. Wenn Chrome die Fehler ignoriert und trotzdem weitermacht, müsstest du sehen ob du Chrome irgendwie da hinein implantieren kannst. Rechne aber damit dass trotz ignorierten Fehlern vielleicht was unerwartetes passiert und das Ergebnis nicht so aussieht wie es soll.

Am allerbesten wärs natürlich das Script zu korrigieren. Etwas fehlerhaftes zu verwenden und drauf hoffen dass schon irgendwie alles passen wird, hat schon was glaskugelmäßiges.
Ist das Script immer gleich? Dann würd ich schauen was es falsch macht und versuchen das zu korrigieren.

D
233 Beiträge seit 2008
vor 9 Jahren

Du kannst Embedded WebKit oder Embedded Gecko verwenden. Der Vorteil ist, dass das JS meist auch korrekter ausgeführt wird als vom IE, der hinter dem WebBrowser Control steckt und die vorhandene Version auf dem Rechner verwendet.

P
programmer444 Themenstarter:in
5 Beiträge seit 2012
vor 9 Jahren

@chilic: Naja, wenn ich die Fehlermeldungen nicht unterdrücke und sage das er dass js weiter ausführen soll, dann macht er das auch und das html wird "richtig" gedownloadet.

Nein, denn mein Programm soll von mehreren Webseiten das HTML herunterladen.

@D-eath: Danke, werd ich ausprobieren;)

P
programmer444 Themenstarter:in
5 Beiträge seit 2012
vor 9 Jahren

So.. Ich habe jetzt denn WebKitBrowser in mein Program implementiert, es wird zwar die Webseite richtig angezeigt aber so funktioniert noch immer nicht ganz so wie ich will.

Mein Code:

webKitBrowser2.Navigate("http://www.meineurl.com");

webKitBrowser2.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webKitBrowser1_DocumentCompleted);

void webKitBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            MessageBox.Show(webKitBrowser2.DocumentText);
            string documentContent = webKitBrowser2.DocumentText;
        }

gezeigt wird der html code mit js, gespeichert wird er ohne (also alles was mit js da war, ist weg).

sozusagen will ich eine html datei (offline) anschauen mit js inhalt ohne das js scripts extern heruntergeladen werden müssen.

wäre euch sehr dankbar wenn ihr mir helfen könnt.

P
programmer444 Themenstarter:in
5 Beiträge seit 2012
vor 9 Jahren

Ich habe es jetzt mit Awesomium geschafft.

Für mich scheint es so als ob die WebClient Klasse ein paar bugs hat.
Wenn ich die Funktion ScriptSuspressError verwende wird bei 8 von 10 mal der HTML Code mit JS angezeigt. 2 mal allerdings nicht. (Es wird allerdings immer die gleiche URL verwendet)

Bei Awesomium habe ich auch ein paar Fragen:
Es ist ja so dass in einem Programm nur einmal der Awesomium WebCore nur einmal verwendet werden kann (in einem Thread).

Ich habe es geschafft den WebCore und die anderen Funktionen (WebSession und WebView) in einem anderen Thread zu verwenden, allerdings würde ich in diesem Thread gerne mehrere Multithreads verwenden.

Mein Code des Threads der den WebCore benutzt:

if (!WebCore.IsInitialized)
            {
                WebCore.Initialize(WebConfig.Default);
            }

            WebPreferences p1 = new WebPreferences();
            p1.Javascript = true;
            Uri url = new Uri(link);

            using (WebSession session = WebCore.CreateWebSession(p1))
            {
                using (WebView view = WebCore.CreateWebView(1100, 600, session))
                {
                    Parallel.Invoke((Action)delegate
                {
                    Dispatcher.CurrentDispatcher.Invoke((Action)delegate
                    {
                        bool finishedLoading = false;
                        bool finishedResizing = false;

                        view.Source = new Uri(link);

                        view.LoadingFrameComplete += (s, e) =>
                        {
                            Console.WriteLine(String.Format("Frame Loaded: {0}", e.FrameId));

                            if (e.IsMainFrame)
                                finishedLoading = true;
                        };

                        while (!finishedLoading)
                        {
                            WebCore.Update();
                        }

                        string a = view.ExecuteJavascriptWithResult("document.documentElement.outerHTML");

                        File.WriteAllText(@"C:\xxx\" + count++.ToString() + ".htm", a);
                        view.Dispose();
                    });
                });
                }

                session.Dispose();
            }

            WebCore.DestroyUnwrappedViews();
            WebCore.ShuttingDown += new CoreShutdownEventHandler(handler5);
            WebCore.Shutdown();

Parallel Invoke funktioniert allerdings nicht.
Fehler: Awesomium.Core.AweInvalidOperationException = The calling thread cannot access this object because a different thread owns it.

16.842 Beiträge seit 2008
vor 9 Jahren

Du kannst nicht einfach blind drauf los irgendwas parallelisieren.
Du musst natürlich schauen, ob "WebCore" überhaupt Multi-Threading-fähig ist, oder ob Du jeweils eigene Instanzen brauchst.
Aufgrund Deiner Ausdruckweise bin ich mir zudem nicht sicher, ob Du überhaupt verstanden hast, was Tasks und Threads sind, und wie sie zu handhaben sind. Das ist aber unbedingt erforderlich, wenn man Fehlerfrei mit Threads und Tasks arbeiten möchte.

Wenn es Dir nur darum geht, dass die GUI nicht blockiert: [FAQ] Warum blockiert mein GUI?

Für mich sieht das hier nach einem Crawler/Bot aus, der sich in der Grauzone befindet.
Bist Du Dir überhaupt sicher, ob Du diesen in dieser Form einsetzen darfst?

P
programmer444 Themenstarter:in
5 Beiträge seit 2012
vor 9 Jahren

Nein es ist nicht Multithreading fähig.
Das Problem ist das die ganzen Funktionen nur einmal verwendbar sind.

Nein mein Programm ist kein Crawler;)