2013-09-30 29 views
5

此腳本工作:PhantomJS:setContent不工作時HTML擁有資產

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

var html = '<h1>Test</h1><img>'; //works with page.setContent and page.content 
//var html = '<h1>Test</h1><img src=".">'; //only works with page.content 

page.setContent(html, 'http://github.com'); 
//page.content = html; 

page.render('test.png'); 
phantom.exit(); 

,但加入了src屬性來img使得它靜靜地失敗(page.render回報false,並且不產生圖像)。

設置page.content直接工作在兩種情況下,但隨後相對URL沒有。加載資源的其他標籤(如link)也會發生同樣的情況。鏈接資源是否存在並不重要。在1.8.1和1.9.2中測試。

這是bug還是我誤解了API?

+0

發佈作爲一個問題了,在https://github.com/ariya/phantomjs/issues/11656 – Tamlyn

回答

4

你不能渲染網頁,如果它沒有完全加載。

當你設置鏈接或src<img>,它會嘗試加載圖像異步。 所以,它需要等待加載完成。

請嘗試下面的代碼。

page.onLoadFinished = function(status) { 
    page.render('test.png'); 
    phantom.exit(); 
}; 
page.setContent(html, 'http://github.com'); 
+0

它不是在所有如果在for循環似乎正在創建的網頁調用。我無法使用您的方法將SVG批量轉換爲PNG,儘管它對於單個文件非常合適。 – CoDEmanX

+0

@CoDEmanX:對於批量處理,你可以隨時打電話給你自己的功能說'loadNextSVG()''而不是phantom.exit()'這臺新的SVG上下文頁和同'onLoadFinished'將被要求繼續下一SVG。這樣創建一個沒有for循環的循環。希望能幫助到你。 –

+0

謝謝,它確實工作。然而,我需要使用全局變量來將信息傳遞給'onLoadFinished'回調('page.render()'所需的輸出文件名)。此外,跳過由'listdir()'返回的無效文件變得棘手,因爲代碼由於遞歸方法而變得雜亂無章。 – CoDEmanX