我使用Selenium通过firefox Web驱动程序自动执行一些GUI测试。
在我看来,在测试过程中创建屏幕截图以使用手册中的截图也很有意义。
我的应用程序的屏幕是相对静态的-没有可见的时间戳等等。因此,我的期望是,如果我从起始页面创建屏幕截图,然后再次导航至起始页面,则屏幕截图应该相同。另外,如果我两次运行测试,两次运行之间的起始页面截图应该相同。
我将屏幕截图保存为PNG,甚至在保存之前都对屏幕截图进行了保存(不保存日期),因此文件应该完全相同。
尽管如此,如果我将图片彼此进行比较(例如,将它们彼此相减),则它们之间会存在细微的差异(肉眼看不到),表格边缘或字体周围会出现一些淡淡的线条。
我的问题:
1)为什么根本没有区别?
2)确保屏幕截图相同的最简单方法是什么? (我可以进行哪种后期处理)
PS:我还尝试将渲染器从Skia更改为Windows到cairo,但是尽管差异稍有不同,但仍不能解决问题。
答案 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中有一个很好的项目,您可以将其转换为所需的任何语言。