web-dev-qa-db-fra.com

Comment utiliser CasperJS dans node.js?

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
34
atian25

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

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

21
atian25

Vous pouvez utiliser SpookyJS pour piloter CasperJS à partir de Node.

25
NiKo

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()
3
a paid nerd

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);
            }
        );
    });
}
0
Allen Wong

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
0
Russ Clarke