2017-02-27 39 views
0

我使用PhantomJS 2.1.1拍攝手機屏幕截圖,但其中一些屏幕並未正確顯示,因爲頁面未完全呈現。我試圖使用onLoadFinished事件,但它不起作用。PhantomJS onLoadFinished無法正常工作

這裏是我的代碼:

var system = require('system'); 
var args = system.args; 

var page = require('webpage').create(); 

page.open(args[1]); 

page.onLoadFinished = function (status) { 

    page.viewportSize = { width: 414, height: 736 }; 

    page.clipRect = { top: 0, left: 0, width: 414, height: 736 }; 
    page.render(args[2]); 
    console.log(args[2]); 
    phantom.exit(); 

}); 

它只是掛起並沒有返回。我通過使用2秒硬編碼延遲來解決這個問題,但這並不好,因爲我不知道每個站點都會在2秒內加載。

這是硬編碼延遲即時通訊使用:

page.open(args[1], function() { 

    page.viewportSize = { width: 414, height: 736 }; 

    page.clipRect = { top: 0, left: 0, width: 414, height: 736 }; 

    setTimeout(function() { 
     page.render(args[2]); 
     console.log(args[2]); 
     phantom.exit(); 
    }, 2000); 

}); 

如何獲得的代碼與適當的負載情況下工作?

+0

有沒有錯誤?使用[page.onError](http://phantomjs.org/api/webpage/handler/on-error.html)回調找出 – Vaviloff

回答

0

官方PhantomJS rasterize.js用於拍攝uses a 200ms timeout的網頁截圖腳本:

page.open(address, function (status) { 
    if (status !== 'success') { 
     console.log('Unable to load the address!'); 
     phantom.exit(1); 
    } else { 
     window.setTimeout(function() { 
      page.render(output); 
      phantom.exit(); 
     }, 200); 
    } 
}); 

這是確定的(從源代碼上面鏈接複製),並建議做的,而不是直接在事件中呈現相同。

+0

這不使用加載事件。這與我上面發佈的解決方法類似。我寧願使用加載事件,而不是硬編碼延遲http://phantomjs.org/api/webpage/handler/on-load-finished.html。超時是明智的,但我不能讓加載事件工作,所以它會超時100%。 – Guerrilla

+0

這是不正確的;它使用'onLoadFinished'事件。傳遞給'page.open()'的回調函數[相當於手動使用'onLoadFinished'](http://phantomjs.org/api/webpage/method/open.html):'一旦頁面被加載,可選的使用page.onLoadFinished'調用回調函數。請記住,我鏈接的腳本是一個官方的PhantomJS腳本,用於截取頁面的截圖。 PhantomJS團隊本身推薦使用超時。 – Agop

+0

啊好吧,我現在明白了,謝謝你的解釋。爲什麼有些網站需要更長的超時時間,這一定是另一個原因。 – Guerrilla