Как использовать CasperJS в node.js?
Я хотел бы использовать 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:
[email protected]:/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
Ответы
Ответ 1
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 scriptотдельно используя вызов подпроцесса, как этот в github. я не планируйте делать CasperJS совместимым с phantomjs- node, потому что он использует alert()
основанные на грязных хаках, с которыми мне нелегко.
Cheers, - Николас Перриальт
Ответ 2
Вы можете использовать SpookyJS для запуска CasperJS с Node.
Ответ 3
КасперJS включает в себя веб-сервер для общения с внешним миром. Node (используя request
, superagent
и т.д.) теперь можно поговорить с casper over 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, как и для приложения Node.
Ответ 4
Одним из решений (который работал у меня) является запуск и остановка вашего сервера на основе каждого теста. Например, у меня есть 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()
Ответ 5
В основном это означает, что ваш script не может найти Каспера; вы проверили путь и убедились, что
/opt/libs/casperjs
и
/opt/libs/casperjs/bin/bootstrap.js
Доступны ли пользователи веб-сайта? учитывая расположение, вероятно, это не так.
/opt - путь unix, но веб-сайт будет искать в {websiterootpath}/opt.
Я создал бы вложенную папку "casperjs" в корневой папке вашего сайта и скопировал содержимое
/opt/libs/casperjs
Там.
Затем измените свои пути из
/opt/libs/casperjs
Для
/casperjs