2016-04-13 4 views
7

Ich arbeite gerade an Versuchen, End-to-End-Tests mit PhantomJS und CasperJS zu erstellen. Mir ist eine Situation begegnet, in der PhantomJS keine Versprechungen hat. Derzeit implementiert unser Projekt sie. Die Anwendung wird nur in Google Chrome verwendet, das native Empfehlungen unterstützt.CasperJS/PhantomJS ES6 Promise Polyfill

Während meiner Tests laufen erhalte ich die Fehlermeldung: Fehler: Reference: Kann nicht variabel finden: hat keine Unterstützung für Versprechen Versprechen

Dies, weil die aktuelle Version von Webkit in PhantomJS zu sein scheint . Ich weiß, dass SlimerJS diese Unterstützung über Gecko hat, aber unsere App läuft in Chrome und deshalb möchte ich, dass die Tests in Webkit stattfinden.

Worauf ich mich gekümmert habe, ist die Injektion eines ES6-Polyfill-Versprechens in Phantom, damit der Test korrekt ausgeführt wird. Ich habe beide Casper JS injectjs sowie casper.options.clientScripts.push verwendet - beide scheinen immer noch diesen Mangel an Unterstützung für Versprechungen Problem zu bringen.

Ich habe festgestellt, dass andere in CasperJS Github-Unterstützung angegeben haben, dass sie dies über Polyfill funktioniert haben, aber ich bin mir nicht sicher, wie sie das getan haben, da keine Beispiele bereitgestellt werden.

Ich habe ein Beispiel für mein aktuelles Skript eingefügt. Wenn sich jemand mit diesem Problem beschäftigt und einen Weg gefunden hat, es zu lösen, wäre die Hilfe sehr willkommen. Vielen Dank im Voraus!

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' sind wahrscheinlich zu spät in die Seite für Ihren Anwendungsfall injiziert. –

+1

Als eine Anmerkung an alle anderen, die mit diesem Problem konfrontiert sind - ich habe deshalb für dieses Projekt zu slimerJS gewechselt. PhantomJS hat jedoch Unterstützung für Versprechungen geplant und sollte früher oder später veröffentlicht werden. Sie können das Problem hier überprüfen: https://github.com/ariya/phantomjs/issues/14166 - ein Entwickler (Vitallium) kommentiert dies etwa auf halbem Weg durch das Problem. –

Antwort

5

Ich bin über die gleichen Probleme gestolpert, nicht die richtige ES6-Unterstützung in PhantomJS zu haben. Ich habe auch versucht, das Problem mit es6-promise zu überwinden und, wie Sie, noch undefined Promise s.

Ersetzen durch babel-polyfill löste die Probleme.

Sobald Sie das tun

npm install --save-dev babel-polyfill 

Sie clientScripts mit

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

Hinweis ersetzen: Ich habe keine Zeit für das Verständnis investiert, warum es Probleme gab mit es6-promise und die einzige ES6 Funktion Ich habe In dieser Codebasis sind Promises, also IMMV.