Как использовать CasperJS в node.js? - PullRequest
34 голосов
/ 27 февраля 2012

Я хотел бы использовать CasperJS в node.js.

Я использовал следующие URL-адреса для использования CasperJS в node.js:

С помощью приведенных выше URL я написал следующий код:

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

Когда я запускаю этот код, я получаю следующую ошибку:

ОШИБКА 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

Ответы [ 6 ]

25 голосов
/ 04 октября 2012

Вы можете использовать SpookyJS для управления CasperJS с узла.

21 голосов
/ 28 февраля 2012

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

Николя Перрио
2012/2/27 天 猪 蓝 虫. :

Я хочу использовать casperjs в nodejs. и ссылки на: https://github.com/sgentle/phantomjs-node и http://casperjs.org/index.html#faq-executable

Вы не можете запустить CasperJS таким образом; QtWebKit и V8 не делят то же самое среда js (и цикл обработки событий), поэтому ваше приложение node.js не сможет загрузить и использовать модуль CasperJS. Вы должны запустить свой скрипт CasperJS отдельно используя вызов подпроцесса, как этот на github . я не планируйте делать CasperJS совместимым с phantomjs-node, потому что это использует грязные хаки на основе alert(), с которыми мне нелегко.

Ура, - Николя Перрио

17 голосов
/ 15 мая 2013

CasperJS включает веб-сервер для общения с внешним миром .Узел (используя request, superagent и т. Д.) Теперь может общаться с Каспером по HTTP.

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

Теперь вы можете запускать scraper.js как вебсервер:

chmod +x scraper.js
./scraper.js

Вы должны запустить его как службу Linux так же, как и для приложения узла .

3 голосов
/ 15 августа 2013

Одно из решений (которое сработало для меня) - запуск и остановка вашего сервера для каждого теста.Например, у меня есть runtests.coffee, который выглядит следующим образом:

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

А мои тесты CasperJS в tests/ выглядят так:

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 голосов
/ 19 сентября 2018

Я тоже пытался запустить Каспер по узлу cron, вот мое решение

в casper.js повторяет ваш ответ:

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

использовать node-cmd в файле узла 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 голосов
/ 27 февраля 2012

Это в основном означает, что ваш скрипт не может найти Каспера;Вы проверили путь и убедились, что

/opt/libs/casperjs 

и:

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

доступны пользователю веб-сайта?учитывая местоположение, это, вероятно, маловероятно./ opt - это путь Unix, но сайт будет искать в {websiterootpath} /opt.

Я бы создал подпапку 'casperjs' в корневой папке вашего сайта и скопировал содержимое

/opt/libs/casperjs 

К там.Затем измените свой путь с

/opt/libs/casperjs

на

/casperjs
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...