2013-05-28 3 views
11

Привет Я использую селена WebDriver 2.25.0 & faceing на некоторые серьезные проблемы,Найти сломанные изображения на странице и изображения заменить другим изображением

  1. как найти сломанные изображения на странице с использованием Selenium WebDriver
  2. Как найти изображение заменяется другим изображением с таким же именем (это также ошибка) с помощью webdriver.

Заранее благодарим за полезные предложения.

ответ

9

Следующие строки не оптимизированы, но они могут найти неработающие изображения:

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 
} 

Что касается вашего второго вопроса, я думаю, что я не правильно понимаю. Не могли бы вы объяснить это более подробно?

+0

Hi Johnbo, одно изображение с именем «MyImage.jpg», первый раз, когда я выполняю свой тестовый скрипт MyImage. ok через некоторое время изменения разработчика на сайте и этот «MyImage» заменяется другим изображением с таким же именем, как «MyImage» (папка с изображениями). Теперь мы выполним тестовый скрипт MyImage, найденный и наш тестовый скрипт. но на самом деле это ошибка, потому что в UI появляется другое изображение. Спасибо за ваш быстрый ответ. – Chetan

+2

Как я вижу, вам нужно сохранить изображение в первом исполнении, чтобы вы могли сравнить его в следующий раз, потому что с точки зрения HTML страница может быть точно такой же, и Selenium не сможет найти разницу в изображениях , Или, может быть, вы можете использовать Selenium в сочетании с инструментом распознавания изображений, например Sikuli Script. – Johnbo

+0

Я согласен, но все изображения с веб-страницы хранятся, а затем сравниваются, а это не хорошо по производительности. мы можем играть с размером изображения (т. е. мы можем сохранить размер изображения и сравнить размер изображения в следующий раз). любая идея, пожалуйста, предложите. – Chetan

14

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

К счастью, есть еще один способ, которым Вы можете сделать это, используя только 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? 

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

2

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

+0

'allImgElts' в транспортир-земле делает в основном то же самое, что' imgs' внутри браузера-земли, верно? (Я не уверен, что они есть, так что в основном я прошу об этом.) Но если бы они были ... единственное различие в длинах было бы, если бы какой-нибудь 'img [i] .naturalWidth <= 0', правильно?Таким образом, было бы проще и эффективнее пропустить «allImgElts», а сценарий для браузера-земли просто вернуть количество изображений с недопустимой естественной шириной и иметь участок транспортира, ожидающий, что число будет равным 0? (Вы будете пропускать причудливые вложенные «то», что является опрятным трюком, чтобы увидеть.) –

+0

Да, вы правы. Это можно упростить, возвращая количество сломанных изображений как «imgs.length - loaded», которое затем можно ожидать равным 0. Тогда «allImgEtls» больше не нужен. – avandeursen

Смежные вопросы