2010-03-01 12 views
38

Wie erhält man den HTTP-Statuscode in Selen?HTTP-Statuscode in Selen überprüfen

z. So kann ich testen, ob, wenn der Browser/user/27 anfordert und kein Benutzer mit ID = 27 existiert, ein HTTP 404 zurückgegeben wird?

Mein Hauptinteresse ist Selenium RC, aber wenn jemand die Antwort für "normales" Selen kennt, kann ich es wahrscheinlich leicht in RC übersetzen.

/Pete

+0

Mögliche Duplikat [Überprüfen Httpresponse-OK (200) mit Selen WebDriver] (http://stackoverflow.com/questions/14537336/checking-httpresponse-ok-200-with-selenium-webdriver) – Kzqai

+2

Diese Frage ist nicht genau ein Duplikat, denn als ich die Frage vor 6 Jahren stellte, sprach ich über Selenium RC, das WebDriver vorausgeht. Aber das macht diese Frage auch ziemlich irrelevant, weil ich nicht glaube, dass die Leute die alte API mehr benutzen würden. – Pete

Antwort

10

Dies ist vielleicht nicht die beste für diese Art von Test Verwendung von Selen sein. Es ist nicht notwendig, Notwendigkeit, einen Browser zu laden, wenn Sie tun können, und haben eine schnellere Lauftest

[Test] 
[ExpectedException(typeof(WebException), UserMessage = "The remote server returned an error: (404) Not Found")] 
public void ShouldThrowA404() 
{ 
    HttpWebRequest task; //For Calling the page 
    HttpWebResponse taskresponse = null; //Response returned 
    task = (HttpWebRequest)WebRequest.Create("http://foo.bar/thiswontexistevenifiwishedonedayitwould.html"); 
    taskresponse = (HttpWebResponse)task.GetResponse(); 
} 

Wenn Ihr Test auf eine andere Seite während eines 404 Selen wird Umleitung könnte die letzte Seite prüfen hat, was Sie erwarten.

1

Sie möchten wahrscheinlich den Aufruf captureNetworkTraffic() auschecken. Im Moment funktioniert es nur zuverlässig mit Firefox, außer Sie konfigurieren IE/Safari/etc manuell für den Proxy-Verkehr über Port 4444.

Um es zu verwenden, rufen Sie einfach selenium.start ("captureNetworkTraffic = true"), und später In Ihrem Skript können Sie selen.captureNetworkTraffic ("...") aufrufen, wobei "..." für "plain", "xml" oder "json" steht.

5

Da Selenium 2 HtmlUnit enthält, können Sie es verwenden, um direkt auf die Antwort zuzugreifen.

public static int getStatusCode(long appUserId) throws IOException { 
    WebClient webClient = new WebClient(); 
    int code = webClient.getPage(
      "http://your.url/123/" 
    ).getWebResponse().getStatusCode(); 
    webClient.closeAllWindows(); 
    return code; 
} 
+5

Leider funktioniert das nicht mit der C# Version von Selenium. – Pete

5

Ich weiß, dass dies ein schockierender Hack ist, aber das ist, was ich getan habe:

protected void AssertNotYellowScreen() 
    { 
     var selenium = Selenium; 

     if (selenium.GetBodyText().Contains("Server Error in '/' Application.")) 
     { 
      string errorTitle = selenium.GetTitle(); 

      Assert.Fail("Yellow Screen of Death: {0}", errorTitle); 
     } 
    } 

es die Aufgabe in der Situation getan wird ich es für erforderlich, obwohl ich es nicht ideal akzeptieren

...
+0

Ich habe sogar gerade nach dem Wort "error" im Fließtext gesucht. Nicht ideal, aber es macht den Job erledigt. –

+0

Ja, ich hatte das im Sinn und suchte nach etwas Besserem, aber das sieht nach der Art aus, wie ich jetzt gehen muss. –

-2

Wenn alle Stricke reißen Sie Ihren Server-Side-Code anpassen konnte, während des Tests, den HTTP-Status in der Seite als ein Element zur Ausgabe:

zum Beispiel auf meiner 403 Zugriff verweigert Seite, ich habe :

<h1 id="web_403">403 Access Denied</h1> 

, die leicht über die WebDriver API überprüft werden kann:

public boolean is403(WebDriver driver) { 
     try { 
      driver.findElement(By.id("web_403")); 
      return true; 
     } catch (NoSuchElementException e) { 
      return false; 
     } 
    } 

http://www.ninthavenue.com.au/how-to-get-the-http-status-code-in-selenium-webdriver

-2

Versuchen th ist, die Menschen

WebClient wc = new WebClient(); 
int countRepeats = 120; // one wait = 0.5 sec, total 1 minute after this code 
boolean haveResult = false; 
try { 
    HtmlPage pageHndl = wc.getPage(Urls); 
    for(int iter=0; iter<countRepeats; iter++){ 
     int pageCode = pageHndl.getWebResponse().getStatusCode(); 
     System.out.println("Page status "+pageCode); 
     if(pageCode == 200){ 
      haveResult = true; 
      break; 
     } 
     else{ 
      Thread.sleep(500); 
     } 
    } 
} catch (IOException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
} catch (InterruptedException e) { 
     e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
} 
Verwandte Themen