prebuilt phantom node instalar framework example cannot node.js phantomjs

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 .


https://groups.google.com/group/casperjs/browse_thread/thread/641e9e6dff50fb0a/e67aaef5ab4ec918?hl=zh-CN#e67aaef5ab4ec918

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