eyes_selenium 3.15.25 → 3.15.26
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/lib/applitools/selenium/configuration.rb +1 -1
- data/lib/applitools/selenium/target.rb +19 -0
- data/lib/applitools/selenium/visual_grid/eyes_connector.rb +5 -2
- data/lib/applitools/selenium/visual_grid/render_task.rb +90 -73
- data/lib/applitools/selenium/visual_grid/running_test.rb +29 -26
- data/lib/applitools/selenium/visual_grid/vg_match_window_data.rb +17 -0
- data/lib/applitools/selenium/visual_grid/vg_region.rb +11 -0
- data/lib/applitools/selenium/visual_grid/vg_task.rb +15 -9
- data/lib/applitools/selenium/visual_grid/visual_grid_eyes.rb +37 -14
- data/lib/applitools/selenium/visual_grid/visual_grid_runner.rb +13 -2
- data/lib/applitools/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d296beb9d397fda23bb4559c1bbbe0dcc62a8a517a41340048588fbdf6c911df
|
4
|
+
data.tar.gz: 5d6a5b7b4d6cdd32e9a51ebd36929bc57923f64402ec64bfea8e43d349106c8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3c793ece4f587ee303af163e6aba396e49f6a9021cb045e6e67281c3ff9a8f5cf41e473d87f0dd3e89c4aaf778ace87ca54bf5c7167ea0263e58e9e89b646ed
|
7
|
+
data.tar.gz: 9fef8d433b59ecbd31557be05592a7edb41d6ddec641fbc5ea63e81b52642a12c7ffe98fdd48353278a2d33dd716b8034ae8a8af0f8d9427a6ff5e5214c1d582
|
@@ -209,6 +209,25 @@ module Applitools
|
|
209
209
|
end
|
210
210
|
end
|
211
211
|
|
212
|
+
def replace_region(original_region, new_region, key)
|
213
|
+
case key
|
214
|
+
when :content_regions
|
215
|
+
replace_element(original_region, new_region, content_regions)
|
216
|
+
when :strict_regions
|
217
|
+
replace_element(original_region, new_region, strict_regions)
|
218
|
+
when :layout_regions
|
219
|
+
replace_element(original_region, new_region, layout_regions)
|
220
|
+
when :floating
|
221
|
+
replace_element(original_region, new_region, floating_regions)
|
222
|
+
when :ignore
|
223
|
+
replace_element(original_region, new_region, ignored_regions)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def replace_element(original, new, array)
|
228
|
+
array[array.index(original)] = new
|
229
|
+
end
|
230
|
+
|
212
231
|
def match_level(*args)
|
213
232
|
match_level = args.shift
|
214
233
|
exact_options = args.shift || {}
|
@@ -4,7 +4,7 @@ module Applitools
|
|
4
4
|
USE_DEFAULT_MATCH_TIMEOUT = -1
|
5
5
|
|
6
6
|
attr_accessor :browser_info, :test_result, :driver, :dummy_region_provider, :dont_get_title,
|
7
|
-
:current_uuid, :render_statuses, :device_name
|
7
|
+
:current_uuid, :render_statuses, :device_name, :driver_lock
|
8
8
|
public :server_connector
|
9
9
|
|
10
10
|
class RegionProvider
|
@@ -14,10 +14,12 @@ module Applitools
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def initialize(*args)
|
17
|
+
options = Applitools::Utils.extract_options!(args)
|
17
18
|
super
|
18
19
|
self.render_statuses = {}
|
19
20
|
self.dummy_region_provider = RegionProvider.new
|
20
21
|
self.dont_get_title = false
|
22
|
+
self.driver_lock = options[:driver_lock]
|
21
23
|
end
|
22
24
|
|
23
25
|
def ensure_config
|
@@ -44,6 +46,7 @@ module Applitools
|
|
44
46
|
match_data.tag = name
|
45
47
|
update_default_settings(match_data)
|
46
48
|
match_data.read_target(target_to_check, driver, selector_regions)
|
49
|
+
|
47
50
|
check_result = check_window_base(
|
48
51
|
dummy_region_provider, timeout, match_data
|
49
52
|
)
|
@@ -65,7 +68,7 @@ module Applitools
|
|
65
68
|
end
|
66
69
|
|
67
70
|
def render_status_for_task(uuid, status)
|
68
|
-
render_statuses[uuid] = status
|
71
|
+
render_statuses[uuid] = status
|
69
72
|
end
|
70
73
|
|
71
74
|
def render_status
|
@@ -8,86 +8,91 @@ module Applitools
|
|
8
8
|
MAX_FAILS_COUNT = 5
|
9
9
|
MAX_ITERATIONS = 100
|
10
10
|
|
11
|
-
attr_accessor :script, :
|
12
|
-
|
13
|
-
|
11
|
+
attr_accessor :script, :running_tests, :all_blobs, :resource_urls, :resource_cache, :put_cache, :server_connector,
|
12
|
+
:rendering_info, :request_resources, :dom_url_mod, :result, :region_selectors, :size_mode,
|
13
|
+
:region_to_check, :script_hooks, :visual_grid_manager
|
14
|
+
|
15
|
+
def initialize(name, script_result, visual_grid_manager, server_connector, region_selectors, size_mode,
|
16
|
+
region, script_hooks, mod = nil)
|
14
17
|
|
15
|
-
def initialize(name, script_result, running_test, resource_cache, put_cache, rendering_info, server_connector, region_selectors, size_mode, region, script_hooks, mod = nil)
|
16
18
|
self.result = nil
|
17
19
|
self.script = script_result
|
18
|
-
self.
|
19
|
-
self.resource_cache = resource_cache
|
20
|
-
self.put_cache = put_cache
|
20
|
+
self.visual_grid_manager = visual_grid_manager
|
21
21
|
self.server_connector = server_connector
|
22
|
-
self.
|
22
|
+
self.resource_cache = visual_grid_manager.resource_cache
|
23
|
+
self.put_cache = visual_grid_manager.put_cache
|
24
|
+
self.rendering_info = visual_grid_manager.rendering_info(server_connector)
|
23
25
|
self.region_selectors = region_selectors
|
24
26
|
self.size_mode = size_mode
|
25
27
|
self.region_to_check = region
|
26
28
|
self.script_hooks = script_hooks if script_hooks.is_a?(Hash)
|
27
29
|
|
28
30
|
self.dom_url_mod = mod
|
31
|
+
self.running_tests = []
|
29
32
|
super(name) do
|
30
33
|
perform
|
31
34
|
end
|
32
35
|
end
|
33
36
|
|
34
37
|
def perform
|
35
|
-
requests = Applitools::Selenium::RenderRequests.new
|
36
38
|
rq = prepare_data_for_rg(script_data)
|
37
|
-
requests << rq
|
38
39
|
fetch_fails = 0
|
39
|
-
# still_running = false
|
40
|
-
# need_more_dom = false
|
41
40
|
begin
|
42
41
|
response = nil
|
43
42
|
begin
|
44
|
-
response = server_connector.render(rendering_info['serviceUrl'], rendering_info['accessToken'],
|
45
|
-
# rescue StandardError => _e
|
46
|
-
# response = server_connector.render(rendering_info['serviceUrl'], rendering_info['accessToken'], requests)
|
43
|
+
response = server_connector.render(rendering_info['serviceUrl'], rendering_info['accessToken'], rq)
|
47
44
|
rescue StandardError => e
|
48
45
|
Applitools::EyesLogger.error(e.message)
|
49
46
|
fetch_fails += 1
|
50
47
|
sleep 2
|
51
48
|
end
|
52
49
|
next unless response
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
50
|
+
need_more_dom = false
|
51
|
+
need_more_resources = false
|
52
|
+
|
53
|
+
response.each_with_index do |running_render, index|
|
54
|
+
rq[index].render_id = running_render['renderId']
|
55
|
+
need_more_dom = running_render['needMoreDom']
|
56
|
+
need_more_resources = running_render['renderStatus'] == 'need-more-resources'
|
57
|
+
|
58
|
+
dom_resource = rq[index].dom.resource
|
59
|
+
|
60
|
+
cache_key = URI(dom_resource.url)
|
61
|
+
cache_key.query = "modifier=#{dom_url_mod}" if dom_url_mod
|
62
|
+
|
63
|
+
if need_more_resources
|
64
|
+
running_render['needMoreResources'].each do |resource_url|
|
65
|
+
put_cache.fetch_and_store(URI(resource_url)) do |_s|
|
66
|
+
server_connector.render_put_resource(
|
67
|
+
rendering_info['serviceUrl'],
|
68
|
+
rendering_info['accessToken'],
|
69
|
+
request_resources[URI(resource_url)],
|
70
|
+
running_render
|
71
|
+
)
|
72
|
+
end
|
73
|
+
end
|
72
74
|
end
|
73
|
-
end if need_more_resources
|
74
75
|
|
75
|
-
|
76
|
-
|
77
|
-
|
76
|
+
if need_more_dom
|
77
|
+
put_cache.fetch_and_store(cache_key) do |_s|
|
78
|
+
server_connector.render_put_resource(
|
78
79
|
rendering_info['serviceUrl'],
|
79
80
|
rendering_info['accessToken'],
|
80
81
|
dom_resource,
|
81
82
|
running_render
|
82
|
-
|
83
|
+
)
|
84
|
+
end
|
85
|
+
put_cache[cache_key]
|
83
86
|
end
|
84
|
-
put_cache[cache_key]
|
85
87
|
end
|
86
88
|
|
87
|
-
|
89
|
+
still_running = need_more_resources || need_more_dom || fetch_fails > MAX_FAILS_COUNT
|
90
|
+
end while still_running
|
88
91
|
statuses = poll_render_status(rq)
|
89
|
-
|
90
|
-
"#{statuses.first['
|
92
|
+
if statuses.first['status'] == 'error'
|
93
|
+
raise Applitools::EyesError, "Render failed for #{statuses.first['renderId']} with the message: " \
|
94
|
+
"#{statuses.first['error']}"
|
95
|
+
end
|
91
96
|
self.result = statuses.first
|
92
97
|
statuses
|
93
98
|
end
|
@@ -95,14 +100,13 @@ module Applitools
|
|
95
100
|
def poll_render_status(rq)
|
96
101
|
iterations = 0
|
97
102
|
statuses = []
|
98
|
-
raise Applitools::EyesError, 'RenderStatus: Got empty renderId!' unless rq.render_id.is_a?(String) && !rq.render_id.empty?
|
99
103
|
begin
|
100
104
|
fails_count = 0
|
101
105
|
proc = proc do
|
102
106
|
server_connector.render_status_by_id(
|
103
|
-
|
104
|
-
|
105
|
-
|
107
|
+
rendering_info['serviceUrl'],
|
108
|
+
rendering_info['accessToken'],
|
109
|
+
Oj.dump(json_value(rq.map(&:render_id)))
|
106
110
|
)
|
107
111
|
end
|
108
112
|
begin
|
@@ -110,12 +114,12 @@ module Applitools
|
|
110
114
|
fails_count = 0
|
111
115
|
rescue StandardError => _e
|
112
116
|
sleep 1
|
113
|
-
fails_count
|
117
|
+
fails_count += 1
|
114
118
|
ensure
|
115
|
-
iterations+=1
|
119
|
+
iterations += 1
|
116
120
|
sleep 0.5
|
117
121
|
end while(fails_count > 0 and fails_count < 3)
|
118
|
-
finished = statuses.
|
122
|
+
finished = !statuses.map { |s| s['status'] }.uniq.include?('rendering') || iterations > MAX_ITERATIONS
|
119
123
|
end while(!finished)
|
120
124
|
statuses
|
121
125
|
end
|
@@ -130,9 +134,10 @@ module Applitools
|
|
130
134
|
self.resource_urls = data["resourceUrls"]
|
131
135
|
self.request_resources = Applitools::Selenium::RenderResources.new
|
132
136
|
|
133
|
-
all_blobs.map {|blob| Applitools::Selenium::VGResource.parse_blob_from_script(blob)}.each do |blob|
|
137
|
+
all_blobs.map { |blob| Applitools::Selenium::VGResource.parse_blob_from_script(blob)}.each do |blob|
|
134
138
|
request_resources[blob.url] = blob
|
135
139
|
end
|
140
|
+
|
136
141
|
resource_urls.each do |url|
|
137
142
|
resource_cache.fetch_and_store(URI(url)) do |s|
|
138
143
|
resp_proc = proc { |u| server_connector.download_resource(u) }
|
@@ -152,31 +157,43 @@ module Applitools
|
|
152
157
|
request_resources[key] = resource_cache[key]
|
153
158
|
end
|
154
159
|
|
155
|
-
|
156
|
-
r.width = running_test.browser_info.viewport_size.width
|
157
|
-
r.height = running_test.browser_info.viewport_size.height
|
158
|
-
r.size_mode = size_mode
|
159
|
-
r.region = region_to_check
|
160
|
-
r.emulation_info = running_test.browser_info.emulation_info if running_test.browser_info.emulation_info
|
161
|
-
end
|
160
|
+
requests = Applitools::Selenium::RenderRequests.new
|
162
161
|
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
162
|
+
running_tests.each do |running_test|
|
163
|
+
r_info = Applitools::Selenium::RenderInfo.new.tap do |r|
|
164
|
+
r.width = running_test.browser_info.viewport_size.width
|
165
|
+
r.height = running_test.browser_info.viewport_size.height
|
166
|
+
r.size_mode = size_mode
|
167
|
+
r.region = region_to_check
|
168
|
+
r.emulation_info = running_test.browser_info.emulation_info if running_test.browser_info.emulation_info
|
169
|
+
end
|
170
|
+
|
171
|
+
dom = Applitools::Selenium::RGridDom.new(
|
172
|
+
url: script_data["url"], dom_nodes: script_data['cdt'], resources: request_resources
|
173
|
+
)
|
174
|
+
|
175
|
+
requests << Applitools::Selenium::RenderRequest.new(
|
176
|
+
webhook: rendering_info["resultsUrl"],
|
177
|
+
url: script_data["url"],
|
178
|
+
dom: dom,
|
179
|
+
resources: request_resources,
|
180
|
+
render_info: r_info,
|
181
|
+
browser: {name: running_test.browser_info.browser_type, platform: running_test.browser_info.platform},
|
182
|
+
script_hooks: script_hooks,
|
183
|
+
selectors_to_find_regions_for: region_selectors,
|
184
|
+
send_dom: running_test.eyes.config.send_dom.nil? ? false.to_s : running_test.eyes.config.send_dom.to_s
|
185
|
+
)
|
186
|
+
end
|
187
|
+
requests
|
178
188
|
end
|
179
189
|
|
190
|
+
def add_running_test(running_test)
|
191
|
+
if running_tests.include?(running_test)
|
192
|
+
raise Applitools::EyesError, "The running test #{running_test} already exists in the render task"
|
193
|
+
end
|
194
|
+
running_tests << running_test
|
195
|
+
running_tests.length - 1
|
196
|
+
end
|
180
197
|
end
|
181
198
|
end
|
182
199
|
end
|
@@ -84,9 +84,11 @@ module Applitools
|
|
84
84
|
end
|
85
85
|
close_task.on_task_succeeded do |task_result|
|
86
86
|
self.test_result = task_result
|
87
|
-
end
|
88
|
-
|
89
|
-
|
87
|
+
end
|
88
|
+
close_task.on_task_error do |e|
|
89
|
+
pending_exceptions << e
|
90
|
+
end
|
91
|
+
close_task.on_task_completed do
|
90
92
|
watch_close[close_task] = true
|
91
93
|
becomes_completed if all_tasks_completed?(watch_close)
|
92
94
|
end
|
@@ -116,7 +118,8 @@ module Applitools
|
|
116
118
|
end
|
117
119
|
end
|
118
120
|
|
119
|
-
attr_accessor :open_queue, :task_queue, :render_queue, :close_queue, :watch_open, :watch_task,
|
121
|
+
attr_accessor :open_queue, :task_queue, :render_queue, :close_queue, :watch_open, :watch_task,
|
122
|
+
:watch_render, :watch_close
|
120
123
|
|
121
124
|
attr_accessor :eyes, :browser_info, :test_result, :pending_exceptions, :driver, :task_lock
|
122
125
|
|
@@ -147,27 +150,22 @@ module Applitools
|
|
147
150
|
def init
|
148
151
|
open_task = Applitools::Selenium::VGTask.new("open #{browser_info}") { eyes.open(driver, browser_info) }
|
149
152
|
|
150
|
-
open_task.on_task_succeeded
|
151
|
-
|
153
|
+
open_task.on_task_succeeded do
|
154
|
+
watch_open[open_task] = true
|
155
|
+
becomes_opened if all_tasks_completed?(watch_open)
|
156
|
+
end
|
157
|
+
|
158
|
+
open_task.on_task_error do |e|
|
159
|
+
pending_exceptions << e
|
160
|
+
becomes_completed
|
161
|
+
end
|
162
|
+
|
152
163
|
open_queue << open_task
|
153
164
|
watch_open[open_task] = false
|
154
165
|
end
|
155
166
|
|
156
|
-
def check(tag, target,
|
157
|
-
|
158
|
-
"Render #{eyes.config.short_description} - #{tag}",
|
159
|
-
result,
|
160
|
-
self,
|
161
|
-
visual_grid_manager.resource_cache,
|
162
|
-
visual_grid_manager.put_cache,
|
163
|
-
visual_grid_manager.rendering_info(eyes.server_connector),
|
164
|
-
eyes.server_connector,
|
165
|
-
region_selectors,
|
166
|
-
size_mod,
|
167
|
-
region_to_check,
|
168
|
-
target.options[:script_hooks],
|
169
|
-
mod
|
170
|
-
)
|
167
|
+
def check(tag, target, render_task)
|
168
|
+
result_index = render_task.add_running_test(self)
|
171
169
|
|
172
170
|
check_task = VGTask.new("perform check #{tag} #{target}") do
|
173
171
|
eyes.check(tag, target, render_task.uuid)
|
@@ -183,13 +181,18 @@ module Applitools
|
|
183
181
|
watch_task[check_task] = false
|
184
182
|
|
185
183
|
render_task.on_task_succeeded do |r|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
184
|
+
if r[result_index] && r[result_index]['status'] == 'rendered'
|
185
|
+
eyes.render_status_for_task(render_task.uuid, r[result_index])
|
186
|
+
watch_render[render_task] = true
|
187
|
+
becomes_rendered if all_tasks_completed?(watch_render)
|
188
|
+
else
|
189
|
+
logger.error "Wrong render status! Render returned status #{r[result_index]['status']}"
|
190
|
+
becomes_completed
|
191
|
+
end
|
192
|
+
end
|
193
|
+
render_task.on_task_error do
|
190
194
|
becomes_completed
|
191
195
|
end
|
192
|
-
render_queue << render_task
|
193
196
|
watch_render[render_task] = false
|
194
197
|
end
|
195
198
|
|
@@ -22,6 +22,10 @@ module Applitools
|
|
22
22
|
@ignored_regions << padding_proc.call(retrieved_region) if padding_proc.is_a? Proc
|
23
23
|
when Applitools::Region
|
24
24
|
@ignored_regions << r
|
25
|
+
when Applitools::Selenium::VGRegion
|
26
|
+
region = selector_regions[target.regions[r.region]]
|
27
|
+
retrieved_region = Applitools::Region.new(region['x'], region['y'], region['width'], region['height'])
|
28
|
+
@ignored_regions << r.padding_proc.call(retrieved_region)
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
@@ -57,6 +61,15 @@ module Applitools
|
|
57
61
|
when Applitools::FloatingRegion
|
58
62
|
@floating_regions << r
|
59
63
|
@need_convert_floating_regions_coordinates = true
|
64
|
+
when Applitools::Selenium::VGRegion
|
65
|
+
region = r.region
|
66
|
+
region = selector_regions[target.regions[region]]
|
67
|
+
retrieved_region = Applitools::Region.new(region['x'], region['y'], region['width'], region['height'])
|
68
|
+
floating_region = r.padding_proc.call(retrieved_region) if r.padding_proc.is_a? Proc
|
69
|
+
raise Applitools::EyesError.new "Wrong floating region: #{region.class}" unless
|
70
|
+
floating_region.is_a? Applitools::FloatingRegion
|
71
|
+
@floating_regions << floating_region
|
72
|
+
@need_convert_floating_regions_coordinates = true
|
60
73
|
end
|
61
74
|
end
|
62
75
|
end
|
@@ -71,6 +84,10 @@ module Applitools
|
|
71
84
|
result << Applitools::Region.new(region['x'], region['y'], region['width'], region['height'])
|
72
85
|
when Applitools::Region
|
73
86
|
result << r
|
87
|
+
when Applitools::Selenium::VGRegion
|
88
|
+
region = r.region
|
89
|
+
region = selector_regions[target.regions[region]]
|
90
|
+
result << Applitools::Region.new(region['x'], region['y'], region['width'], region['height'])
|
74
91
|
end
|
75
92
|
end
|
76
93
|
result
|
@@ -6,24 +6,24 @@ module Applitools
|
|
6
6
|
def initialize(name, &block)
|
7
7
|
self.name = name
|
8
8
|
@block_to_run = block if block_given?
|
9
|
-
@callback =
|
10
|
-
@error_callback =
|
11
|
-
@completed_callback =
|
9
|
+
@callback = []
|
10
|
+
@error_callback = []
|
11
|
+
@completed_callback = []
|
12
12
|
self.uuid = SecureRandom.uuid
|
13
13
|
end
|
14
14
|
|
15
15
|
def on_task_succeeded(&block)
|
16
|
-
@callback
|
16
|
+
@callback.push block if block_given?
|
17
17
|
self
|
18
18
|
end
|
19
19
|
|
20
20
|
def on_task_error(&block)
|
21
|
-
@error_callback
|
21
|
+
@error_callback.push block if block_given?
|
22
22
|
self
|
23
23
|
end
|
24
24
|
|
25
25
|
def on_task_completed(&block)
|
26
|
-
@completed_callback
|
26
|
+
@completed_callback.push block if block_given?
|
27
27
|
self
|
28
28
|
end
|
29
29
|
|
@@ -31,14 +31,20 @@ module Applitools
|
|
31
31
|
return unless @block_to_run.respond_to? :call
|
32
32
|
begin
|
33
33
|
res = @block_to_run.call
|
34
|
-
@callback.
|
34
|
+
@callback.each do |cb|
|
35
|
+
cb.call(res) if cb.respond_to? :call
|
36
|
+
end
|
35
37
|
rescue StandardError => e
|
36
38
|
Applitools::EyesLogger.logger.error 'Failed to execute task!'
|
37
39
|
Applitools::EyesLogger.logger.error e.message
|
38
40
|
Applitools::EyesLogger.logger.error e.backtrace.join('\n\t')
|
39
|
-
@error_callback.
|
41
|
+
@error_callback.each do |ecb|
|
42
|
+
ecb.call(e) if ecb.respond_to? :call
|
43
|
+
end
|
40
44
|
ensure
|
41
|
-
@completed_callback.
|
45
|
+
@completed_callback.each do |ccb|
|
46
|
+
ccb.call if ccb.respond_to? :call
|
47
|
+
end
|
42
48
|
end
|
43
49
|
end
|
44
50
|
end
|
@@ -8,7 +8,8 @@ module Applitools
|
|
8
8
|
|
9
9
|
def_delegators 'Applitools::EyesLogger', :logger, :log_handler, :log_handler=
|
10
10
|
|
11
|
-
attr_accessor :visual_grid_manager, :driver, :current_url, :current_config, :fetched_cache_map,
|
11
|
+
attr_accessor :visual_grid_manager, :driver, :current_url, :current_config, :fetched_cache_map,
|
12
|
+
:config, :driver_lock
|
12
13
|
attr_accessor :test_list
|
13
14
|
|
14
15
|
attr_accessor :api_key, :server_url, :proxy, :opened
|
@@ -21,10 +22,12 @@ module Applitools
|
|
21
22
|
|
22
23
|
def initialize(visual_grid_manager, server_url = nil)
|
23
24
|
ensure_config
|
25
|
+
@server_connector = Applitools::Connectivity::ServerConnector.new(server_url)
|
24
26
|
self.server_url = server_url if server_url
|
25
27
|
self.visual_grid_manager = visual_grid_manager
|
26
28
|
self.test_list = Applitools::Selenium::TestList.new
|
27
29
|
self.opened = false
|
30
|
+
self.driver_lock = Mutex.new
|
28
31
|
end
|
29
32
|
|
30
33
|
def ensure_config
|
@@ -73,7 +76,7 @@ module Applitools
|
|
73
76
|
|
74
77
|
def eyes_connector
|
75
78
|
logger.info("creating VisualGridEyes server connector")
|
76
|
-
::Applitools::Selenium::EyesConnector.new(server_url).tap do |connector|
|
79
|
+
::Applitools::Selenium::EyesConnector.new(server_url, driver_lock: driver_lock).tap do |connector|
|
77
80
|
connector.batch = batch
|
78
81
|
connector.config = config.deep_clone
|
79
82
|
end
|
@@ -106,11 +109,22 @@ module Applitools
|
|
106
109
|
mod = Digest::SHA2.hexdigest(script_result)
|
107
110
|
|
108
111
|
region_x_paths = get_regions_x_paths(target)
|
109
|
-
|
112
|
+
render_task = RenderTask.new(
|
113
|
+
"Render #{config.short_description} - #{tag}",
|
114
|
+
result["value"],
|
115
|
+
visual_grid_manager,
|
116
|
+
server_connector,
|
117
|
+
region_x_paths,
|
118
|
+
size_mod,
|
119
|
+
region_to_check,
|
120
|
+
target.options[:script_hooks],
|
121
|
+
mod
|
122
|
+
)
|
110
123
|
test_list.each do |t|
|
111
|
-
t.check(tag, target,
|
124
|
+
t.check(tag, target, render_task)
|
112
125
|
end
|
113
126
|
test_list.each { |t| t.becomes_not_rendered }
|
127
|
+
visual_grid_manager.enqueue_render_task render_task
|
114
128
|
rescue StandardError => e
|
115
129
|
Applitools::EyesLogger.error e.message
|
116
130
|
test_list.each { |t| t.becomes_tested }
|
@@ -134,31 +148,31 @@ module Applitools
|
|
134
148
|
def collect_selenium_regions(target)
|
135
149
|
selenium_regions = {}
|
136
150
|
target_element = target.region_to_check
|
137
|
-
setup_size_mode(target_element)
|
151
|
+
setup_size_mode(target_element, target, :none)
|
138
152
|
target.ignored_regions.each do |r|
|
139
|
-
selenium_regions[element_or_region(r)] = :ignore
|
153
|
+
selenium_regions[element_or_region(r, target, :ignore)] = :ignore
|
140
154
|
end
|
141
155
|
target.floating_regions.each do |r|
|
142
|
-
selenium_regions[element_or_region(r)] = :floating
|
156
|
+
selenium_regions[element_or_region(r, target, :floating)] = :floating
|
143
157
|
end
|
144
158
|
target.layout_regions.each do |r|
|
145
|
-
selenium_regions[element_or_region(r)] = :layout
|
159
|
+
selenium_regions[element_or_region(r, target, :layout_regions)] = :layout
|
146
160
|
end
|
147
161
|
target.strict_regions.each do |r|
|
148
|
-
selenium_regions[element_or_region(r)] = :strict
|
162
|
+
selenium_regions[element_or_region(r, target, :strict_regions)] = :strict
|
149
163
|
end
|
150
164
|
target.content_regions.each do |r|
|
151
|
-
selenium_regions[element_or_region(r)] = :content
|
165
|
+
selenium_regions[element_or_region(r, target, :content_regions)] = :content
|
152
166
|
end
|
153
167
|
selenium_regions[region_to_check] = :target if size_mod == 'selector'
|
154
168
|
|
155
169
|
selenium_regions
|
156
170
|
end
|
157
171
|
|
158
|
-
def setup_size_mode(target_element)
|
172
|
+
def setup_size_mode(target_element, target, key)
|
159
173
|
self.size_mod = 'full-page'
|
160
174
|
|
161
|
-
element_or_region = element_or_region(target_element)
|
175
|
+
element_or_region = element_or_region(target_element, target, key)
|
162
176
|
|
163
177
|
case element_or_region
|
164
178
|
when ::Selenium::WebDriver::Element, Applitools::Selenium::Element
|
@@ -172,9 +186,10 @@ module Applitools
|
|
172
186
|
self.region_to_check = element_or_region
|
173
187
|
end
|
174
188
|
|
175
|
-
def element_or_region(target_element)
|
189
|
+
def element_or_region(target_element, target, options_key)
|
176
190
|
if target_element.respond_to?(:call)
|
177
|
-
region,
|
191
|
+
region, padding_proc = target_element.call(driver, true)
|
192
|
+
target.replace_region(target_element, Applitools::Selenium::VGRegion.new(region, padding_proc), options_key)
|
178
193
|
region
|
179
194
|
else
|
180
195
|
target_element
|
@@ -248,6 +263,14 @@ module Applitools
|
|
248
263
|
"Test '#{original_results['name']}' of '#{original_results['appName']}' " \
|
249
264
|
"is failed! See details at #{original_results['appUrls']['session']}"
|
250
265
|
end
|
266
|
+
|
267
|
+
def server_connector
|
268
|
+
@server_connector.server_url = config.server_url
|
269
|
+
@server_connector.api_key = config.api_key
|
270
|
+
@server_connector.proxy = config.proxy if config.proxy
|
271
|
+
@server_connector
|
272
|
+
end
|
273
|
+
|
251
274
|
private :new_test_error_message, :diffs_found_error_message, :test_failed_error_message
|
252
275
|
|
253
276
|
# Takes a snapshot of the application under test and matches it with the expected output.
|
@@ -2,10 +2,13 @@ module Applitools
|
|
2
2
|
module Selenium
|
3
3
|
class VisualGridRunner
|
4
4
|
EMPTY_QUEUE = []
|
5
|
-
attr_accessor :all_eyes, :resource_cache, :put_cache, :rendering_info
|
5
|
+
attr_accessor :all_eyes, :resource_cache, :put_cache, :rendering_info, :render_queue
|
6
|
+
|
7
|
+
alias queue render_queue
|
6
8
|
|
7
9
|
def initialize(concurrent_open_sessions = 10)
|
8
10
|
self.all_eyes = []
|
11
|
+
self.render_queue = []
|
9
12
|
@thread_pool = Applitools::Selenium::VGThreadPool.new(concurrent_open_sessions)
|
10
13
|
self.resource_cache = Applitools::Selenium::ResourceCache.new
|
11
14
|
self.put_cache = Applitools::Selenium::ResourceCache.new
|
@@ -23,6 +26,10 @@ module Applitools
|
|
23
26
|
all_eyes << eyes
|
24
27
|
end
|
25
28
|
|
29
|
+
def enqueue_render_task(render_task)
|
30
|
+
render_queue.push render_task if render_task.is_a? Applitools::Selenium::RenderTask
|
31
|
+
end
|
32
|
+
|
26
33
|
def stop
|
27
34
|
while all_running_tests.map(&:score).reduce(0, :+) > 0 do
|
28
35
|
sleep 0.5
|
@@ -52,7 +59,11 @@ module Applitools
|
|
52
59
|
end
|
53
60
|
|
54
61
|
def get_task_queue
|
55
|
-
test_to_run =
|
62
|
+
test_to_run = if render_queue.empty?
|
63
|
+
all_running_tests_by_score.first
|
64
|
+
else
|
65
|
+
self
|
66
|
+
end
|
56
67
|
test_to_run ? test_to_run.queue : EMPTY_QUEUE
|
57
68
|
end
|
58
69
|
end
|
data/lib/applitools/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eyes_selenium
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.15.
|
4
|
+
version: 3.15.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Applitools Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: eyes_core
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.15.
|
19
|
+
version: 3.15.26
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.15.
|
26
|
+
version: 3.15.26
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: selenium-webdriver
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,6 +131,7 @@ files:
|
|
131
131
|
- lib/applitools/selenium/visual_grid/running_test.rb
|
132
132
|
- lib/applitools/selenium/visual_grid/thread_pool.rb
|
133
133
|
- lib/applitools/selenium/visual_grid/vg_match_window_data.rb
|
134
|
+
- lib/applitools/selenium/visual_grid/vg_region.rb
|
134
135
|
- lib/applitools/selenium/visual_grid/vg_resource.rb
|
135
136
|
- lib/applitools/selenium/visual_grid/vg_task.rb
|
136
137
|
- lib/applitools/selenium/visual_grid/visual_grid_eyes.rb
|