Поиск сломанных изображений в замене страницы и изображения другим изображением
Привет, я использую selenium webdriver 2.25.0 и сталкиваюсь с некоторыми серьезными проблемами,
- как найти сломанные изображения на странице с помощью Selenium Webdriver
- Как найти изображение заменяется другим изображением с таким же именем (это также ошибка) с помощью webdriver.
Заранее благодарим за полезные предложения.
Ответы
Ответ 1
Следующие строки не оптимизированы, но они могут найти сломанные изображения:
List<WebElement> imagesList = _driver.findElements(By.tagName("img"));
for (WebElement image : imagesList)
{
HttpResponse response = new DefaultHttpClient().execute(new HttpGet(image.getAttribute("src");));
if (response.getStatusLine().getStatusCode() != 200)
// Do whatever you want with broken images
}
Что касается вашей второй проблемы, я думаю, что я не понял ее правильно. Не могли бы вы объяснить это более подробно?
Ответ 2
Принятый ответ требует, чтобы вы использовали прокси с дополнительным вызовом для каждого изображения, чтобы определить, не сломаны ли изображения.
К счастью, есть еще один способ сделать это, используя только javascript (я использую Ruby, но вы можете использовать один и тот же код в любом методе executeScript
для привязок WebDriver):
images = @driver.find_elements(:tag_name => "img")
broken_images = images.reject do |image|
@driver.execute_script("return arguments[0].complete && typeof arguments[0].naturalWidth != \"undefined\" && arguments[0].naturalWidth > 0", image)
end
# broken_images now has an array of any images on the page with broken links
# and we want to ensure that it doesn't have any items
assert broken_images.empty?
К вашему другому вопросу, я бы порекомендовал просто снять скриншот страницы и с помощью человека проверить, что полученный скриншот имеет правильные изображения. Компьютеры могут выполнять работу по автоматизации, но люди должны периодически проверять и проверять результаты:)
Ответ 3
В соответствии с другими ответами код, который в конечном итоге работал у меня в настройке angular/транспортир/webdriverjs:
it('should find all images', function () {
var allImgElts = element.all(by.tagName('img'));
browser.executeAsyncScript(function (callback) {
var imgs = document.getElementsByTagName('img'),
loaded = 0;
for (var i = 0; i < imgs.length; i++) {
if (imgs[i].naturalWidth > 0) {
loaded = loaded + 1;
};
};
callback(loaded);
}).then(function (loadedImagesCount) {
expect(loadedImagesCount).toBe(allImgElts.count());
});
});
Код webdriver подсчитывает количество элементов img, а функция, выполняемая в контексте браузера, подсчитывает количество успешно загруженных элементов. Эти цифры должны быть одинаковыми.