使用Selenium和Firefox复制的屏幕截图

时间:2019-02-20 09:18:59

标签: selenium firefox image-processing screenshot selenium-firefoxdriver

我使用Selenium通过firefox Web驱动程序自动执行一些GUI测试。

在我看来,在测试过程中创建屏幕截图以使用手册中的截图也很有意义。

我的应用程序的屏幕是相对静态的-没有可见的时间戳等等。因此,我的期望是,如果我从起始页面创建屏幕截图,然后再次导航至起始页面,则屏幕截图应该相同。另外,如果我两次运行测试,两次运行之间的起始页面截图应该相同。

我将屏幕截图保存为PNG,甚至在保存之前都对屏幕截图进行了保存(不保存日期),因此文件应该完全相同。

尽管如此,如果我将图片彼此进行比较(例如,将它们彼此相减),则它们之间会存在细微的差异(肉眼看不到),表格边缘或字体周围会出现一些淡淡的线条。

我的问题:

1)为什么根本没有区别?

2)确保屏幕截图相同的最简单方法是什么? (我可以进行哪种后期处理)

PS:我还尝试将渲染器从Skia更改为Windows到cairo,但是尽管差异稍有不同,但仍不能解决问题。

1 个答案:

答案 0 :(得分:0)

如何保存图像?

在红宝石中,我使用的是这样的东西?

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

我正在检查图像差异

    # 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

如果未100%加载浏览器DOM,则可以获得不同的结果。我将尝试设定一个阈值,以使图像达到期望值。

.Net https://www.codeproject.com/Articles/374386/Simple-image-comparison-in-NET中有一个很好的项目,您可以将其转换为所需的任何语言。