Wo werden Screenshots von phantom.js gespeichert?

7

Beginne einfach mit Phantom.js nach der Installation über Homebrew auf meinem Mac.

Ich probiere die Beispiele aus, um Screenshots von Websites über Ссылка

zu speichern %Vor%

Aber ich sehe die Bilder nirgends. Befinden sie sich im selben Verzeichnis wie die .js-Datei?

    
Adam Grant 04.03.2013, 15:53
quelle

7 Antworten

9

Normalerweise rendert PhantomJS die Bilder im selben Verzeichnis wie das Skript, das Sie ausführen. Also ja, es sollte sich im selben Verzeichnis wie die JavaScript-Datei befinden, die Sie mit PhantomJS ausführen.

BEARBEITEN

Es scheint, dass dieses spezielle Beispiel fehlerhaft ist. Das Problem ist, dass page.render(...); einige Zeit benötigt, um die Seite zu rendern, aber Sie rufen phantom.exit() auf, bevor das Rendern abgeschlossen ist. Ich war in der Lage, die erwartete Ausgabe zu erhalten, indem ich dies tat:

%Vor%

Leider ist das nicht ideal, also habe ich mir etwas besseres Haar ausgedacht. Ich sage ein "Haar", weil ich im Grunde polling, um zu sehen, wenn die Seite das Rendern beendet hat:

%Vor%

Der obige Code funktioniert, weil der Rückruf nicht sofort ausgeführt wird. Der Abrufcode wird gestartet und beginnt mit der Abfrage. Wenn der Callback ausgeführt wird, überprüfen wir den Status der Seite (wir wollen nur dann rendern, wenn wir die Seite erfolgreich laden konnten). Dann rendern wir die Seite und setzen die Flagge, die unser Abrufcode prüft, auf true . Wenn also der Abrufcode das nächste Mal ausgeführt wird, lautet das Flag true und wir beenden.

Dies scheint ein Problem mit der Art zu sein, wie PhantomJS den Aufruf webpage#render(...) ausführt. Ich vermutete, dass es sich um einen nicht blockierenden Anruf handelte, laut dem Autor in diesem Problem >, es ist ein blockierender Anruf. Wenn ich eine Vermutung riskieren musste, ist der Rendervorgang möglicherweise ein blockierender Aufruf, aber der Code, der das Rendering ausführt, könnte die Daten an einen anderen Thread weiterreichen, der die Daten persistiert blockierender Anruf). Leider wird dieser Aufruf wahrscheinlich immer noch ausgeführt, wenn die Ausführung zum Hauptskript zurückkehrt und phantom.exit() ausführt, was bedeutet, dass der oben erwähnte asynchrone Code nie eine Chance hat, zu beenden, was er tut.

Ich konnte einen Beitrag in den PhantomJS-Foren finden, in dem was du bist Beschreibung . Ich kann kein Problem sehen, das eingereicht wurde, also wenn Sie möchten, können Sie weitermachen und eins veröffentlichen.

    
Vivin Paliath 04.03.2013, 16:12
quelle
8

Ich habe das gleiche Problem wie der Autor dieses Beitrags, und keines der Codebeispiele funktionierte für mich. Irgendwie verwirrend, dass das zweite Beispiel in der Dokumentation von Phantom.js nicht funktioniert. Wird mit Home Brew auf Snow Leopard installiert.

Ich habe ein funktionierendes Beispiel

gefunden %Vor%     
Caleb G 12.03.2013 23:03
quelle
5

Nur eine kurze Hilfe für Leute, die hierher kommen, um nach dem Verzeichnis zu suchen, in dem die Screenshots von PhantomJS oder CasperJS gespeichert sind: Es befindet sich standardmäßig im Verzeichnis scripts. Sie haben jedoch Kontrolle.

Wenn Sie kontrollieren möchten, wo sie gespeichert werden, können Sie den Dateinamen einfach wie folgt ändern:

