Kann phantomjs mit node.js arbeiten?
Möchte ich nutzen, phantomjs in meinem node.js script. es ist ein phantomjs-Knoten Bibliothek.. aber leider ist der Autor benutzt dieses komische Kaffee-script-code, um zu erklären, was er tut:
phantom = require 'phantom'
phantom.create (ph) ->
ph.createPage (page) ->
page.open "http://www.google.com", (status) ->
console.log "opened google? ", status
page.evaluate (-> document.title), (result) ->
console.log 'Page title is ' + result
ph.exit()
nun, wenn ich waren zu verwenden, phantomjs direkt mit javascript, es würde Aussehen wie diese:
var page = require('webpage').create();
page.open(url, function (status) {
var title = page.evaluate(function () {
return document.title;
});
console.log('Page title is ' + title);
});
also grundsätzlich bin ich versucht zu schreiben, das äquivalent der ersten code-snippet oben in der normalen javascript (durch das Lesen der Kaffee Skript Dokumentation.. dies ist, was ich getan habe:
//file name: phantomTest.js
var phantom = require('phantom');
phantom.create(function(ph) {
ph.createPage(function(page) {
page.open('http://www.google.com', function(status) {
console.log('opened google?', status);
var title = page.evaluate(function() {
return document.title;
});
console.log('page title is ' + title);
});
});
ph.exit();
});
leider funktioniert es nicht! Wenn ich
node phantomTest.js
auf der Schale, es passiert nichts.. gar nichts gibt und der Prozess nicht stoppen.. irgendwelche Ideen?
update:
Ich habe gerade gelesen das in der phantomjs faq:
Q: Warum ist PhantomJS nicht geschrieben Node.js Modul?
A: Die kurze Antwort lautet: "niemand kann zwei Herren dienen."
Einer längeren Erklärung ist wie folgt.
Als jetzt, es ist technisch sehr anspruchsvoll, so zu tun.
Jeder Node.js Modul ist im wesentlichen "ein Sklave" der Kern Node.js,
also "der Meister". In seinem aktuellen Zustand, PhantomJS (und den darin enthaltenen
WebKit) haben muss, um die volle Kontrolle (in einem synchronen Materie) über
alles: event-loop, Netzwerk-stack und die Ausführung von JavaScript.Wenn die Absicht ist, nur über die Verwendung von PhantomJS direkt aus einem Skript
bei der Ausführung in Node.js eine solche "lockere Bindung" kann erreicht werden durch
die Einleitung einer PhantomJS-Prozess und mit ihm zu interagieren.
mmm.. könnte das etwas damit zu tun haben? aber dann, die ganze Bibliothek wäre nicht sinnvoll!
update 2:
Fand ich diesen code in der webdie tut die gleiche Sache:
var phantom = require('phantom');
phantom.create(function(ph) {
return ph.createPage(function(page) {
return page.open("http://www.google.com", function(status) {
console.log("opened google? ", status);
return page.evaluate((function() {
return document.title;
}), function(result) {
console.log('Page title is ' + result);
return ph.exit();
});
});
});
});
leider nicht funktioniert entweder.. gleiche Ergebnis!
InformationsquelleAutor der Frage abbood | 2013-04-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
phantomjs-Knoten nicht ein offizielles unterstützt npm-Paket für phantomjs. Stattdessen setzt Sie einen "nauseously clever Brücke" zwischen Knoten und phantom durch das erstellen einer web-server, die websockets verwendet, um zu dienen als eine IPC-Kanal zwischen Knoten und phantom. Ich bin das nicht:
So, ich wäre nicht überrascht, wenn phantomjs-Knoten funktioniert, funktioniert nicht, schlägt im hintergrund fehl, oder schlägt spektakulär. Noch würde ich erwarten, dass jemand anderer als der Autor des phantomjs-Knoten in der Lage sein zu beheben phantomjs-Knoten.
Die Antwort auf deine ursprüngliche Frage die Antwort aus dem phantomjs-faq: Nein. Phantom und Knoten haben unüberbrückbare Differenzen. Beide erwarten, dass die vollständige Kontrolle über grundlegende low-level-Funktionen wie die Ereignis-Schleife, die Netzwerk-stack-und JS-Ausführung, so dass Sie nicht kooperieren innerhalb des gleichen Prozesses.
InformationsquelleAutor der Antwort Rein Henrichs
Könnten Sie auch geben phridge versuchen. Dein Beispiel würde habe wie folgt geschrieben:
InformationsquelleAutor der Antwort Johannes Ewald
Nun bin ich der neue Betreuer für
phantom-node
Paket. Es nicht verwenden, coffeescript mehr. Sie können etwas tun, wieDie neue version ist viel schneller und belastbar. Es ist auch nicht zu verwenden, websockets nicht mehr.
InformationsquelleAutor der Antwort Amir Raminfar
den code ändern, und es wird funktionieren:
InformationsquelleAutor der Antwort Billy Shea
Konnte man nur Graben PhantomJS wie ich Tat, weil es war einfach zu viel Schmerz mit diesen Wrapper nicht gut funktioniert, und gehen Sie mit Zombie.jsdie ziemlich beliebt zu sein.
InformationsquelleAutor der Antwort PositiveGuy
Scheint, dass das funktioniert..
Aber ich bin versucht, generieren eine html-Seite mit einigen externen Skript-Datei. Es ist nicht in der Lage zu injizieren einer Skript-Datei. Ich habe versucht, wie die folgenden. Rückruf ist nicht Rückkehr aus der Linie
page.injectJs('./jQuery.min.js',function() {
InformationsquelleAutor der Antwort Vishnu
Erlebte ich die gleichen Probleme wie du, und offenbar gibt es eine bekanntes Problem mit
phantomjs-node
und neuere Versionen von nodejs. Wie es scheint, aufgehört zu arbeiten, irgendwo um Knoten 0.9.3, laut den Kommentaren im Thema. Also bis das behoben wurde, müssen Sie entweder den downgrade nodejs, oder versuchen Sie ein anderes Modul, wie Knoten-phantomoder verwenden Sie einfachexec/spawn
.InformationsquelleAutor der Antwort NilsH