2009-09-21 23 views
16

¿Cuál es la forma más conveniente de usar Selenium WebDriver para verificar si un URL GET retorna exitosamente (HTTP 200)?¿Cómo verificar la URL de 404 usando Selenium WebDriver?

En este caso particular, estoy más interesado en verificar que no se rompan las imágenes de la página actual.

+0

¿No debería ser el título de esta pregunta realmente "¿Cómo verificar si la URL cargó todas las imágenes en una página web con Selenium WebDriver?"? La respuesta aceptada no tiene nada que ver con los códigos de respuesta HTTP, y esto impide que se haga una pregunta similar. – 0112

+0

Una pregunta similar (para verificar los códigos de respuesta) fue hecha/respondida aquí: http://stackoverflow.com/a/14547168/1596460 – 0112

Respuesta

10

Prueba esto:

List<WebElement> allImages = driver.findElements(By.tagName("img")); 
for (WebElement image : allImages) { 
    boolean loaded = ((JavaScriptExecutor) driver).executeScript(
     "return arguments[0].complete", image); 
    if (!loaded) { 
    // Your error handling here. 
    } 
} 
+3

También necesitaba usar la verificación de natural width sugerida por Dave Hunt, por lo que la expresión cargada ahora se convierte en: boolean loaded = (Boolean) driver.executeScript ("argumentos de retorno [0] .pleto && tipo de argumentos [0] .naturalWidth! = \" Undefined \ "&& arguments [0] .naturalWidth> 0", imagen); – paulcm

5

Puede usar el comando getEval para verificar el valor devuelto por el siguiente JavaScript para cada imagen en la página.

@Test 
public void checkForBrokenImages() { 
    selenium.open("http://www.example.com/"); 
    int imageCount = selenium.getXpathCount("//img").intValue(); 
    for (int i = 0; i < imageCount; i++) { 
     String currentImage = "this.browserbot.getUserWindow().document.images[" + i + "]"; 
     assertEquals(selenium.getEval("(!" + currentImage + ".complete) ? false : !(typeof " + currentImage + ".naturalWidth != \"undefined\" && " + currentImage + ".naturalWidth == 0);"), "true", "Broken image: " + selenium.getEval(currentImage + ".src")); 
    } 
} 

Actualizado:

Agregado probados ejemplo TestNG/Java.

2

No creo que la primera respuesta va a funcionar. Cuando configuro una imagen mal llamada, arroja un error 404 como se esperaba. Sin embargo, cuando verifico javascript en firebug, esa imagen (rota) tiene .complete establecido en verdadero. Entonces, fue una 404 completa, pero sigue siendo una imagen rota.

La segunda respuesta parece ser más precisa ya que comprueba que está completa y luego verifica que haya algo de ancho en la imagen.

Hice una versión de Python de la segunda respuesta que me funciona. Podría limpiarse un poco, pero espero que ayude.

def checkForBrokenImages(self): 
    sel = self.selenium 
    imgCount = int(sel.get_xpath_count("//img")) 
    for i in range(0,imgCount): 
     isComplete = sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].complete") 
     self.assertTrue(isComplete, "Bad Img (!complete): "+sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].src")) 
     typeOf = sel.get_eval("typeof selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].naturalWidth") 
     self.assertTrue(typeOf != 'undefined', "Bad Img (w=undef): "+sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].src")) 
     natWidth = int(sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].naturalWidth")) 
     self.assertTrue(natWidth > 0, "Bad Img (w=0): "+sel.get_eval("selenium.browserbot.getCurrentWindow().document.images[" + str(i) + "].src")) 
0

Una de las soluciones alternativas es analizar los registros del servidor web después de la ejecución de la prueba. Este enfoque permite capturar no solo imágenes perdidas, sino css, scripts y otros recursos.

Descripción de cómo hacerlo es here.

0

En lugar de atravesar en Java, puede ser más rápido llamar javascript solo una vez para todas las imágenes.

boolean allImgLoaded = (Boolean)((JavascriptExecutor) driver).executeScript(
    "return Array.prototype.slice.call(document.images).every(" 
    + "function (img) {return img.complete && img.naturalWidth > 0;});"); 
-1

Funda para el control de 404:

Básicamente 404s se puede comprobar a través de respuesta HTTP de la URL.

Paso 1: importe la biblioteca para HTTPTestAPI
Paso 2: cree HTTPRequest.

String URL="www.abc.com"; 
HTTPRequest request = new HTTPRequest(URL); 

//Get the response code of the URL 
int response_code = request.getResponseCode(); 

//Check for 404: 
if(response_code == 404) 
    FAIL -- THE URL is leading to 404. 
else 
    PASS 
+0

Esta respuesta no se dirige a Selenium y en su lugar utiliza una conexión HTTP por separado para probar –

Cuestiones relacionadas