35 votes

Comment utiliser CasperJS dans node.js ?

Je voudrais utiliser CasperJS dans node.js.

J'ai consulté les URL suivantes pour utiliser CasperJS dans node.js :

Avec l'aide des URLs 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();
});

Lorsque j'exécute ce code, j'obtiens l'erreur suivante :

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

25voto

NiKo Points 5023

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

7 votes

Yup je ne peux pas obtenir leur bonjour le monde exemple au travail !

2 votes

Beaucoup de bogues dans ce module. Il ne s'installe même pas proprement depuis npm.

1 votes

J'ai abandonné l'idée de faire fonctionner SpookyJS et j'ai fait ça à la place : stackoverflow.com/questions/9459097/

21voto

atian25 Points 1771

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 des références à : 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 la même boucle d'événements). environnement js (et la boucle d'événement), donc votre application node.js ne sera pas en mesure de charger et d'utiliser un module CasperJS. 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-là sur github . I n'ai pas l'intention de rendre CasperJS compatible avec phantomjs-node parce qu'il utilise alert() - basé sur des trucs sales avec lesquels je ne suis pas facile.

Santé, -- Nicolas Perriault

17voto

Hemerson Varela Points 1890

CasperJS comprend un serveur web pour communiquer avec le monde extérieur. . Nœud (utilisant request , superagent etc.) peuvent maintenant parler à Casper via HTTP.

Sur 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();
    });
});

Vous pouvez maintenant exécuter scraper.js comme un serveur web :

chmod +x scraper.js
./scraper.js

Vous devez le faire fonctionner comme un service Linux comme vous le feriez pour une application node .

0 votes

C'est la réponse la plus simple et la plus propre. . Dans sa forme originale, il n'était pas clair ce que vous faisiez (en particulier en mentionnant PHP). J'ai donc édité un peu, ajouté mon propre code comme exemple et fait un lien vers la documentation officielle, mais vous méritez tout le karma : vous venez de m'épargner un tas de travail.

0 votes

Que fait casper.start() ? Leur documentation est nulle. Qu'est-ce qu'il retourne ? La documentation sur le site de CasperJS ne dit pas ce qu'il fait réellement sous le capot et je ne suis pas prêt à passer au crible le code de base de CasperJS.

0 votes

@WTF quoi casper.start() fait est à docs.casperjs.org/fr/latest/modules/casper.html#start

3voto

a paid nerd Points 11716

Une solution (qui a fonctionné pour moi) est de démarrer et d'arrêter votre serveur sur la base de chaque test. Par exemple, j'ai un runtests.coffee ce 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/ ressemble :

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()

0 votes

Bonjour, je suis un nerd rémunéré, cela semble être une excellente solution pour un problème que je cherche à résoudre. Je suis un peu nouveau à node et casperjs, avez-vous un Gist ou quelque chose pour une vue plus élaborée sur ce sujet ?

0 votes

@gumaflux Malheureusement, je ne peux pas partager le reste du code. Si vous avez une clarification spécifique, je peux faire de mon mieux pour y répondre.

0 votes

@a paid nerd : c'est compréhensible, ma question était de haut niveau sur la façon dont vous avez encapsulé la fonctionnalité dans la webapp et le db, mais je l'ai étoffé dans le code et tout a pris sens. Merci pour la réponse.

0voto

Russ C Points 8403

Cela signifie essentiellement que votre script ne trouve pas Casper ; avez-vous vérifié le chemin d'accès et vous êtes-vous assuré que

/opt/libs/casperjs 

et :

/opt/libs/casperjs/bin/bootstrap.js

Sont-ils accessibles par un utilisateur du site web ? compte tenu de l'emplacement, c'est probablement peu probable. /opt est un chemin unix, mais le site web cherchera dans {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 

Jusqu'à là. Ensuite, changez vos chemins de

/opt/libs/casperjs

A

/casperjs

0 votes

Oui, le chemin est correct. et j'exécute le code de test dans le shell bash. je pense que le require de nodejs ne sait pas comment trouver casper mais ne sait pas comment faire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X