如何在Node.js中使用CasperJS?

我想在node.js中使用CasperJS。

我已经提到以下URL在node.js中使用CasperJS:

  • https://github.com/sgentle/phantomjs-node
  • http://casperjs.org/index.html#faq-executable

在上述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(); }); 

当我运行这个代码时,我得到了以下错误:

错误味精:

 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 

您可以使用SpookyJS从节点驱动CasperJS。

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

尼古拉斯Perriault
2012/2/27天猪蓝虫。 :

我想在nodejs中使用casperjs。 并参考: https : //github.com/sgentle/phantomjs-node和http://casperjs.org/index.html#faq-executable

你不能这样运行CasperJS; QtWebKit和V8不共享相同的js环境(和事件循环),因此您的node.js应用程序将无法加载和使用CasperJS模块。 你必须使用subprocess调用单独运行你的CasperJS脚本, 就像这个在github上一样 。 我不打算使CasperJS与phantomjs-node兼容,因为它使用基于alert()的肮脏的黑客,我不容易。

欢呼声,尼古拉斯Perriault

CasperJS包含一个Web服务器,可以与外部世界进行交stream 。 节点(使用requestsuperagent等)现在可以通过HTTP与casper对话。

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作为Web服务器:

 chmod +x scraper.js ./scraper.js 

您应该像运行节点应用程序一样将其作为Linux服务来运行 。

一个解决scheme(为我工作)是启动和停止您的服务器在每个testing的基础上。 例如,我有一个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 

而我的CasperJStestingtests/看起来像:

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

这基本上意味着你的脚本找不到卡斯帕; 你有没有检查path,并确保

 /opt/libs/casperjs 

和:

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

可以通过网站用户访问? 考虑到位置可能不太可能。 / opt是一个unixpath,但该网站将在{websiterootpath} / opt中查找。

我会在您的网站的根文件夹中创build一个子文件夹“casperjs”,并复制其中的内容

 /opt/libs/casperjs 

到那里。 然后改变你的path

 /opt/libs/casperjs 

 /casperjs