eyes_selenium 3.15.25 → 3.15.26
Sign up to get free protection for your applications and to get access to all the features.
- 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
|