Question

Je voudrais utiliser Casperjs dans Node.js.

J'ai fait référence aux URL suivantes pour utiliser Casperjs dans Node.js:

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

Lorsque j'exécute ce code, j'ai obtenu 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
Était-ce utile?

La solution 2

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

Nicolas Perriault
2012/2/27 天猪 蓝虫. :

Je veux utiliser les casperjs dans Nodejs. et refs à: https://github.com/sgentle/phantomjs-node et http://casperjs.org/index.html#faq-execuable

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énements), donc votre application Node.js ne pourra pas charger et utiliser un module Casperjs. Vous devez exécuter votre script Casperjs séparément à l'aide d'un appel de sous-processus, comme celui-ci sur github. Je n'ai pas l'intention de rendre les casperjs compatibles avec Phantomjs-node car il utilise alert()-Les hacks sales basés avec lesquels je ne suis pas facile.

Bravo, - Nicolas Perriault

Autres conseils

Vous pouvez utiliser Spookyjs Pour conduire Casperjs à partir du nœud.

Casperjs comprend un serveur Web pour parler au monde extérieur. Nœud (en utilisant request, superagent etc) peut maintenant parler à Casper sur HTTP.

Dans 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 courir scraper.js En tant que serveur Web:

chmod +x scraper.js
./scraper.js

Tu devrais Exécutez-le comme un service Linux comme vous le feriez pour une application de nœud.

Une solution (qui a fonctionné pour moi) consiste à démarrer et à arrêter votre serveur 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 tests/ ressembler:

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

Cela signifie essentiellement que votre script ne peut pas trouver Casper; Avez-vous vérifié le chemin et vous êtes-vous assuré que

/opt/libs/casperjs 

et:

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

Sont accessibles par un utilisateur de site Web? Compte tenu de l'emplacement, ce n'est probablement pas 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 copierait le contenu de

/opt/libs/casperjs 

À là. Puis changez vos chemins de

/opt/libs/casperjs

À

/casperjs

J'ai essayé d'exécuter Casper par Node Cron Job aussi, voici ma solution

Dans Casper.js, écho à votre réponse:

casper.then(function() {
    var comments = this.evaluate(getComments);
    this.echo(JSON.stringify(comments));
})

Utilisez le nœud-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);
            }
        );
    });
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top