2012-05-10 3 views
6

Ich bin neu bei PhantomJS und Javascript und ich arbeite an einem Skript, das die Ladezeit testen, und ich möchte für es erkennen, ob ein Fehler 404/500 beim Testen und Anzeigen und Meldung in der Konsole aufgetreten ist .Log. Der Code geht so:Wie kann ich testen, dass eine Webseite 404/500 mit PhantomJS zurückgibt?

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

Hilfe wird sehr geschätzt. Danke

Antwort

8

Sie möchten vielleicht einen Blick auf die onResourceReceived Rückruf auf die Seite Objekt, sollten Sie in der Lage sein zu bekommen, was Sie von dort brauchen. (API docs...)

Dies ist ein bisschen ein erfundenes Beispiel, und es wird den Statuscode für jede Ressource zurückgeben, die als Teil der Anfrage abgerufen wird, aber der erste wird die Seite selbst sein (dh im Gegensatz JS oder CSS usw. zu unterstützen):

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

Zugegeben, setzt dies voraus, dass der Server tatsächlich Sie wird ein 404 zurück (im Gegensatz zu einem 200 als 404 getarnt im Gegensatz zum Beispiel) - aber etwas zusammen Diese Linien sollten dir geben, was du willst.

+0

Ein Zusatz: Wenn ich "jede empfangene Ressource" sage, mache ich auch die Annahme, dass nur eine Seite pro PhantomJS-Prozess geladen wird. Ich habe eine interessante Eigenart beobachtet, bei der PhantomJS keine Anfragen nach Ressourcen meldet, die aus dem Cache abgerufen werden. (Wenn Sie beispielsweise über einen PhantomJS-Prozess verfügen, der eine Seite und anschließend eine andere Seite von derselben Site lädt, wird nur eine einzige statische Ressource (z. B. jquery.js) auf der ersten Seite gemeldet, auf der diese Ressource angetroffen wird.) – founddrama

0

Ich glaube nicht, dass PhantomJS das Zurückbringen von HTTP-Response-Codes zur Zeit unterstützt. Damit dies möglich ist, müsste das Objekt WebPage das QNetworkReply-Objekt verfügbar machen und seinen HTTP-Antwortcode abrufen.

Der HTTP-Response-Code kann wie folgt in dem C++ Code erhalten:

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

Bis dieser in PhantomJS integriert ist ‚Quelle, ich glaube, Sie werden auf nur testen müssen‚Erfolg‘oder‘ nicht bestanden ". Wenn Sie wirklich den HTTP-Antwortcode sehen müssen, können Sie ein CURL-Skript ausführen, um die Antwort vom Server zu überprüfen. Ich vermute, dass "Erfolg" oder "gescheitert" für Ihre Zwecke in Ordnung ist.

0

@founddrama Antwort Ergänzung, wenn Sie Ihnen einen Stil 404-Seite haben und einige Vermögenswerte laden, onResourceReceived den Status aller dieser Vermögenswerte zeigen, so würde ich empfehlen, Ihren Code zu so etwas wie

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

zu ändern Sie haben also nur den Status der von Ihnen angeforderten Seite

Verwandte Themen