Как проверить URL-адрес для 404 с помощью Selenium WebDriver?
Каков наиболее удобный способ использования Selenium WebDriver, чтобы проверить, успешно ли возвращается URL GET (HTTP 200)?
В этом конкретном случае меня больше всего интересует проверка того, что изображения текущей страницы не сломаны.
Ответы
Ответ 1
Попробуйте следующее:
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.
}
}
Ответ 2
Вы можете использовать команду 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.
Ответ 3
Я не думаю, что первый ответ будет работать. Когда я просматриваю неназванный образ, он выдает ошибку 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"))
Ответ 4
Одним из альтернативных решений является анализ журналов веб-серверов после выполнения теста. Этот подход позволяет уловить не только пропущенные изображения, но и css, скрипты и другие ресурсы.
Описание того, как это сделать, здесь.
Ответ 5
Вместо того, чтобы перемещаться по Java, может быть быстрее вызывать javascript только один раз для всех изображений.
boolean allImgLoaded = (Boolean)((JavascriptExecutor) driver).executeScript(
"return Array.prototype.slice.call(document.images).every("
+ "function (img) {return img.complete && img.naturalWidth > 0;});");
Ответ 6
Фунда для проверки 404:
В основном 404s можно проверить через 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