Как проверить URL для 404 с помощью Selenium WebDriver? - PullRequest
16 голосов
/ 21 сентября 2009

Как наиболее удобно использовать Selenium WebDriver для проверки успешного возврата URL GET (HTTP 200)?

В данном конкретном случае меня больше всего интересует проверка того, что изображения на текущей странице не повреждены.

Ответы [ 6 ]

10 голосов
/ 21 сентября 2009

Попробуйте это:

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.
  }
}
5 голосов
/ 21 сентября 2009

Вы можете использовать команду getEval, чтобы проверить значение, возвращаемое из следующего JavaScript для каждого изображения на странице.

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

Обновлен:

Добавлен протестированный пример TestNG / Java.

2 голосов
/ 10 декабря 2009

Не думаю, что первый ответ сработает. Когда я src ошибочно названный образ, он выдает ошибку 404, как и ожидалось. Однако, когда я проверяю javascript в firebug, для этого (поврежденного) изображения устанавливается .complete в значение true. Итак, это было законченное 404, но все еще сломанное изображение.

Второй ответ представляется более точным в том смысле, что он проверяет, что он завершен, а затем проверяет наличие некоторой ширины изображения.

Я сделал версию второго ответа на python, которая работает для меня. Можно немного почистить, но, надеюсь, это поможет.

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 голосов
/ 02 апреля 2014

Основа для проверки 404:

В основном 404 можно проверить через HTTP-ответ URL.

Шаг 1. Импорт библиотеки для HTTPTestAPI
Шаг 2. Создайте запрос 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 голосов
/ 23 ноября 2012

Вместо обхода в Java может быть быстрее вызвать javascript только один раз для всех изображений.

boolean allImgLoaded = (Boolean)((JavascriptExecutor) driver).executeScript(
    "return Array.prototype.slice.call(document.images).every(" 
    + "function (img) {return img.complete && img.naturalWidth > 0;});");
0 голосов
/ 16 июня 2010

Одним из альтернативных решений является анализ журналов веб-сервера после выполнения теста. Такой подход позволяет ловить не только пропущенные изображения, но и CSS, скрипты и другие ресурсы.

Описание того, как это сделать, здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...