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