capybara-screenshot-diff 0.9.1 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +1 -1
- data/lib/capybara/screenshot/diff.rb +25 -0
- data/lib/capybara/screenshot/diff/image_compare.rb +4 -1
- data/lib/capybara/screenshot/diff/stabilization.rb +50 -44
- data/lib/capybara/screenshot/diff/test_methods.rb +5 -32
- data/lib/capybara/screenshot/diff/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ae86364bfe6e5bbcfe03ce6c9b6a0a39c60b2ac
|
4
|
+
data.tar.gz: 803b1d3d309c2a4e93e2de388c5666d03712325a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 73d1f23776d8afc8315b7d518b78448a2215b526f7f50088fc809df70359ccb27b1f635b6e905d080ca286596e98825f98f77cb2a303c59b3c54eba12de8e3fe
|
7
|
+
data.tar.gz: 8534dcb0cf6b3a72b26d42f010d255f35afe38e9f4b8defc34396227932b93fe6baf19f6ba71f09258d4ba09943266239b9d7f924b226c99596b8d6ca6873919
|
data/.rubocop_todo.yml
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'capybara/dsl'
|
1
2
|
require 'capybara/screenshot/diff/version'
|
2
3
|
require 'capybara/screenshot/diff/image_compare'
|
3
4
|
require 'capybara/screenshot/diff/test_methods'
|
@@ -32,9 +33,33 @@ module Capybara
|
|
32
33
|
|
33
34
|
# Module to track screen shot changes
|
34
35
|
module Diff
|
36
|
+
include Capybara::DSL
|
37
|
+
include Capybara::Screenshot::Os
|
38
|
+
|
35
39
|
mattr_accessor :area_size_limit
|
36
40
|
mattr_accessor :color_distance_limit
|
37
41
|
mattr_accessor(:enabled) { true }
|
42
|
+
|
43
|
+
def self.included(clas)
|
44
|
+
clas.include TestMethods
|
45
|
+
clas.setup do
|
46
|
+
if Capybara::Screenshot.window_size
|
47
|
+
if selenium?
|
48
|
+
page.driver.browser.manage.window.resize_to(*Capybara::Screenshot.window_size)
|
49
|
+
elsif poltergeist?
|
50
|
+
page.driver.resize(*Capybara::Screenshot.window_size)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
clas.teardown do
|
56
|
+
if Capybara::Screenshot::Diff.enabled && @test_screenshots
|
57
|
+
test_screenshot_errors = @test_screenshots
|
58
|
+
.map { |caller, name, compare| assert_image_not_changed(caller, name, compare) }.compact
|
59
|
+
fail(test_screenshot_errors.join("\n\n")) if test_screenshot_errors.any?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
38
63
|
end
|
39
64
|
end
|
40
65
|
end
|
@@ -3,6 +3,8 @@ require 'chunky_png'
|
|
3
3
|
module Capybara
|
4
4
|
module Screenshot
|
5
5
|
module Diff
|
6
|
+
# Compare two images and determine if they are equal, different, or within som comparison
|
7
|
+
# range considering color values and difference area size.
|
6
8
|
class ImageCompare
|
7
9
|
include ChunkyPNG::Color
|
8
10
|
|
@@ -21,10 +23,11 @@ module Capybara
|
|
21
23
|
reset
|
22
24
|
end
|
23
25
|
|
26
|
+
# Resets the calculated data about the comparison with regard to the "new_image".
|
27
|
+
# Data about the original image is kept.
|
24
28
|
def reset
|
25
29
|
@max_color_distance = @color_distance_limit ? 0 : nil
|
26
30
|
@left = @top = @right = @bottom = nil
|
27
|
-
@_old_filesize = nil
|
28
31
|
end
|
29
32
|
|
30
33
|
# Compare the two image files and return `true` or `false` as quickly as possible.
|
@@ -18,7 +18,48 @@ module Capybara
|
|
18
18
|
}()
|
19
19
|
EOF
|
20
20
|
|
21
|
-
def
|
21
|
+
def take_stable_screenshot(comparison, color_distance_limit:, area_size_limit:)
|
22
|
+
input = prepare_page_for_screenshot
|
23
|
+
previous_file_name = comparison.old_file_name
|
24
|
+
screenshot_started_at = last_image_change_at = Time.now
|
25
|
+
loop.with_index do |_x, i|
|
26
|
+
take_right_size_screenshot(comparison)
|
27
|
+
|
28
|
+
break unless Capybara::Screenshot.stability_time_limit
|
29
|
+
if comparison.quick_equal?
|
30
|
+
clean_stabilization_images(comparison.new_file_name)
|
31
|
+
break
|
32
|
+
end
|
33
|
+
comparison.reset
|
34
|
+
|
35
|
+
if previous_file_name
|
36
|
+
stabilization_comparison =
|
37
|
+
ImageCompare.new(comparison.new_file_name, previous_file_name,
|
38
|
+
color_distance_limit: color_distance_limit, area_size_limit: area_size_limit)
|
39
|
+
if stabilization_comparison.quick_equal?
|
40
|
+
if (Time.now - last_image_change_at) > Capybara::Screenshot.stability_time_limit
|
41
|
+
clean_stabilization_images(comparison.new_file_name)
|
42
|
+
break
|
43
|
+
end
|
44
|
+
next
|
45
|
+
else
|
46
|
+
last_image_change_at = Time.now
|
47
|
+
end
|
48
|
+
|
49
|
+
check_max_wait_time(comparison, screenshot_started_at)
|
50
|
+
end
|
51
|
+
|
52
|
+
previous_file_name = "#{comparison.new_file_name.chomp('.png')}_x#{format('%02i', i)}.png~"
|
53
|
+
|
54
|
+
FileUtils.mv comparison.new_file_name, previous_file_name
|
55
|
+
end
|
56
|
+
ensure
|
57
|
+
input.click if input
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
private def reduce_retina_image_size(file_name)
|
22
63
|
return if !ON_MAC || !selenium? || !Capybara::Screenshot.window_size
|
23
64
|
saved_image = ChunkyPNG::Image.from_file(file_name)
|
24
65
|
width = Capybara::Screenshot.window_size[0]
|
@@ -28,15 +69,15 @@ module Capybara
|
|
28
69
|
resized_image.save(file_name)
|
29
70
|
end
|
30
71
|
|
31
|
-
def stabilization_images(base_file)
|
72
|
+
private def stabilization_images(base_file)
|
32
73
|
Dir["#{base_file.chomp('.png')}_x*.png~"]
|
33
74
|
end
|
34
75
|
|
35
|
-
def clean_stabilization_images(base_file)
|
76
|
+
private def clean_stabilization_images(base_file)
|
36
77
|
FileUtils.rm stabilization_images(base_file)
|
37
78
|
end
|
38
79
|
|
39
|
-
def prepare_page_for_screenshot
|
80
|
+
private def prepare_page_for_screenshot
|
40
81
|
assert_images_loaded
|
41
82
|
if Capybara::Screenshot.blur_active_element
|
42
83
|
active_element = execute_script(<<-JS)
|
@@ -52,7 +93,7 @@ module Capybara
|
|
52
93
|
input
|
53
94
|
end
|
54
95
|
|
55
|
-
def take_right_size_screenshot(comparison)
|
96
|
+
private def take_right_size_screenshot(comparison)
|
56
97
|
save_screenshot(comparison.new_file_name)
|
57
98
|
|
58
99
|
# TODO(uwe): Remove when chromedriver takes right size screenshots
|
@@ -60,48 +101,13 @@ module Capybara
|
|
60
101
|
# ODOT
|
61
102
|
end
|
62
103
|
|
63
|
-
def
|
64
|
-
|
65
|
-
|
66
|
-
screenshot_started_at = last_image_change_at = Time.now
|
67
|
-
loop.with_index do |_x, i|
|
68
|
-
take_right_size_screenshot(comparison)
|
69
|
-
|
70
|
-
break unless Capybara::Screenshot.stability_time_limit
|
71
|
-
if comparison.quick_equal?
|
72
|
-
clean_stabilization_images(comparison.new_file_name)
|
73
|
-
break
|
74
|
-
end
|
75
|
-
comparison.reset
|
76
|
-
|
77
|
-
if previous_file_name
|
78
|
-
stabilization_comparison =
|
79
|
-
ImageCompare.new(comparison.new_file_name, previous_file_name,
|
80
|
-
color_distance_limit: color_distance_limit, area_size_limit: area_size_limit)
|
81
|
-
if stabilization_comparison.quick_equal?
|
82
|
-
if (Time.now - last_image_change_at) > Capybara::Screenshot.stability_time_limit
|
83
|
-
clean_stabilization_images(comparison.new_file_name)
|
84
|
-
break
|
85
|
-
end
|
86
|
-
next
|
87
|
-
else
|
88
|
-
last_image_change_at = Time.now
|
89
|
-
end
|
90
|
-
|
91
|
-
assert (Time.now - screenshot_started_at) < Capybara.default_max_wait_time,
|
92
|
-
"Could not get stable screenshot within #{Capybara.default_max_wait_time}s\n" \
|
104
|
+
private def check_max_wait_time(comparison, screenshot_started_at)
|
105
|
+
assert (Time.now - screenshot_started_at) < Capybara.default_max_wait_time,
|
106
|
+
"Could not get stable screenshot within #{Capybara.default_max_wait_time}s\n" \
|
93
107
|
"#{stabilization_images(comparison.new_file_name).join("\n")}"
|
94
|
-
end
|
95
|
-
|
96
|
-
previous_file_name = "#{comparison.new_file_name.chomp('.png')}_x#{format('%02i', i)}.png~"
|
97
|
-
|
98
|
-
FileUtils.mv comparison.new_file_name, previous_file_name
|
99
|
-
end
|
100
|
-
ensure
|
101
|
-
input.click if input
|
102
108
|
end
|
103
109
|
|
104
|
-
def assert_images_loaded(timeout: Capybara.default_max_wait_time)
|
110
|
+
private def assert_images_loaded(timeout: Capybara.default_max_wait_time)
|
105
111
|
return unless respond_to? :evaluate_script
|
106
112
|
start = Time.now
|
107
113
|
loop do
|
@@ -75,20 +75,20 @@ module Capybara
|
|
75
75
|
file_name = "#{Screenshot.screenshot_area_abs}/#{name}.png"
|
76
76
|
|
77
77
|
FileUtils.mkdir_p File.dirname(file_name)
|
78
|
-
comparison = ImageCompare.new(file_name,
|
79
|
-
|
78
|
+
comparison = ImageCompare.new(file_name,
|
79
|
+
dimensions: Screenshot.window_size, color_distance_limit: color_distance_limit,
|
80
|
+
area_size_limit: area_size_limit)
|
80
81
|
checkout_vcs(name, comparison)
|
81
82
|
take_stable_screenshot(comparison, color_distance_limit: color_distance_limit,
|
82
|
-
|
83
|
+
area_size_limit: area_size_limit)
|
83
84
|
return unless comparison.old_file_exists?
|
84
85
|
(@test_screenshots ||= []) << [caller(1..1).first, name, comparison]
|
85
86
|
end
|
86
87
|
|
87
88
|
def window_size_is_wrong?
|
88
89
|
selenium? && Screenshot.window_size &&
|
89
|
-
(!page.driver.chrome? || ON_WINDOWS) && # TODO(uwe): Allow for Chrome when it works
|
90
90
|
page.driver.browser.manage.window.size !=
|
91
|
-
Selenium::WebDriver::Dimension.new(*Screenshot.window_size)
|
91
|
+
::Selenium::WebDriver::Dimension.new(*Screenshot.window_size)
|
92
92
|
end
|
93
93
|
|
94
94
|
def assert_image_not_changed(caller, name, comparison)
|
@@ -113,30 +113,3 @@ module Capybara
|
|
113
113
|
end
|
114
114
|
end
|
115
115
|
# rubocop:enable Metrics/ClassLength
|
116
|
-
|
117
|
-
module ActionDispatch
|
118
|
-
class IntegrationTest
|
119
|
-
prepend Capybara::Screenshot::Diff::TestMethods
|
120
|
-
|
121
|
-
setup do
|
122
|
-
if Capybara::Screenshot.window_size
|
123
|
-
if selenium?
|
124
|
-
# TODO(uwe): Enable for Chrome and non-windows when it works)
|
125
|
-
if !page.driver.chrome? || ON_WINDOWS
|
126
|
-
page.driver.browser.manage.window.resize_to(*Capybara::Screenshot.window_size)
|
127
|
-
end
|
128
|
-
elsif poltergeist?
|
129
|
-
page.driver.resize(*Capybara::Screenshot.window_size)
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
teardown do
|
135
|
-
if Capybara::Screenshot::Diff.enabled && @test_screenshots
|
136
|
-
test_screenshot_errors = @test_screenshots
|
137
|
-
.map { |caller, name, compare| assert_image_not_changed(caller, name, compare) }.compact
|
138
|
-
fail(test_screenshot_errors.join("\n\n")) if test_screenshot_errors.any?
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capybara-screenshot-diff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Uwe Kubosch
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09-
|
11
|
+
date: 2017-09-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|