phantom - Cómo utilizar CasperJS en node.js?
phantomjs prebuilt 2.1 16 (6)
Me gustaría usar CasperJS en node.js.
Me he referido a las siguientes URL para usar CasperJS en node.js:
Con la ayuda de las URL anteriores he escrito el siguiente código:
//DISPLAY=:0 node test2.js
var phantom = require(''phantom'');
console.log(''Hello, world!'');
phantom.create(function (ph) {
ph.casperPath = ''/opt/libs/casperjs''
ph.injectJs(''/opt/libs/casperjs/bin/bootstrap.js'');
var casper = require(''casper'').create();
casper.start(''http://google.fr/'');
casper.thenEvaluate(function (term) {
document.querySelector(''input[name="q"]'').setAttribute(''value'', term);
document.querySelector(''form[name="f"]'').submit();
}, {
term: ''CasperJS''
});
casper.then(function () {
// Click on 1st result link
this.click(''h3.r a'');
});
casper.then(function () {
console.log(''clicked ok, new location is '' + this.getCurrentUrl());
});
casper.run();
});
Cuando ejecuto este código, recibí el siguiente error:
ERROR MSG:
tz@tz-ubuntu:/opt/workspaces/TestPhantomjs$ DISPLAY=:0 node test2.js
Hello, world!
Error: Cannot find module ''casper''
at Function._resolveFilename (module.js:332:11)
at Function._load (module.js:279:25)
at Module.require (module.js:354:17)
at require (module.js:370:17)
at /opt/workspaces/TestPhantomjs/test2.js:6:14
at Object.<anonymous> (/opt/workspaces/TestPhantomjs/node_modules/phantom/phantom.js:82:43)
at EventEmitter.<anonymous> (/opt/workspaces/TestPhantomjs/node_modules/phantom/node_modules/dnode/index.js:215:30)
at EventEmitter.emit (events.js:67:17)
at handleMethods (/opt/workspaces/TestPhantomjs/node_modules/phantom/node_modules/dnode-protocol/index.js:138:14)
at EventEmitter.handle (/opt/workspaces/TestPhantomjs/node_modules/phantom/node_modules/dnode-protocol/index.js:98:13)
phantom stdout: Unable to load casper environment: Error: Failed to resolve module fs, tried fs
Básicamente significa que su script no puede encontrar a Casper; ¿Has revisado el camino y se aseguró de que
/opt/libs/casperjs
y:
/opt/libs/casperjs/bin/bootstrap.js
¿Son accesibles por un usuario del sitio web? teniendo en cuenta la ubicación, probablemente no sea probable. / opt es una ruta de acceso de Unix, pero el sitio web buscará en {websiterootpath} / opt.
Crearía una subcarpeta ''casperjs'' en la carpeta raíz de su sitio web y copiaría el contenido de
/opt/libs/casperjs
Para ahi. Luego cambia tus caminos de
/opt/libs/casperjs
A
/casperjs
Puede usar SpookyJS para conducir CasperJS desde el nodo.
Traté de ejecutar el trabajo cron de casper by node también, aquí está mi solución
en casper.js repite tu respuesta:
casper.then(function() { var comments = this.evaluate(getComments); this.echo(JSON.stringify(comments)); })
use node-cmd en el archivo de nodo casper_wrapper.js:
var cmd = require(''node-cmd''); module.exports = function(url) { return new Promise(function(resolve, reject) { cmd.get( ''casperjs casper.js '' + url, // casper takes args to run the script function(err, data, stderr){ if (err) { reject(err); return; } var obj = JSON.parse(data); resolve(obj); } ); }); }
Una solución (que funcionó para mí) es iniciar y detener su servidor según la prueba. Por ejemplo, tengo un runtests.coffee
que se ve así:
http = require ''http''
glob = require ''glob''
spawn = require(''child_process'').spawn
db = require ''./db'' # Contains all database stuff.
webapp = require ''./webapp'' # Contains all of the Express stuff.
db.connect ''test'' # Connects to the db server and creates an empty test db.
server = http.createServer webapp.makeApp()
server.listen 0, ->
port = server.address().port
process.env.URL = "http://localhost:#{ port }"
glob ''tests/*'', (err, filenames) ->
child = spawn ''casperjs'', [''test''].concat(filenames)
child.stdout.on ''data'', (msg) -> process.stdout.write msg
child.stderr.on ''data'', (msg) -> process.stderr.write msg
child.on ''exit'', (code) ->
db.disconnect() # Drops the test db.
server.close()
process.exit code
Y mis pruebas de CasperJS en tests/
ven así:
URL = require(''system'').env.URL # Note, Casper code here, not Node.
casper.test.begin ''Test something'', 1, (test) ->
casper.start "#{ URL }/welcome"
casper.then ->
test.assertHttpStatus 200
# ....
casper.run ->
test.done()
CasperJS incluye un servidor web para hablar con el mundo exterior . El nodo (mediante request
, superagent
, etc.) ahora puede hablar con Casper a través de HTTP.
En scraper.js
:
#!/usr/bin/env casperjs
// I AM NOT NODEJS
// I AM CASPER JS
// I RUN IN QTWEBKIT, NOT V8
var casper = require(''casper'').create();
var server = require(''webserver'').create();
var ipAndPort = ''127.0.0.1:8585'';
server.listen(ipAndPort, function(request, response) {
casper.start(''https://connect.data.com/login'');
casper.userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36");
casper.then(function(){
// lots of code here, and a few more cassper.then()s
});
casper.run(function(){
console.log(''/n/nFinished'')
response.statusCode = 200;
var body = JSON.stringify({
phoneNumber: ''1800-YOLO-SWAG''
})
response.write(body);
response.close();
});
});
Ahora puede ejecutar scraper.js
como un servidor web:
chmod +x scraper.js
./scraper.js
Debe ejecutarlo como un servicio de Linux como lo haría para una aplicación de nodo .
Nicolas Perriault
2012/2/27 天 猪 蓝 虫. :
Quiero usar casperjs en nodejs. y se refiere a: https://github.com/sgentle/phantomjs-node y http://casperjs.org/index.html#faq-executable
No puedes ejecutar CasperJS de esa manera; QtWebKit y V8 no comparten el mismo entorno js (y el bucle de evento), por lo que su aplicación node.js no podrá cargar y usar un módulo CasperJS. Debe ejecutar su script CasperJS por separado utilizando una llamada de subproceso, como esta en github . No planeo hacer que CasperJS sea compatible con phantomjs-node porque usa hacks sucios basados en
alert()
los que no soy fácil.Saludos, - Nicolas Perriault