使用casperjs中的节点模块

时间:2014-06-24 13:25:05

标签: node.js npm phantomjs casperjs

是否可以安装通过npm安装的节点模块,然后从casperjs脚本安装require

(我看到很多帖子和工具用于从node.js内部运行casper或phantom,但这不是我想要做的。)

casperjs文档似乎表示这是可能的,但只能用手写的玩具模块来表示,它们并没有真正做任何事情。我尝试安装的真实模块是imap,但此时我无法使用任何模块,即使是net等内置模块也是如此。简单的例子:

npm install imap
echo "var test = require('imap');" > test.js
casperjs test.js

给我:

CasperError: Can't find module imap

/usr/local/src/casperjs/bin/bootstrap.js:263 in patchedRequire
test.js:1

(我可以看到来自npm ls的imap模块,我可以在node.js脚本中使用它。)

或者使用内置模块:

echo "var test = require('net');" > test.js
casperjs test.js

投诉"无法找到模块网"


我的npm --version为1.4.14,nodejs --version为v0.10.29。我想知道那些太旧了吗? (Casper是1.1.0-beta,Phantom是1.9.7,两者都是最新版本。)

3 个答案:

答案 0 :(得分:13)

PhantomJS和SlimerJS(用于CasperJS的引擎)不是Node.js模块。为方便起见,它们可以通过npm安装。它们具有不同于Node.js的基本模块基础结构。

您将无法使用imap或任何依赖于net模块的模块。正如Fanch所指出的那样,有些模块可以在phantomjs运行时内工作。

如果模块仅使用某些本机node.js模块的某些功能,您可以尝试更改实现以使用phantomjs提供的API。我不认为这很容易。大多数时候你会碰到一堵墙。

imap的情况下,它是相当绝望的。您甚至无法重新实现require("net").Socket,因为phantomjs不支持WebSockets(至少在1.9.7中)。

答案 1 :(得分:5)

这是一个带有colors模块的例子:

var colors = require('colors');


 casper.test.begin('\n*Colors module*\n', function suite(test) {
    casper.start()
    .thenOpen('https://www.google.fr/', function() {
        console.log("test require\n".zebra);
        console.log("test require\n".rainbow);
        console.log("test require\n".red.underline.bold);
      })
    .run(function() {
            test.done();
    });
});
  • 节点模块
    • 颜色
  • testnode.js

casperjs test testnode.js

输出:

casper + colors module -npm-

当所需模块具有依赖关系时,似乎并不那么简单。

答案 2 :(得分:3)

在我的情况下,我想加载underscorejs。 Underscore是一系列功能,并且没有与javascript对象进行复杂的交互,因此只需要javascript文件然后访问其功能就没有问题。

我首先找到了我的nodejs安装的根目录(来自CLI):

node --help

这让我找到了我的节点路径:

echo $NODE_PATH

以下是:

/usr/local/lib/node_modules/

Underscore在

/usr/local/lib/node_modules/underscore/underscore.js

所以我在CasperJS脚本中的最终需求声明是。

var _ = require('/usr/local/lib/node_modules/underscore/underscore.js');

现在在我的脚本中,我测试是否加载了underscorejs:

this.echo(_.now());

我看到了当前的时间。

CAVEAT:由于这是异步运行的,如果你把__now()语句放在require之后,它会给你一个未定义的对象错误。作为一个注释,我使用Casper 1.1,它使用PhantomJS的原生require()函数。如果你正在使用< Casper 1.1,我认为要求不会起作用。

更新: 既然如此,我使用CasperJS then()函数同步加载我的实用程序,确保在全局范围内声明我的变量。这是看起来的样子:

//at the top of the file-ish, declare variables that will hold loaded libraries.
var utils, _;
var casper = require('casper').create(); //create casper
casper.start('http://example.com'); //start casper at URL.

casper.then(function loadRequires(){ //load the requirements
    utils = require('utils', function(){this.echo('utils loded')});
    _ = require('/usr/local/lib/node_modules/underscore/underscore.js');
});

casper.then(function myAwesomeStuff() {
    this.echo(_.now()); //now, access the loaded requirements
    utils.dump('this stuff is soooo awesome!!!!!!!!!!!!!!!!!!!!');
    //do stuff on the page you opened in the start function here.
    );
});

您可以在API文档中详细了解Casper原型和then()方法:http://casperjs.readthedocs.org/en/latest/modules/casper.html#casper-prototype