2016-04-13 21 views
7

Tôi hiện đang làm việc để cố gắng kết thúc các thử nghiệm kết thúc bằng cách sử dụng PhantomJS và CasperJS. Những gì tôi đã gặp phải là một tình huống mà PhantomJS thiếu lời hứa. Hiện tại, dự án của chúng tôi thực hiện chúng. Ứng dụng này chỉ được sử dụng trong Google Chrome có hỗ trợ hứa hẹn nguyên bản.CasperJS/PhantomJS ES6 Promise Polyfill

Trong khi chạy thử nghiệm của tôi, tôi nhận được lỗi: Lỗi: ReferenceError: Không thể tìm thấy biến: Promise

này có vẻ là vì phiên bản hiện tại của Webkit trong PhantomJS không có hỗ trợ cho lời hứa . Tôi nhận ra rằng SlimerJS không có hỗ trợ này thông qua Gecko tuy nhiên ứng dụng của chúng tôi chạy trong Chrome và do đó tôi muốn các thử nghiệm xảy ra trong Webkit.

Những gì tôi đang gặp khó khăn là tiêm một ES6 lời hứa chèn vào Phantom để kiểm tra xảy ra chính xác. Tôi đã sử dụng cả hai tiêm chích của Casper JS cũng như casper.options.clientScripts.push - cả hai dường như vẫn mang lại sự thiếu hỗ trợ này cho vấn đề hứa hẹn.

Tôi nhận thấy rằng những người khác đã nêu trong hỗ trợ github của CasperJS rằng họ đã nhận được điều này để làm việc thông qua polyfill nhưng tôi không chắc chắn làm thế nào họ đã làm điều này như không có ví dụ được cung cấp.

Tôi đã bao gồm một ví dụ về tập lệnh hiện tại của mình. Nếu có ai đó giải quyết vấn đề này và tìm ra cách giải quyết nó sẽ giúp ích rất nhiều. Cảm ơn bạn trước!

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' có thể được tiêm quá muộn vào trang cho trường hợp sử dụng của bạn. –

+1

Là một lưu ý cho bất kỳ ai khác phải đối mặt với vấn đề này - tôi đã chuyển sang slimerJS cho dự án này vì điều này. Tuy nhiên phantomJS không có hỗ trợ lên kế hoạch cho các lời hứa một cách tự nhiên và nên được phát hành sớm hay muộn. Bạn có thể xem lại vấn đề ở đây: https://github.com/ariya/phantomjs/issues/14166 - một ý kiến ​​dev (Vitallium) về vấn đề này trong nửa chừng vấn đề này. –

Trả lời

5

Tôi đã gặp vấn đề tương tự khi không có hỗ trợ ES6 thích hợp trong PhantomJS. Tôi đã cố gắng khắc phục sự cố bằng cách sử dụng es6-promise và, giống như bạn, vẫn chưa được xác định Promise s.

Thay thế bằng cách babel-polyfill giải quyết được sự cố.

Khi bạn làm

npm install --save-dev babel-polyfill 

bạn có thể thay clientScripts với

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

Lưu ý: tôi đã không đầu tư thời gian trong việc tìm hiểu vì sao lại có vấn đề với es6-promise và tính năng chỉ ES6 Tôi có trong codebase này là Promises, vì vậy IMMV.

Các vấn đề liên quan