PhantomJS通常會將圖像渲染到與您正在運行的腳本相同的目錄。所以是的,它應該與您使用PhantomJS運行的JavaScript文件位於同一個目錄中。
EDIT
似乎該特定例子是有缺陷的。問題是page.render(...);
需要一些時間來渲染頁面,但在渲染完成之前您要調用phantom.exit()
。我能夠這樣做是爲了獲得預期的輸出:
var page = require('webpage').create();
page.open('http://google.com', function() {
page.render('google.png');
setTimeout(function() { phantom.exit(); }, 5000) // wait five seconds and then exit;
});
可惜,這是不理想的,所以我能拿出的東西,這是一個發好。我說「頭髮」,因爲我基本上輪詢時看到的頁面呈現完畢:
var done = false; //flag that tells us if we're done rendering
var page = require('webpage').create();
page.open('http://google.com', function (status) {
//If the page loaded successfully...
if(status === "success") {
//Render the page
page.render('google.png');
console.log("Site rendered...");
//Set the flag to true
done = true;
}
});
//Start polling every 100ms to see if we are done
var intervalId = setInterval(function() {
if(done) {
//If we are done, let's say so and exit.
console.log("Done.");
phantom.exit();
} else {
//If we're not done we're just going to say that we're polling
console.log("Polling...");
}
}, 100);
上面的代碼工作,因爲回調不立即執行。因此,輪詢代碼將啓動並開始輪詢。然後當執行回調時,我們檢查頁面的狀態(如果我們能夠成功加載頁面,我們只想渲染)。然後我們呈現頁面並將我們的輪詢代碼正在檢查的標誌設置爲true
。所以下次輪詢代碼運行時,標誌是true
,所以我們退出。
這看起來與PhantomJS運行webpage#render(...)
調用的方式有關。我懷疑這是一個非阻塞呼叫,但根據作者this issue,這是一個阻塞呼叫。如果我不得不冒險猜測,渲染行爲可能是阻塞調用,但渲染代碼可能會將數據交給另一個線程處理,這會將數據保存到磁盤(因此這部分可能不是 - 阻止呼叫)。不幸的是,當執行回到主腳本並執行phantom.exit()
時,這個調用可能仍在執行,這意味着前面提到的異步代碼從來沒有機會完成它正在做的事情。
我能夠在PhantomJS論壇上找到一篇關於what you're describing的帖子。我看不到任何已提交的問題,所以如果您希望可以繼續併發佈一個問題。
獲得寫入權限? – user123444555621 2013-03-04 21:14:07
我如何確定? – 2013-09-23 15:20:32