2012-05-10 35 views
6

我是PhantomJS和Javascript的新手,我正在研究測試加載時間的腳本,我希望它能夠檢測測試它時是否遇到錯誤404/500,並在控制檯中顯示和消息日誌。代碼如下所示:如何使用PhantomJS測試網頁是否返回404/500?

var page = require('webpage').create(), t, address; 
t = Date.now(); 

var testArray = 
['someURL']; 

function loadTest(testURL) 
{ 
address = testURL; 
page.open(address, function (status) { 
    if (status !== 'success') { 
     console.log('FAIL to load the address' + address); 
return; 
    } 

}); 
} 

for(var i = 0; i < testArray.length; i++) 
{ 
loadTest(testArray[i]); 
t = Date.now() - t; 
console.log('Testing ' + testArray[i]); 
console.log('Loading time ' + t + ' msec\n'); 
} 
phantom.exit(); 

幫助非常感謝。謝謝

回答

8

你可能想看看onResourceReceived回調頁面對象,你應該能夠從那裏得到你需要的。 (API docs...

這是一個有點人爲的例子,它將返回作爲請求一部分檢索到的每個資源的狀態碼,但第一個將是頁面本身(即,相反支持JS或CSS等):

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

page.onResourceReceived = function(res) { 
    if (res.stage === 'end') { 
    console.log('Status code: ' + res.status); 
    } 
}; 

page.open('http://some.url/that/does-not-exist', function() { 
    phantom.exit(); 
}); 

當然,這假定服務器將返回實際上你404(而不是200僞裝成404等) - 但沿東西這些行應該給你你想要的。

+0

附錄:當我說「收到的每一個資源」時,我也假定你每個PhantomJS進程只加載一個頁面。我觀察到一個有趣的怪癖,其中PhantomJS不報告它從緩存中檢索到的資源請求。 (也就是說,如果您有一個PhantomJS進程加載頁面,然後是來自同一站點的另一個進程,它將僅在遇到該資產的第一頁上報告一個靜態資產(例如,jquery.js)。) – founddrama

0

我不認爲PhantomJS當前支持返回HTTP響應代碼。爲了做到這一點,WebPage對象需要公開QNetworkReply對象並獲取它的HTTP響應代碼。

HTTP響應代碼可以像這樣在C++代碼來獲得:

int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); 

在此之前被集成到PhantomJS「源,我想你只需要測試‘失敗成功’或」 」。如果您確實需要查看HTTP響應代碼,則可以運行CURL腳本來檢查服務器的響應。儘管如此,我懷疑'成功'或'失敗'對你而言會很好。

0

補充@founddrama答案,如果你有一個風格的404頁,並加載一些資產,onResourceReceived將顯示所有這些資產的狀態,所以我會推薦給你的代碼更改爲類似

var definedStatus = false; 
page.onResourceReceived = function(res) { 
    if (res.stage === 'end' && definedStatus === false) { 
     definedStatus = res.status; 
    } 
}; 

page.open(url, function(status) { 
    if (status == 'success' && definedStatus == 200) {  
     // do something 
     phantom.exit(); 
    } else { 
     console.log("Erro") 
     phantom.exit(1); 
    } 
}); 

所以你將只有你所要求的頁面的狀態

相關問題