Je voudrais utiliser CasperJS dans node.js.
J'ai fait référence à l'URL suivante pour utiliser CasperJS dans node.js:
Avec l'aide des URL ci-dessus, j'ai écrit le code suivant:
//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();
});
Quand j'ai exécuté ce code, j'ai eu l'erreur suivante:
ERREUR 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
Nicolas Perriault
2012/2/27 天 猪 蓝 虫. :
Je veux utiliser casperjs dans nodejs. et référence à: https://github.com/sgentle/phantomjs-node et http://casperjs.org/index.html#faq-executable
Vous ne pouvez pas exécuter CasperJS de cette façon; QtWebKit et V8 ne partagent pas le même environnement js (et boucle d’événement), pour que votre application node.js ne puisse pas utiliser charger et utiliser un module CasperJS. Vous devez exécuter votre script CasperJS séparément en utilisant un appel de sous-processus, comme celui-ci sur github . JE ne prévoyez pas de rendre CasperJS compatible avec phantomjs-node, car il utilise des hacks sales basés sur
alert()
- avec lequel je ne suis pas facile.À votre santé, - Nicolas Perriault
Vous pouvez utiliser SpookyJS pour piloter CasperJS à partir de Node.
Une solution (qui a fonctionné pour moi) consiste à démarrer et à arrêter votre serveur test par test. Par exemple, j'ai un runtests.coffee
qui ressemble à:
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
Et mes tests CasperJS dans tests/
ressemblent à:
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()
J'ai essayé d'exécuter casper par tâche cron de noeud aussi, Voici ma solution
dans casper.js, faites écho à votre réponse:
casper.then(function() {
var comments = this.evaluate(getComments);
this.echo(JSON.stringify(comments));
})
utilisez node-cmd dans le fichier de nœud 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);
}
);
});
}
Cela signifie essentiellement que votre script ne peut pas trouver Casper; avez-vous vérifié le chemin et fait en sorte que
/opt/libs/casperjs
et:
/opt/libs/casperjs/bin/bootstrap.js
Sont-ils accessibles par un utilisateur du site? Compte tenu de l'emplacement, il est peu probable que ./opt soit un chemin d'accès unix, mais le site Web examinera {websiterootpath}/opt.
Je créerais un sous-dossier 'casperjs' dans le dossier racine de votre site web et copierais le contenu de
/opt/libs/casperjs
Pour là . Puis changez vos chemins de
/opt/libs/casperjs
À
/casperjs