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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88093a081f4f6f894ff270f5fd485d58a5ee72a5db793b3e81611ee7e374ab4b
4
- data.tar.gz: 775674e679494be0b7ff1b69f0cce61a30e3ee22926bec75550a070a7a6ee276
3
+ metadata.gz: d296beb9d397fda23bb4559c1bbbe0dcc62a8a517a41340048588fbdf6c911df
4
+ data.tar.gz: 5d6a5b7b4d6cdd32e9a51ebd36929bc57923f64402ec64bfea8e43d349106c8f
5
5
  SHA512:
6
- metadata.gz: 0010be372dcb9524baa55868a0a8b2a5804b9474586b79a2ac8070daab34397884327b82470cf88bb57814983ce4fb3a027f85815309589566be966eb99fec94
7
- data.tar.gz: a147aa412ffdb8309e0616536797206b587c2f7dace5c52b70628b7be199d81e26584c711266191741bb7269c61b75568f2f30b963beea545da60c06c5b6144d
6
+ metadata.gz: a3c793ece4f587ee303af163e6aba396e49f6a9021cb045e6e67281c3ff9a8f5cf41e473d87f0dd3e89c4aaf778ace87ca54bf5c7167ea0263e58e9e89b646ed
7
+ data.tar.gz: 9fef8d433b59ecbd31557be05592a7edb41d6ddec641fbc5ea63e81b52642a12c7ffe98fdd48353278a2d33dd716b8034ae8a8af0f8d9427a6ff5e5214c1d582
@@ -60,7 +60,7 @@ module Applitools
60
60
  config_keys.each do |k|
61
61
  new_config.send(
62
62
  "#{k}=", case value = self.send(k)
63
- when Symbol, FalseClass, TrueClass, Fixnum, Float
63
+ when Symbol, FalseClass, TrueClass, Integer, Float
64
64
  value
65
65
  else
66
66
  value.clone
@@ -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.first
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, :running_test, :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
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.running_test = running_test
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.rendering_info = rendering_info
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'], requests)
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
- running_render = response.first
54
- rq.render_id = running_render['renderId']
55
- need_more_dom = running_render['needMoreDom']
56
- need_more_resources = running_render['renderStatus'] == 'need-more-resources'
57
- still_running = need_more_resources || need_more_dom || fetch_fails > MAX_FAILS_COUNT
58
-
59
- dom_resource = rq.dom.resource
60
-
61
- cache_key = URI(dom_resource.url)
62
- cache_key.query = "modifier=#{dom_url_mod}" if dom_url_mod
63
-
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
- )
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
- if need_more_dom
76
- put_cache.fetch_and_store(cache_key) do |_s|
77
- server_connector.render_put_resource(
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
- end while(still_running)
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
- raise Applitools::EyesError, "Render failed for #{statuses.first['renderId']} with the message: " \
90
- "#{statuses.first['error']}" if statuses.first['status'] == 'error'
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
- rendering_info['serviceUrl'],
104
- rendering_info['accessToken'],
105
- Oj.dump(json_value([rq.render_id]))
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 = fails_count + 1
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.first.is_a?(Hash) && (statuses.first['status'] == 'error' || statuses.first['status'] == 'rendered' || iterations > MAX_ITERATIONS || false)
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
- r_info = Applitools::Selenium::RenderInfo.new.tap do |r|
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
- dom = Applitools::Selenium::RGridDom.new(
164
- url: script_data["url"], dom_nodes: script_data['cdt'], resources: request_resources
165
- )
166
-
167
- Applitools::Selenium::RenderRequest.new(
168
- webhook: rendering_info["resultsUrl"],
169
- url: script_data["url"],
170
- dom: dom,
171
- resources: request_resources,
172
- render_info: r_info,
173
- browser: {name: running_test.browser_info.browser_type, platform: running_test.browser_info.platform},
174
- script_hooks: script_hooks,
175
- selectors_to_find_regions_for: region_selectors,
176
- send_dom: running_test.eyes.config.send_dom.nil? ? false.to_s : running_test.eyes.config.send_dom.to_s
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.on_task_error do |e|
88
- self.pending_exceptions << e
89
- end.on_task_completed do
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, :watch_render, :watch_close
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 { watch_open[open_task] = true; becomes_opened if all_tasks_completed?(watch_open) }.
151
- on_task_error { |e| pending_exceptions << e; becomes_completed }
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, result, visual_grid_manager, region_selectors, size_mod, region_to_check, mod = nil)
157
- render_task = RenderTask.new(
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
- eyes.render_status_for_task(render_task.uuid, r) if r
187
- watch_render[render_task] = true
188
- becomes_rendered if all_tasks_completed?(watch_render)
189
- end.on_task_error do
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
@@ -0,0 +1,11 @@
1
+ module Applitools
2
+ module Selenium
3
+ class VGRegion
4
+ attr_accessor :region, :padding_proc
5
+ def initialize(region, padding_proc)
6
+ self.region = region
7
+ self.padding_proc = padding_proc
8
+ end
9
+ end
10
+ end
11
+ end
@@ -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 = nil
10
- @error_callback = nil
11
- @completed_callback = nil
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 = block if block_given?
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 = block if block_given?
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 = block if block_given?
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.call(res) if @callback.respond_to? :call
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.call(e) if @error_callback.respond_to? :call
41
+ @error_callback.each do |ecb|
42
+ ecb.call(e) if ecb.respond_to? :call
43
+ end
40
44
  ensure
41
- @completed_callback.call if @completed_callback.respond_to? :call
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, :config
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, result['value'].dup, visual_grid_manager, region_x_paths, size_mod, region_to_check, mod)
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, _padding_proc = target_element.call(driver, true)
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 = all_running_tests_by_score.first
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Applitools
4
- VERSION = '3.15.25'.freeze
4
+ VERSION = '3.15.26'.freeze
5
5
  end
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.25
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-06-24 00:00:00.000000000 Z
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.25
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.25
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