2012-11-29 5 views
5

Ich arbeite an einem kopflosen Browser basierend auf WebKit (mit C++/Qt4) mit JavaScript-Unterstützung. Der Hauptzweck dafür ist es, einen HTML-Bereich von Webseiten zu erstellen, die stark auf JavaScript basieren (siehe Backbone.js oder andere JavaScript MVC).Heisenbug mit eigenem kopflosen Browser

mir bewusst bin, dass es keine Art und Weise ist für zu wissen, wann die Seite vollständig geladen ist (siehe this question) und aus diesem Grunde, nachdem ich das loadFinished Signal (docs here) erhalten erstelle ich einen Timer und fange an, den DOM-Inhalt abzufragen (wie beim Überprüfen jedes Xms den Inhalt des DOM), um zu sehen, ob es Änderungen gab. Wenn nicht, nehme ich an, dass die Seite geladen wurde und drucke das Ergebnis aus. Bitte beachten Sie, dass ich bereits weiß, dass dies nicht die fast perfekte Lösung ist, aber es ist die einzige, die mir einfällt. Wenn Sie eine bessere Idee haben, antworten Sie bitte: this question

HINWEIS: Der Timer ist nicht blockierend, was bedeutet, dass alles, was innerhalb von WebKit läuft, in keiner Weise beeinflusst/blockiert/pausiert werden sollte.

Nach dem Testen des headless Browser mit einigen Seiten scheint alles gut zu funktionieren (oder zumindest wie erwartet). Aber hier erscheint der Heisenbug. Der Headless-Browser sollte von einem PHP-Skript aufgerufen werden, das für einige Ausgaben auf einen blockierenden Aufruf warten und dann drucken soll.

Auf meiner Testmaschine (Apache 2.3.14, PHP 5.4.6) gibt das PHP-Skript das gewünschte Ergebnis aus, aka, der Headless-Browser ruft die Website ab, führt das JavaScript aus und druckt, was ein Benutzer sehen würde; Wenn Sie jedoch dasselbe Skript auf dem Produktionsserver ausführen, wird die Website abgerufen, der Code des JavaScript-Codes ausgeführt und das Ergebnis gedruckt.

Der Quellcode des kopflosen Browsers und das PHP-Skript, das ich verwende, finden Sie here.

HINWEIS: Der Timer (wie Sie in dem Quellcode des Headless Browser sehen können) auf 1s gesetzt, aber eine größere Menge an Zeiteinstellung behebt das Problem nicht

Hinweis 2: Wenn Sie alle JavaScript-Fehler abfangen, wird nichts angezeigt. Dies liegt nicht an einer fehlenden Funktion, falschen Argumenten oder einer anderen Art von falschem Code.

Ich teste den kopflosen Browser mit 2 Websites. This one funktioniert sowohl auf meiner Testmaschine als auch im Produktionsserver, während this one nur in meiner Testmaschine funktioniert.

Ich bin mehr propone zu denken, dass dies ein seltsamer Fehler im JavaScript-Code in der zweiten Website ist, anstatt im Code des kopflosen Browsers, da es einen perfekten HTML-Snapshot der ersten Website generiert, aber dann wieder , das ist ein Heisenbug, also bin ich mir nicht wirklich sicher, was das alles verursacht.

Alle Ideen/Kommentare werden geschätzt. Vielen Dank

+1

Ich verstehe nicht die engen Stimmen. Bitte sagen Sie mir, was mit dieser Frage nicht stimmt. – alexandernst

+0

Wäre interessant zu wissen, zu welchem ​​Zeitpunkt der JS-Code auf dem Prod-Server ausgeführt wird und 2. die Unterschiede zwischen dem Dev- und dem Prod-Server sind. –

+0

@hongaar Der Code wird ausgeführt, nachdem die Seite vollständig geladen wurde ('' '$ (document) .ready (f ...)' ''). Es gibt ein kleines "Lade" -Widget, das mit JS erzeugt wird (was ich nach der Ausführung von PHP auf dem ProD-Rechner sehe), und währenddessen wird eine AJAX-Anfrage gestellt. Der AJAX-Callback wird von Backbone verarbeitet, das "Laden" -Widget wird entfernt und die echten Daten werden im DOM platziert. (Dieser Teil ist nicht auf der Prüfmaschine, sondern nur in meiner Testmaschine). – alexandernst

Antwort

0

Anstatt Polling für DOM-Änderungen, warum nicht Netzwerkanfragen beobachten? Dies scheint eine sicherere Heuristik zu sein. Wenn für X ms keine Netzwerkaktivität vorhanden ist (und keine ausstehenden Anforderungen vorhanden sind), wird davon ausgegangen, dass die Seite vollständig "geladen" ist.

+0

habe ich mir darüber Gedanken gemacht auch. Aber was, wenn die Seite mit Backbone.JS erstellt wurde (Angular, Batman, was auch immer ...) und macht einige schwere DOM-Änderungen, ohne irgendwelche Anfragen zu machen? – alexandernst

Verwandte Themen