Воспроизводимые скриншоты с Selenium и Firefox - PullRequest
0 голосов
/ 20 февраля 2019

Я использую Selenium для автоматизации некоторых тестов GUI с помощью веб-драйвера firefox.

Мне пришло в голову, что было бы также целесообразно создавать скриншоты во время выполнения тестов, чтобы использовать их в руководстве.

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

Я сохраняю снимки экрана в формате PNG, даже обрабатываю снимки экрана (сохраняю без даты) перед их сохранением, чтобыфайлы должны быть действительно идентичны.

Тем не менее, если я сравниваю картинки друг с другом (например, вычитая их друг от друга), между ними есть небольшие различия (не видны невооруженным глазом), некоторые слабые линиина границе таблиц или вокруг шрифтов.

Мой вопрос:

1) Почему вообще есть различия?

2) Что может быть самым простым способом обеспечитьчто скриншоты идентичны?(какую бы обработку я мог выполнить)

PS: Я также пытался изменить рендеринг с skia на windows на cairo, но, хотя различия немного отличаются, проблема все равно не решается.

1 Ответ

0 голосов
/ 20 февраля 2019

Как сохранить изображения?

В ruby ​​я использовал что-то вроде этого?

def take_screenshot(image_id)
  scenario = Zpg::HooksHelper::FeatureHelper.scenario_name
  Dir.mkdir('output', 0o777) unless File.directory?('output')
  Dir.mkdir('output/screenshots', 0o777) unless File.directory?('output/screenshots')
  screenshot = "./output/screenshots/#{image_id}#{scenario.tr(' ', '_').gsub(/[^0-9A-Za-z_]/, '')}.png"
  if page.driver.browser.respond_to?(:save_screenshot)
    page.driver.browser.save_screenshot(screenshot)
  else
    save_screenshot(screenshot)
  end
  FileUtils.chmod(0o777, screenshot)
end

И я проверял diff раз

    # return[hash]
    def image_diff(imageid_1 = nil, _imageid_2 = nil)
      scenario = Zpg::HooksHelper::FeatureHelper.scenario_name
      if imageid_1.class != Integer
        image_1 = "./features/support/data/images/#{Zpg.brand}/#{imageid_1}.png"
        image_2 = "./output/screenshots/#{_imageid_2}#{scenario.tr(' ', '_').gsub(/[^0-9A-Za-z_]/, '')}.png"
      else
        image_1 = "./output/screenshots/#{imageid_1}#{scenario.tr(' ', '_').gsub(/[^0-9A-Za-z_]/, '')}.png"
        image_2 = "./output/screenshots/#{_imageid_2}#{scenario.tr(' ', '_').gsub(/[^0-9A-Za-z_]/, '')}.png"
      end
      images = [
          ChunkyPNG::Image.from_file(image_1),
          ChunkyPNG::Image.from_file(image_2)
      ]

      diff = []

      images.first.height.times do |y|
        images.first.row(y).each_with_index do |pixel, x|
          diff << [x, y] unless pixel == images.last[x, y]
        end
      end
      puts "pixels (total):     #{images.first.pixels.length}"
      puts "pixels changed:     #{diff.length}"
      puts "pixels changed (%): #{(diff.length.to_f / images.first.pixels.length) * 100}%"

      # init empty hash
      diff_hash = {}
      # return pixels changed number
      diff_hash[:pixels_changed] = diff.length
      # return pixels changed percentage
      diff_hash[:pixels_changed_percentage] = (diff.length.to_f / images.first.pixels.length) * 100
      # return diff hash
      diff_hash
    end

Вы можете получить другие результаты, если DOM браузера не загружен на 100%.Я бы попытался установить порог, в котором я ожидал бы, что мое изображение будет.

В .Net https://www.codeproject.com/Articles/374386/Simple-image-comparison-in-NET есть очень хороший проект, который вы можете конвертировать на любом языке, который хотите.

...