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 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