Usa un modulo nodo da casperjs

È ansible installare un modulo nodo, installato tramite npm, e quindi require da uno script casperjs?

(Vedo molti post e strumenti per eseguire casper o phantom dall’interno di node.js, ma non è quello che sto cercando di fare.)

I documenti casperjs sembrano dire che è ansible, ma mostrano solo moduli giocattolo scritti a mano che in realtà non fanno nulla. Il modulo del mondo reale che sto cercando di installare è imap , ma a questo punto non riesco a far funzionare nessun modulo, nemmeno quelli integrati come la net . Semplice esempio:

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

Mi da:

 CasperError: Can't find module imap /usr/local/src/casperjs/bin/bootstrap.js:263 in patchedRequire test.js:1 

(Posso vedere il modulo imap da npm ls , e posso usarlo bene da uno script node.js.)

O in alternativa con un modulo integrato:

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

Reclami “Imansible trovare il modulo net”


Ho npm --version of 1.4.14 e nodejs --version di v0.10.29. Sono uno di quelli troppo vecchi, mi chiedo? (Casper è 1.1.0-beta e Phantom è 1.9.7, entrambi sono le ultime versioni.)

PhantomJS e SlimerJS (i motori utilizzati per CasperJS) non sono moduli Node.js. Possono essere installati tramite npm per comodità. Hanno una diversa infrastruttura di base di moduli distinta da Node.js.

Non sarai in grado di usare imap o qualsiasi modulo che dipende dal modulo di net . Come sottolinea Fanch, ci sono dei moduli che possono funzionare all’interno del runtime di phantomjs.

Se un modulo utilizza solo alcune funzionalità di alcuni moduli node.js nativi, puoi provare a cambiare l’implementazione per utilizzare l’API fornita da phantomjs. Non penso che sia facile, però. La maggior parte delle volte ti imbatterai in un muro.

Nel caso di imap , è piuttosto senza speranza. Non è nemmeno ansible ri-implementare il require("net").Socket , perché WebSockets non è supportato in phantomjs (almeno in 1.9.7).

Ecco un esempio con il modulo 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(); }); }); 
  • nodo moduli
    • colors
  • testnode.js

casperjs test testnode.js

produzione :

casper + colors module -npm-

Sembra che non sia così semplice quando il modulo richiesto ha delle dipendenze.

Nel mio caso, volevo caricare underscorejs. Underscore è una serie di funzioni e non ha interazioni complicate con oggetti javascript, quindi non c’è problema solo richiedendo il file javascript e avendo accesso alle sue funzioni.

Ho iniziato trovando la root sull’installazione di nodejs (dalla CLI):

 node --help 

Il che mi ha portato a trovare il mio percorso di nodo:

 echo $NODE_PATH 

Quale era a:

 /usr/local/lib/node_modules/ 

Underscore era a

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

Quindi la mia ultima dichiarazione di necessità nel mio script CasperJS era.

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

Ora nel mio script cerco di vedere se underscorejs è caricato:

 this.echo(_.now()); 

E vedo l’ora corrente.

CAVEAT: Poiché viene eseguito in modo asincrono, se si inserisce l’istruzione _.now () subito dopo la richiesta, verrà restituito un errore dell’object non definito. Come nota, sto usando Casper 1.1, che usa la funzione require () nativa di PhantomJS. Se stai usando

AGGIORNAMENTO: Poiché questo è il caso, io uso la funzione CasperJS then () per caricare le mie utilità in modo sincrono, assicurandomi di dichiarare le mie variabili nell’ambito globale. Ecco come appare:

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

Puoi leggere ulteriori informazioni sul prototipo di Casper e sul metodo then () nei documenti API: http://casperjs.readthedocs.org/en/latest/modules/casper.html#casper-prototype