2013-03-17 109 views
22

使用PhantomJS,我想注入一些JS,就好像在其他<script>標記之前有一個額外的<script>標記。這是因爲頁面上的腳本使用PhantomJS沒有的一些功能,即Function.prototype.bindwindow.webkitRequestAnimationFrame。我有一個JS文件和兩個自定義實現,我希望PhantomJS在頁面上運行腳本時使用它們。PhantomJS:在任何其他腳本運行之前注入腳本

難度在於,如果我在page.open之前執行page.injectJs,腳本將被注入一個空白頁面,並且不會轉移到正在打開的頁面。

或者,如果我在page.open之後執行page.injectJs,則已經發生JavaScript錯誤(未定義的函數)已經太晚了。

我發現,似乎工作的一種方式,但顯然是一個黑客:

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

這將給它多次(兩次,每次資源,顯然),不過沒關係,因爲我的劇本是冪等。但是,我想知道這樣做的正確方法:只在頁面上的任何腳本運行之前注入一次。

謝謝:)

+0

爲什麼不保持一個哈希所有要注入其中關鍵是該文件的文件和價值在於它是否被注射或不和,如果沒有被注入再注入呢?或者你可以在第一次運行後停止事件監聽器? – Nonconformist 2013-06-12 19:55:41

回答

23

我不認爲有一個「正確」的方式來注入比鉤住事件等這樣的腳本。 我已經花了半年時間與PhantomJs大量合作,並且在所有錯誤開始發生之前但在頁面加載完成之後發現無法注入。

我會嘗試通過onInitialized,onLoadStarted,onLoadFinished。在鉤子內部,我會調用page.evaluate(),它只會修改DOM,讓這個額外的任何地方你喜歡。

我認爲其中一個(鉤)應該給你正確的時機,你想要的。

乾杯

+9

使用'onInitialized'和'injectJs'(將相對路徑傳遞給polyfills)在我的情況下完美工作。 – 2014-08-28 20:16:51

+2

@MarcoLazzeri感謝您的評論,'onInitialized'正是我需要的同一目的。 – haynar 2015-10-01 10:44:24

相關問題