Vorrei utilizzare phantomjs nel mio script node.js. c'è una biblioteca phantomjs-node .. ma purtroppo l'autore ha usato questo codice di script caffè strano per spiegare quello che sta facendo:i phantomjs possono funzionare con node.js?
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()
ora se dovessi usare phantomjs direttamente con javascript, sarebbe simile a this:
var page = require('webpage').create();
page.open(url, function (status) {
var title = page.evaluate(function() {
return document.title;
});
console.log('Page title is ' + title);
});
quindi fondamentalmente sto cercando di scrivere l'equivalente del primo frammento di codice di cui sopra in javascript normale (leggendo la sceneggiatura del caffè documentation .. questo è quello che ho fatto:
// 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();
});
sfortunatamente non funziona! Se corro
node phantomTest.js
sulla shell, non succede nulla .. non ritorna nulla e il processo non si ferma .. qualche idea?
aggiornamento:
Ho appena letto questo nelle phantomjs faq:
D: Perché è PhantomJS non scritti come modulo Node.js?
A: La risposta breve: "Nessuno può servire due padroni".
Una spiegazione più lunga è la seguente.
A partire da ora, è tecnicamente molto impegnativo farlo.
Ogni modulo Node.js è essenzialmente "uno schiavo" del core di Node.js, , ad esempio "il master". Allo stato attuale, PhantomJS (e il suo WebKit incluso) deve avere il controllo completo (su una questione sincrona) su tutto : loop eventi, stack di rete e esecuzione JavaScript.
Se l'intenzione è solo di utilizzare PhantomJS destra da uno script in esecuzione all'interno Node.js, un tale "sciolto vincolante" può essere raggiunto con avviando un processo PhantomJS e interagire con esso.
mmm .. questo potrebbe avere qualcosa a che fare con esso? ma allora quella intera biblioteca non avrebbe senso!
aggiornamento 2:
Ho trovato questo codice nella web che fa la stessa cosa:
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();
});
});
});
});
, purtroppo, che non funziona neanche .. stesso risultato!
Calling qualcosa di "stupido", perché non si capisce come funziona e/o non si può fare che funziona nel tuo caso è scortese. –
Inoltre, vi è https://github.com/sheebz/phantom-proxy che è più consigliato di altri bridge Node.js. Le persone hanno utilizzato il bridging di PhantomJS con Ruby, PHP, Node.js con un successo variabile. –
Mi scuso per la mia forte formulazione, lo porterò fuori dalla domanda .. Daremo anche un'occhiata a 'phantom-proxy' .. alla fine della giornata il mio obiettivo è far funzionare le cose, è non sminuire lo sforzo degli altri. – abbood