Используйте модуль узла из casperjs

Можно ли установить модуль узла, установленный через npm, а затем require это из скрипта casperjs?

(Я вижу множество постов и инструментов для запуска casper или фантома внутри node.js, но это не то, что я пытаюсь сделать.)

Документы 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

(Я вижу модуль imap из npm lsи я могу использовать это нормально из скрипта node.js.)

Или альтернативно со встроенным модулем:

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

Жалуется "Не могу найти модуль net"


я имею npm --version 1.4.14 и nodejs --version из v0.10.29. Интересно, кто-нибудь из них слишком стар? (Каспер - 1.1.0-бета, и Фантом - 1.9.7, обе из которых являются последними версиями.)

3 ответа

Решение

PhantomJS и SlimerJS (движки, которые используются для CasperJS) не являются модулями Node.js. Они могут быть установлены через npm для удобства. У них другая базовая инфраструктура модулей, отличная от Node.js.

Вы не сможете использовать imap или любой модуль, который зависит от net модуль. Как указывает Фанч, существуют модули, которые могут работать во время выполнения phantomjs.

Если модуль использует только некоторые функциональные возможности некоторого собственного модуля node.js, вы можете попытаться изменить реализацию, чтобы использовать API, предоставляемый phantomjs. Я не думаю, что это легко, хотя. Большую часть времени вы столкнетесь с стеной.

В случае imapЭто довольно безнадежно. Вы даже не можете повторно реализовать require("net").Socketпотому что WebSockets не поддерживаются в phantomjs (по крайней мере, в 1.9.7).

Вот пример с модулем цветов:

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 -npm

Кажется, это не так просто, когда требуемый модуль имеет зависимости.

В моем случае я хотел загрузить underscorejs. Подчеркивание - это набор функций, которые не имеют сложных взаимодействий с объектами javascript, поэтому нет проблем, просто требуя файл javascript и затем имея доступ к его функциям.

Я начал с поиска рута для моей установки nodejs (из CLI):

node --help

Что привело меня к поиску пути моего узла:

echo $NODE_PATH

Который был в:

/usr/local/lib/node_modules/

Подчеркивание было на

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

Итак, мое последнее требование require в моем скрипте CasperJS было.

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

Теперь в моем скрипте я проверяю, загружен ли underscorejs:

this.echo(_.now());

И я вижу текущее время.

CAVEAT: Поскольку это выполняется асинхронно, если вы поместите ваш оператор _.now() сразу после require, он выдаст вам неопределенную ошибку объекта. Как примечание, я использую Casper 1.1, который использует встроенную функцию PhantomJS require(). Если вы используете

ОБНОВЛЕНИЕ: Поскольку это так, я использую функцию 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.
    );
});

Вы можете прочитать больше о прототипе Casper и методе then () в документации по API: http://casperjs.readthedocs.org/en/latest/modules/casper.html

Другие вопросы по тегам