capybara-screenshot-diff 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|