Поиск сломанных изображений в замене страницы и изображения другим изображением

Привет, я использую 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, а функция, выполняемая в контексте браузера, подсчитывает количество успешно загруженных элементов. Эти цифры должны быть одинаковыми.