2016-04-13 21 views
7

Attualmente sto lavorando per provare a creare test end-to-end utilizzando PhantomJS e CasperJS. Quello che ho incontrato è una situazione in cui PhantomJS manca di promesse. Attualmente il nostro progetto li implementa. L'applicazione è utilizzata solo in Google Chrome che supporta le promesse in modo nativo.CasperJS/PhantomJS ES6 Promise Polyfill

Durante l'esecuzione mie prove ricevo l'errore: Errore: ReferenceError: Non riesci a trovare variabile: Promessa

Questo sembra essere, perché la versione corrente di Webkit in PhantomJS non ha il supporto per le promesse . Mi rendo conto che SlimerJS ha questo supporto tramite Gecko, tuttavia la nostra app funziona su Chrome e quindi vorrei che i test si verifichino in Webkit.

Quello con cui ho avuto difficoltà è l'iniezione di un polyfill con ES6 in Phantom in modo che il test si verifichi correttamente. Ho usato sia injectjs di Casper JS che casper.options.clientScripts.push - entrambi sembrano ancora riportare questa mancanza di supporto per il problema delle promesse.

Ho notato che altri hanno affermato nel supporto Github di CasperJS che hanno ottenuto il funzionamento tramite polyfill, ma non sono sicuro di come hanno fatto questo, poiché non sono forniti esempi.

Ho incluso un esempio del mio script corrente. Se qualcuno ha affrontato questo problema e trovato un modo per risolverlo, l'aiuto sarebbe molto apprezzato. Grazie in anticipo!

casper.test.begin('Example test loading', 3, function(test) { 

    casper.options.clientScripts.push("node_modules/es6-promise/es6-promise.js"); 

    casper.start('http://localhost:8080/', function() { 
     this.captureSelector('stuff.png', 'html'); 
    }); 

    casper.on("remote.message", function(msg) { 
     this.echo("Console: " + msg); 
    }); 

    casper.on("page.error", function(msg, trace) { 
     this.echo("Error: " + msg); 
    }); 

    casper.on("resource.error", function(resourceError) { 
     this.echo("ResourceError: " + JSON.stringify(resourceError, undefined, 4)); 
    }); 

    casper.on("page.initialized", function(page) { 
     page.onResourceTimeout = function(request) { 
      console.log('Response Timeout (#' + request.id + '): ' + JSON.stringify(request)); 
     }; 
    }); 

    casper.then(function() { 
     test.assertTitle('Example Title', 'Example title is incorrect'); 
    }); 

    casper.run(function() { 
     test.done(); 
    }); 
}); 
+1

'clientScripts' sono probabilmente iniettati troppo tardi nella pagina per il tuo caso d'uso. –

+1

Come nota per chiunque abbia affrontato questo problema, per questo motivo sono passato a slimerJS per questo progetto. Tuttavia, phantomJS ha il supporto pianificato per le promesse in modo nativo e dovrebbe essere rilasciato prima o poi. È possibile rivedere il problema qui: https://github.com/ariya/phantomjs/issues/14166 - un dev (Vitallium) commenti su questo a metà del problema. –

risposta

5

Mi sono imbattuto negli stessi problemi di non avere il supporto ES6 adeguato in PhantomJS. Ho anche tentato di superare il problema utilizzando es6-promise e, come te, aveva ancora un indefinito Promise s.

Sostituito da babel-polyfill risolto i problemi.

Una volta fatto

npm install --save-dev babel-polyfill 

si può sostituire clientScripts con

casper.options.clientScripts.push("node_modules/babel-polyfill/dist/polyfill.js") 

Nota: non ho investito tempo per capire il motivo per cui non ci sono stati problemi con es6-promise e l'unica caratteristica ES6 ho in questo codebase ci sono Promises, quindi IMMV.