Normalerweise rendert PhantomJS die Bilder im selben Verzeichnis wie das Skript, das Sie ausführen. Ja, es sollte sich im selben Verzeichnis wie die JavaScript-Datei befinden, die Sie mit PhantomJS ausführen.
EDIT
Es scheint, dass das spezielle Beispiel fehlerhaft ist. Das Problem ist, dass page.render(...);
einige Zeit braucht, um die Seite zu rendern, aber Sie rufen phantom.exit()
an, bevor das Rendern abgeschlossen ist. Ich konnte die erwartete Ausgabe erhalten, indem dies zu tun:
var page = require('webpage').create();
page.open('http://google.com', function() {
page.render('google.png');
setTimeout(function() { phantom.exit(); }, 5000) // wait five seconds and then exit;
});
Leider ist dieses nicht ideal, so konnte ich mit etwas zu entwickeln, die ein Haar besser. Ich sage ein „Haar“, weil ich im Grunde Polling bin, um zu sehen, wenn die Seite Rendering abgeschlossen ist:
var done = false; //flag that tells us if we're done rendering
var page = require('webpage').create();
page.open('http://google.com', function (status) {
//If the page loaded successfully...
if(status === "success") {
//Render the page
page.render('google.png');
console.log("Site rendered...");
//Set the flag to true
done = true;
}
});
//Start polling every 100ms to see if we are done
var intervalId = setInterval(function() {
if(done) {
//If we are done, let's say so and exit.
console.log("Done.");
phantom.exit();
} else {
//If we're not done we're just going to say that we're polling
console.log("Polling...");
}
}, 100);
Der obige Code funktioniert, da der Rückruf wird nicht sofort ausgeführt. 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, an true
. Also das nächste Mal, wenn der Abrufcode ausgeführt wird, ist das Flag true
und so beenden wir.
Dies scheint ein Problem mit der Art und Weise zu sein, wie PhantomJS den webpage#render(...)
Aufruf ausführt. Ich vermutete, dass es sich um einen nicht blockierenden Anruf handelte, aber laut Autor in this issue handelt es sich um einen blockierenden 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()
ausgeführt wird, was bedeutet, dass der oben erwähnte asynchrone Code niemals eine Chance erhält, zu beenden, was er tut.
Ich konnte einen Beitrag in den PhantomJS Foren finden, die sich mit what you're describing beschäftigt. Ich kann kein Problem sehen, das eingereicht wurde, also wenn Sie möchten, können Sie weitermachen und eins veröffentlichen.
Haben Sie Schreibrechte? – user123444555621
Wie kann ich das feststellen? –