2012-05-10 28 views
6

Tôi mới ở PhantomJS và Javascript và tôi đang làm việc trên một tập lệnh thử nghiệm thời gian tải và tôi muốn nó phát hiện xem có lỗi 404/500 gặp phải trong khi thử nghiệm và hiển thị và nhắn tin trong bảng điều khiển không .log. Mã như sau:Làm cách nào để kiểm tra xem trang web có trả lại 404/500 bằng PhantomJS không?

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(); 

Trợ giúp được đánh giá cao. Cảm ơn

Trả lời

8

Bạn có thể muốn xem qua gọi lại onResourceReceived đối tượng trang, bạn sẽ có thể nhận được những gì bạn cần từ đó. (API docs...)

Đây là một ví dụ giả tạo, và sẽ trả về mã trạng thái cho mọi tài nguyên được truy xuất như một phần của yêu cầu, nhưng trang đầu tiên sẽ là chính trang đó. để hỗ trợ JS hoặc CSS, vv):

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(); 
}); 

Cấp, điều này giả định rằng các máy chủ sẽ thực sự trả lại cho bạn một 404 (như trái ngược với một 200 giả mạo như là một 404, ví dụ) - nhưng cái gì đó dọc những dòng này sẽ cung cấp cho bạn những gì bạn muốn.

+0

Phụ lục: khi tôi nói "mọi tài nguyên đã nhận", tôi cũng giả định rằng bạn chỉ tải một trang cho mỗi quá trình PhantomJS. Tôi đã quan sát thấy một điều thú vị trong đó PhantomJS không báo cáo các yêu cầu về các tài nguyên mà nó lấy ra từ bộ nhớ cache của nó. (tức là, nếu bạn có quá trình PhantomJS tải một trang và sau đó một trang khác từ cùng một trang, nó sẽ chỉ báo cáo một nội dung tĩnh đơn lẻ (ví dụ: jquery.js) trên trang đầu tiên mà nội dung đó gặp phải.) – founddrama

0

Tôi không tin rằng PhantomJS hỗ trợ trả lại mã phản hồi HTTP hiện tại. Để thực hiện điều này, đối tượng WebPage cần phải phơi bày đối tượng QNetworkReply và nhận mã phản hồi HTTP của nó.

Các mã phản hồi HTTP có thể thu được như thế này trong ++ mã C:

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

Cho đến này được tích hợp vào PhantomJS 'nguồn, tôi nghĩ rằng bạn sẽ chỉ cần phải thử nghiệm trên 'thành công' hoặc' thất bại '. Nếu bạn thực sự cần xem mã phản hồi HTTP, bạn có thể chạy tập lệnh CURL để kiểm tra phản hồi từ máy chủ. Tôi nghi ngờ rằng 'thành công' hoặc 'thất bại' sẽ được sử dụng tốt cho mục đích của bạn.

0

bổ sung @founddrama câu trả lời, nếu bạn bạn có một kiểu trang 404 và tải một số tài sản, onResourceReceived sẽ hiển thị trạng thái của tất cả những tài sản, vì vậy tôi sẽ khuyên bạn nên thay đổi mã của bạn để một cái gì đó giống như

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); 
    } 
}); 

vì vậy bạn sẽ chỉ có trạng thái của trang mà bạn yêu cầu

Các vấn đề liên quan