我正在將PhantomJS無頭瀏覽器集成到我的項目(當前使用版本1.6)。在大多數情況下,它在完成我需要完成的任務方面做得很好。然而,WebPage.open()調用方式的異步特性以及需要在某個時候調用phantom.exit(),這使得處理客戶端重定向變得非常棘手,因爲無法預測他們將要去的地方去。如何僅在客戶端重定向發生後才結束PhantomJS腳本
我所追求的是一種只有在任何元刷新(導致不同的頁面)之後調用phantom.exit()並且JavaScript重定向綁定到onload事件等事件的方式。我可以看到爲什麼這是一個問題,因爲從理論上說,客戶端重定向可能會在頁面加載後的任意數秒內發生,並且我不能簡單地要求只有當沒有更多重定向要去時才能退出發生。現在,我能想到的最佳解決方案是:a)手動檢測頁面上的元刷新元素的存在並自行處理這些元素; b)使用setInterval()來允許一些相當長的時間(比如1-調用phantom.exit()之前經過1.5秒)。它基本上是這樣的:
var page = require('webpage').create();
var visitComplete = false;
var url = "http://some.url";
var pageOpenedTime;
setInterval(function() {
if (visitcomplete && typeof pageOpenedTime != 'undefined' &&
new Date() - pageOpenedTime >= 1500)
{
phantom.exit();
}
), 1000);
page.open(url, function() {
pageOpenedTime = new Date();
if (!hasMetaRefresh(page)) {
visitComplete = true;
}
});
function hasMetaRefresh(page) {
// Query the DOM here to detect meta refresh elements
}
有什麼更好的想法?
編輯:我應該提到,我的第一個想法是,可能會有一個PhantomJS事件在與初始頁面加載相關的JavaScript已執行時被觸發,但onLoadFinished回調似乎在執行任何in-頁面JavaScript,包括onload事件。我還做了一些關於可能需要等待的時間間隔的測試,並且雖然1000毫秒足夠長,以便在一個小測試頁中執行JavaScript重定向(通過body onload事件),但100 ms還不夠長。
我在我的項目中使用了相同的方法,即通話之間增加了一點暫停。恐怕這是唯一的選擇(現在)。 –