peut travailler avec phantomjs node.js?
Je voudrais l'utiliser dans mon phantomjs node.js script. il y a un phantomjs-nœud bibliothèque.. mais, malheureusement, l'auteur a utilisé cette étrange café du code de script pour expliquer ce qu'il fait:
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()
maintenant, si je devais utiliser phantomjs directement avec javascript, il ressemblerait à quelque chose comme cette:
var page = require('webpage').create();
page.open(url, function (status) {
var title = page.evaluate(function () {
return document.title;
});
console.log('Page title is ' + title);
});
donc, fondamentalement, je suis en train d'écrire l'équivalent du premier extrait de code ci-dessus en javascript normale (à la lecture du café script la documentation.. c'est ce que j'ai fait:
//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();
});
malheureusement ça ne fonctionne pas! Si je lance
node phantomTest.js
sur la coque, rien ne se passe.. rien de revient et le processus ne s'arrête pas.. des idées?
mise à jour:
Je viens de lire dans le phantomjs faq:
Q: Pourquoi est-PhantomJS pas écrit comme Node.js module?
Un: La réponse courte: "nul Ne peut servir deux maîtres."
Une explication plus longue est comme suit.
Comme de maintenant, il est techniquement très difficile à faire.
Chaque Node.js le module est essentiellement "un esclave" à la base de Node.js,
c'est à dire "le maître". Dans son état actuel, PhantomJS (et ses
WebKit) doit avoir le contrôle total (en mode synchrone question) plus
tout: boucle d'événement, le réseau de la pile, et l'exécution de JavaScript.Si l'intention est simplement sur l'utilisation de PhantomJS droite à partir d'un script
cours d'exécution dans Node.js ce "lâche" liaison peut être réalisée par
le lancement d'un PhantomJS processus et d'interagir avec elle.
mmm.. cela pourrait-il avoir quelque chose à faire avec elle? mais alors que l'ensemble de la bibliothèque ne serait pas de bon sens!
mise à jour 2:
J'ai trouvé ce code dans les web qui fait la même chose:
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();
});
});
});
});
malheureusement, cela ne fonctionne pas non plus.. même résultat!
- L'appel de quelque chose de "stupide" parce que vous ne comprenez pas comment il fonctionne et/ou vous ne pouvez pas le faire fonctionner dans votre cas est de la plaine impoli.
- Aussi, il y a github.com/sheebz/phantom-proxy qui est plus recommandés que d'autres Node.js les ponts. Les gens ont été en utilisant transition PhantomJS avec Ruby, PHP, Node.js avec plus ou moins de succès.
- Je m'excuse pour mon libellé forte, je vais prendre la question.. je vais aussi jeter un oeil à
phantom-proxy
.. à la fin de la journée, mon but est de faire fonctionner les choses, ce n'est pas pour rabaisser les autres personnes de l'effort. - C'est obsolète et devrait être édité ou supprimé. Elle ne reflète pas la dernière phantomjs-node package et ses capacités.
Vous devez vous connecter pour publier un commentaire.
phantomjs-nœud n'est pas un fonctionnaire pris en charge mnp paquet de phantomjs. Au lieu de cela, il met en place une "nauseously intelligent pont" entre un nœud et le fantôme, par la création d'un serveur web qui utilise les websockets pour servir de CIB canal entre un nœud et le fantôme. Je ne l'invente pas:
Donc je ne serais pas surpris si phantomjs-nœud fonctionne, ne fonctionne pas, échoue silencieusement, ou échoue spectaculairement. Ne serais-je attendre que quelqu'un d'autre que l'auteur de phantomjs-nœud pour être en mesure de résoudre les phantomjs-nœud.
La réponse à votre question de départ est la réponse de la phantomjs faq: Non. Phantom et le nœud ont des différences irréconciliables. Les deux s'attendre à avoir un contrôle complet sur fondamentaux des fonctionnalités de bas niveau comme la boucle d'événements, la pile réseau, et JS de l'exécution, de sorte qu'ils ne peuvent pas coopérer dans le même processus.
phantom-node
et de diriger les efforts visant à corriger tous les bugs. Donner v2 un essai et laissez-moi savoir.Vous pouvez aussi donner phridge un essai. Votre exemple aurait été écrit comme ceci:
Je suis maintenant le nouveau responsable pour
phantom-node
paquet. Il n'utilise pas de coffeescript plus. Vous pouvez faire quelque chose commeLa nouvelle version est beaucoup plus rapide et résistant. Il également ne pas utiliser les websockets plus.
modifier votre code pour cela, et il sera de travail:
Vous pouvez simplement fossé PhantomJS comme je l'ai fait parce que c'était juste trop de douleur avec ces gestionnaires ne fonctionne pas bien, et aller avec Zombie.js qui est très populaire aussi.
Semble que cela fonctionne..
Mais je suis en train de générer une page html avec certains fichier de script externe. Il est impossible d'injecter un fichier de script. J'ai essayé comme suit. Le rappel n'est pas de retour de la ligne de
page.injectJs('./jQuery.min.js',function() {
J'ai connu les mêmes problèmes que vous, et apparemment, il y a un problème connu avec
phantomjs-node
et les versions plus récentes de nodejs. Semble comme il a cessé de travailler quelque part autour de nœud 0.9.3, selon les commentaires à la question. Jusqu'à ce qu'elle a été résolu, vous avez de déclasser nodejs, ou essayer un autre module, comme nœud-fantôme, ou tout simplement utiliserexec/spawn
.