2013-03-17 17 views
22

Sử dụng PhantomJS, tôi muốn chèn một số JS như thể có thêm một thẻ <script> trước bất kỳ thẻ <script> nào khác. Điều này là do các tập lệnh trên trang sử dụng một số chức năng mà PhantomJS không có, cụ thể là Function.prototype.bindwindow.webkitRequestAnimationFrame. Tôi có một tập tin JS với triển khai tùy chỉnh của hai và tôi muốn PhantomJS sử dụng chúng khi chạy các kịch bản trên trang.PhantomJS: tiêm một tập lệnh trước khi bất kỳ tập lệnh nào khác chạy

Khó khăn là nếu tôi làm page.injectJs trước page.open, tập lệnh được đưa vào trang trống và không được chuyển sang trang đang mở.

Hoặc, nếu tôi thực hiện page.injectJs sau khi page.open, đã quá muộn vì các lỗi JavaScript (chức năng không xác định) đã xảy ra.

Tôi đã tìm thấy một cách mà xuất hiện để làm việc, nhưng rõ ràng là một hack:

page.onResourceReceived = function() { 
    page.injectJs('phantom-hacks.js') 
}; 

này đưa nó nhiều lần (hai lần cho mỗi tài nguyên, rõ ràng), nhưng đó là okay vì kịch bản của tôi là idempotent . Tuy nhiên, tôi muốn biết cách thích hợp để làm điều này: tiêm nó chỉ một lần và trước khi bất kỳ kịch bản trên trang được chạy.

Xin cảm ơn :)

+0

tại sao không giữ băm với tất cả các tệp bạn muốn tiêm ở đâu khóa là tệp và giá trị là tệp được tiêm hay không và nếu chưa được tiêm thì hãy tiêm? Hoặc bạn chỉ có thể dừng người nghe sự kiện sau lần chạy đầu tiên? – Nonconformist

Trả lời

23

Tôi không nghĩ rằng có cách "thích hợp" để chèn tập lệnh như vậy ngoài hooking vào sự kiện. Tôi đã dành nửa năm làm việc ồ ạt với PhantomJs và không tìm thấy cách nào để tiêm trước khi tất cả các lỗi bắt đầu xảy ra nhưng sau khi trang tải xong.

Tôi sẽ cố gắng thực hiện onInitialized, onLoadStarted, onLoadFinished. Bên trong các móc, tôi sẽ gọi đến page.evaluate(), nó sẽ chỉ sửa đổi DOM để có thêm bất kỳ vị trí nào bạn thích.

Tôi nghĩ một trong số họ (móc) sẽ cung cấp cho bạn đúng thời điểm bạn muốn.

Chúc mừng

+9

Sử dụng 'onInitialized' và' injectJs' (chuyển đường dẫn tương đối tới các polyfills) đã làm việc hoàn hảo trong trường hợp của tôi. –

+2

@MarcoLazzeri cảm ơn nhận xét của bạn, 'onInitialized' chính xác là những gì tôi cần cho cùng một mục đích. – haynar

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