%Vor%

Oder wenn Sie CasperJS verwenden, können Sie verwenden:

%Vor%

Hoffe, das erspart jemandem die Probleme!

    
Stan Smulders 05.10.2015 09:04
quelle
4

Ich bin mir nicht sicher, ob sich etwas geändert hat, aber das Beispiel auf Ссылка hat für mich gut funktioniert:

> %Vor%

Ich führe Phantomjs-2.1.1-Fenster.

Was mich jedoch zu diesem Thread geführt hat, war, dass die Bilddatei ursprünglich nie auf meiner Festplatte erstellt wurde, genau wie die ursprüngliche Frage. Ich dachte mir, dass es eine Art von Sicherheitsproblemen war, also loggte ich mich in eine VM ein und begann damit, alles in das gleiche Verzeichnis zu stellen. Ich habe eine Batch-Datei verwendet, um phantomjs.exe mit meiner als Parameter übergebenen .js-Datei zu starten. Mit allen Dateien im selben Verzeichnis auf meiner VM funktionierte es großartig. Durch Versuch und Irrtum fand ich, dass meine Batch-Datei im selben Verzeichnis wie meine .js-Datei sein musste. Jetzt ist alles gut auf meinem Host-Rechner.

Also zusammenfassend ... es war wahrscheinlich ein sicherheitsbezogenes Problem für mich. Keine Notwendigkeit, irgendeine Art von Timeout hinzuzufügen.

Meine Antwort auf die ursprüngliche Frage wäre, wenn Sie alles korrekt eingerichtet haben, befindet sich die Datei im selben Verzeichnis wie die .js-Datei, die phantomjs.exe ausführt. Ich habe versucht, einen voll qualifizierten Pfad für die Bilddatei anzugeben, aber das schien nicht zu funktionieren.

    
Justin Pavatte 27.07.2016 20:16
quelle
1

Die Ursache liegt darin, dass page.render () möglicherweise nicht bereit ist, das Bild auch während des Ereignisses onLoadFinished () zu rendern. Möglicherweise müssen Sie einige Sekunden warten, bevor page.render () erfolgreich ausgeführt werden kann. Die einzige zuverlässige Methode zum Rendern eines Bildes in PhantomJS ist das wiederholte Aufrufen von page.render (), bis die Methode true zurückgibt und anzeigt, dass das Bild erfolgreich gerendert wurde.

Lösung:

%Vor%     
Rich Kuzsma 26.11.2014 20:34
quelle
0

Stehlen Sie aus dem Beispiel rasterize.js , das zuverlässiger funktioniert als die angenommene Antwort für mich.

%Vor%     
Paul L 15.01.2016 09:21
quelle
0

Viele gute Vorschläge hier. Die eine Sache, die ich hinzufügen möchte:

Ich habe ein Phantomjs-Docker-Image ausgeführt, und der Standardbenutzer war "phantomjs", nicht root. Ich versuchte daher, an einen Ort zu schreiben, auf den ich keine Erlaubnis hatte (es war der pwd auf dem Docker-Host) ...

%Vor%

Der / die Code (s) werden vor allem ohne Fehler ausgeführt, aber wenn sie keine Berechtigung zum Schreiben auf das Ziel haben, ignorieren sie die Anfrage im Hintergrund ...

Nehmen wir zum Beispiel @ vivin-paliaths Code (die aktuell akzeptierte Antwort):

%Vor%

Und das Ausführen als der Standardbenutzer erzeugt:

%Vor%

Aber keine google.png und kein Fehler. Das Hinzufügen von -u root zum Docker-Befehl löst das und ich bekomme die google.png in meinem CWD.

Der Vollständigkeit halber der letzte Befehl:

  

docker ausführen -u root -i -t -v $ (pwd): / pwd -w / pwd --rm   wernight / phantomjs phantomjs google.js

    
pelson 28.04.2017 20:54
quelle

Tags und Links