2010-03-01 24 views
38

¿Cómo obtener el código de estado HTTP en Selenium?Comprobando el código de estado HTTP en Selenium

E.g. entonces puedo probar que si el navegador solicita/usuario/27 y ningún usuario con ID = 27 existe, se devuelve un HTTP 404?

Mi principal interés es Selenium RC, pero si alguien sabe la respuesta para el selenio "normal", probablemente pueda traducirlo fácilmente a RC.

/Pete

+0

duplicado posible de [Comprobación HttpResponse OK (200) con selenio WebDriver] (http://stackoverflow.com/questions/14537336/checking-httpresponse-ok-200-with-selenium-webdriver) – Kzqai

+2

Esta pregunta no es exactamente un duplicado, porque cuando hice la pregunta hace 6 años, estaba hablando de Selenium RC que es anterior a WebDriver. Pero eso también hace que esta pregunta sea irrelevante porque no creo que las personas ya usen la antigua API. – Pete

Respuesta

10

Esto podría no ser el mejor uso de selenio para este tipo de prueba. No hay necesidad innecesaria para cargar un navegador cuando se podía hacer y tener una prueba de funcionamiento más rápido

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

Si la prueba está redirigiendo a otra página durante una Selenio 404 podría comprobar la página final tiene lo que usted espera.

1

Probablemente desee verificar la llamada captureNetworkTraffic(). En este momento solo funciona de manera confiable con Firefox, a menos que configure manualmente IE/Safari/etc para usar el tráfico proxy a través del puerto 4444.

Para usarlo, simplemente llame a selenium.start ("captureNetworkTraffic = true") y luego en su secuencia de comandos puede llamar a selenium.captureNetworkTraffic ("...") donde "..." es "simple", "xml" o "json".

5

Dado que Selenium 2 incluye HtmlUnit, puede utilizarlo para tener acceso a la respuesta directamente.

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

Desafortunadamente eso no funciona con la versión C# de Selenium. – Pete

5

Sé que esto es un truco impactante, pero esto es lo que he hecho:

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

consigue el trabajo hecho en la situación que necesitaba para, aunque acepto que no es ideal ...

+0

Acabo de recurrir a buscar la palabra "error" en el texto del cuerpo. No es ideal, pero hace el trabajo bien. –

+0

Sí, tenía esto en mente y estaba buscando algo mejor, pero esta parece la forma en que tendré que ir por ahora. –

-2

Si todo lo demás falla se podría adaptar su código del lado del servidor, durante las pruebas, a la salida del estado HTTP de la página como un elemento:

Por ejemplo, en mi página denegado el permiso 403, tengo :

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

que se puede comprobar fácilmente a través de la API WebDriver:

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

Pruebe th es decir, las personas

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. 
} 
Cuestiones relacionadas