2009-09-21 15 views
16

Jaki jest najwygodniejszy sposób użycia Selenium WebDriver do sprawdzenia, czy URL GET powraca pomyślnie (HTTP 200)?Jak sprawdzić adres URL dla 404 przy użyciu Selenium WebDriver?

W tym konkretnym przypadku najbardziej interesuje mnie sprawdzenie, czy żadne obrazy bieżącej strony nie zostały zerwane.

+0

Czy tytuł tego pytania nie powinien brzmieć "Jak sprawdzić, czy adres URL załadował wszystkie obrazy na stronie internetowej za pomocą Selenium WebDriver?"? Przyjęta odpowiedź nie ma nic wspólnego z kodami odpowiedzi HTTP, a to wyklucza możliwość zadawania podobnego pytania. – 0112

+0

Podobnego pytania (do sprawdzania kodów odpowiedzi) został zadany/odpowiedział tutaj: http://stackoverflow.com/a/14547168/1596460 – 0112

Odpowiedz

10

Spróbuj tego:

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

Potrzebowałem również użyć sprawdzenia naturalWidth sugerowanego przez Dave Hunt, więc załadowane wyrażenie staje się teraz: boolean loaded = (Boolean) driver.executeScript ("zwracane argumenty [0] .complete && argumenty typeof [0] .naturalWidth! = \" Undefined \ "&& argumenty [0] .naturalWidth> 0", image); – paulcm

5

Możesz użyć polecenia getEval, aby zweryfikować wartość zwróconą z następującego kodu JavaScript dla każdego obrazu na stronie.

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

Aktualizacja:

Dodany przetestowany przykład TestNG/Java.

2

Nie sądzę, że pierwszą reakcją będzie działać. Kiedy src jest błędnie nazwany obrazem, generuje błąd 404 zgodnie z oczekiwaniami. Jednak gdy sprawdzam javascript w firebug, ten (uszkodzony) obraz ma .complete ustawiony na true. Tak więc był to ukończony 404, ale wciąż zepsuty obraz.

Druga odpowiedź wydaje się być dokładniejsza, ponieważ sprawdza, czy jest kompletna, a następnie sprawdza, czy obraz ma jakąś szerokość.

Zrobiłem wersję pytona drugiej odpowiedzi, która działa dla mnie. Może być trochę oczyszczony, ale mam nadzieję, że to pomoże.

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

Jednym z alternatywnych rozwiązań jest analiza dzienników serwera WWW po wykonaniu testu. Takie podejście pozwala uchwycić nie tylko pominięte obrazy, ale także css, skrypty i inne zasoby.

Opis tego, jak to zrobić, to here.

0

Zamiast przechodzić przez Javę, może być szybciej wywołać javascript tylko raz dla wszystkich obrazów.

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

Funda do sprawdzania 404:

Zasadniczo błędy 404 można sprawdzić poprzez odpowiedzi HTTP URL.

Krok 1: Zaimportuj bibliotekę do HTTPTestAPI
Krok 2: Utwórz zapytanie 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

Ta odpowiedź nie odnosi się do Selenium i zamiast tego używa oddzielnego połączenia HTTP do przetestowania –