eyes_selenium 6.12.10 → 6.12.11

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.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/eyes_selenium.gemspec +2 -5
  4. data/lib/applitools/eyes_selenium/version.rb +1 -1
  5. data/lib/applitools/selenium/browsers_info.rb +2 -0
  6. data/lib/applitools/selenium/concerns/selenium_eyes.rb +0 -33
  7. data/lib/applitools/selenium/driver.rb +1 -1
  8. data/lib/applitools/selenium/eyes.rb +1 -5
  9. data/lib/applitools/selenium/selenium_eyes.rb +15 -315
  10. data/lib/applitools/selenium/visual_grid/visual_grid_runner.rb +33 -92
  11. data/lib/eyes_selenium.rb +0 -2
  12. metadata +9 -64
  13. data/lib/applitools/selenium/css_parser/find_embedded_resources.rb +0 -102
  14. data/lib/applitools/selenium/dom_capture/dom_capture.rb +0 -172
  15. data/lib/applitools/selenium/dom_capture/dom_capture_script.rb +0 -611
  16. data/lib/applitools/selenium/external_css_resources.rb +0 -32
  17. data/lib/applitools/selenium/visual_grid/dom_snapshot_script.rb +0 -198
  18. data/lib/applitools/selenium/visual_grid/eyes_connector.rb +0 -170
  19. data/lib/applitools/selenium/visual_grid/render_info.rb +0 -24
  20. data/lib/applitools/selenium/visual_grid/render_request.rb +0 -24
  21. data/lib/applitools/selenium/visual_grid/render_requests.rb +0 -12
  22. data/lib/applitools/selenium/visual_grid/render_task.rb +0 -311
  23. data/lib/applitools/selenium/visual_grid/resource_cache.rb +0 -69
  24. data/lib/applitools/selenium/visual_grid/running_test.rb +0 -271
  25. data/lib/applitools/selenium/visual_grid/thread_pool.rb +0 -95
  26. data/lib/applitools/selenium/visual_grid/vg_match_window_data.rb +0 -187
  27. data/lib/applitools/selenium/visual_grid/vg_region.rb +0 -16
  28. data/lib/applitools/selenium/visual_grid/vg_resource.rb +0 -77
  29. data/lib/applitools/selenium/visual_grid/vg_task.rb +0 -53
  30. data/lib/applitools/selenium/visual_grid/visual_grid_eyes.rb +0 -494
  31. data/lib/applitools/selenium/visual_grid/web_element_region.rb +0 -16
@@ -1,494 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'applitools/selenium/configuration'
4
- require 'timeout'
5
- require 'securerandom'
6
-
7
- module Applitools
8
- module Selenium
9
- class VisualGridEyes
10
- # new open, with eyes-manager
11
- include Applitools::UniversalEyesOpen
12
- # all checks here
13
- include Applitools::UniversalEyesChecks
14
- # add extract_text, extract_text_regions, locate
15
- include Applitools::UniversalNewApi
16
-
17
- include Applitools::Selenium::Concerns::SeleniumEyes
18
- USE_DEFAULT_MATCH_TIMEOUT = -1
19
- extend Forwardable
20
-
21
- def_delegators 'Applitools::EyesLogger', :logger, :log_handler, :log_handler=
22
-
23
- attr_accessor :visual_grid_manager, :driver, :current_url, :current_config, :fetched_cache_map,
24
- :utils,
25
- :enable_patterns,
26
- :config, :driver_lock, :test_uuid, :dont_get_title
27
- attr_accessor :test_list
28
-
29
- attr_accessor :api_key, :server_url, :proxy, :opened
30
-
31
- attr_accessor :size_mod, :region_to_check
32
- private :size_mod, :size_mod=, :region_to_check, :region_to_check=, :test_uuid, :test_uuid=, :config, :config=
33
-
34
- def_delegators 'config', *Applitools::Selenium::Configuration.methods_to_delegate
35
- def_delegators 'config', *Applitools::EyesBaseConfiguration.methods_to_delegate
36
-
37
- alias runner visual_grid_manager
38
- attr_accessor :universal_eyes, :universal_driver
39
- attr_accessor :debug_screenshots, :save_failed_tests, :scale_ratio, :disabled, :stitching_overlap, :compare_with_parent_branch
40
-
41
- def initialize(visual_grid_manager, server_url = nil)
42
- ensure_config
43
- @server_connector = Applitools::Connectivity::ServerConnector.new(server_url)
44
- @server_connector.obtain_agent_id do
45
- full_agent_id
46
- end
47
- self.server_url = server_url if server_url
48
- self.visual_grid_manager = visual_grid_manager
49
- self.test_list = Applitools::Selenium::TestList.new
50
- self.opened = false
51
- self.test_list ||= Applitools::Selenium::TestList.new
52
- self.driver_lock = Mutex.new
53
- self.utils = Applitools::Utils::EyesSeleniumUtils
54
- end
55
-
56
- def self.environment_sdk
57
- {
58
- name: :eyes_selenium,
59
- currentVersion: Applitools::EyesSelenium::VERSION
60
- }
61
- end
62
-
63
- def ensure_config
64
- self.config = Applitools::Selenium::Configuration.new
65
- self.send_dom = true
66
- end
67
-
68
- def full_agent_id
69
- "eyes.selenium.visualgrid.ruby/#{Applitools::VERSION}"
70
- end
71
-
72
- def configure
73
- return unless block_given?
74
- yield(config)
75
- nil
76
- end
77
-
78
- def open(*args)
79
- # visual_grid_manager.add_batch(batch.id) { visual_grid_manager.close_batch(batch.id) }
80
- # self.test_uuid = SecureRandom.uuid
81
- options = Applitools::Utils.extract_options!(args)
82
- universal_open(options)
83
- # Applitools::ArgumentGuard.hash(options, 'options', [:driver])
84
- #
85
- # config.app_name = options[:app_name] if options[:app_name]
86
- # config.test_name = options[:test_name] if options[:test_name]
87
- # config.agent_run_id = "#{config.test_name}--#{SecureRandom.hex(10)}"
88
- #
89
- # if config.viewport_size.nil? || config.viewport_size && config.viewport_size.empty?
90
- # config.viewport_size = Applitools::RectangleSize.from_any_argument(options[:viewport_size]) if options[:viewport_size]
91
- # end
92
- #
93
- # self.driver = Applitools::Selenium::SeleniumEyes.eyes_driver(options.delete(:driver), self)
94
- # self.current_url = driver.current_url
95
- #
96
- # if viewport_size
97
- # set_viewport_size(viewport_size)
98
- # else
99
- # self.viewport_size = get_viewport_size
100
- # end
101
- #
102
- # visual_grid_manager.open(self)
103
- # visual_grid_manager.add_batch(batch.id) do
104
- # server_connector.close_batch(batch.id)
105
- # end
106
- #
107
- # logger.info('Getting all browsers info...')
108
- # browsers_info_list = config.browsers_info
109
- # logger.info('Creating test descriptors for each browser info...')
110
- # browsers_info_list.each(viewport_size) do |bi|
111
- # test = Applitools::Selenium::RunningTest.new(eyes_connector, bi, driver).tap do |t|
112
- # t.on_results_received do |results|
113
- # visual_grid_manager.aggregate_result(results)
114
- # end
115
- # t.test_uuid = test_uuid
116
- # end
117
- # test_list.push test
118
- # end
119
- # self.opened = true
120
- # driver
121
- end
122
-
123
- def get_viewport_size(web_driver = driver)
124
- Applitools::ArgumentGuard.not_nil 'web_driver', web_driver
125
- # self.utils.extract_viewport_size(driver)
126
- driver_config_json = universal_driver_config(web_driver)
127
-
128
- Applitools::EyesLogger.debug 'extract_viewport_size()'
129
- viewport_size = runner.universal_client.core_get_viewport_size(driver_config_json)
130
- result = Applitools::RectangleSize.new viewport_size[:width], viewport_size[:height]
131
-
132
- Applitools::EyesLogger.debug "Viewport size is #{result}."
133
- result
134
- end
135
-
136
- def eyes_connector
137
- logger.info('Creating VisualGridEyes server connector')
138
- ::Applitools::Selenium::EyesConnector.new(server_url, driver_lock: driver_lock).tap do |connector|
139
- connector.batch = batch
140
- connector.config = config.deep_clone
141
- end
142
- end
143
-
144
- def check(*args)
145
- args.compact!
146
- case (first_arg = args.shift)
147
- when String
148
- tag = first_arg
149
- target = args.shift
150
- when Applitools::Selenium::Target
151
- target = first_arg
152
- when Hash
153
- target = first_arg[:target]
154
- tag = first_arg[:name] || first_arg[:tag]
155
- end
156
-
157
- render_task = nil
158
- target.default_full_page_for_vg
159
-
160
- return universal_check(tag, target)
161
-
162
- target_to_check = target.finalize
163
- begin
164
- check_in_frame(target_frames: target_to_check.frames) do
165
- sleep wait_before_screenshots
166
- Applitools::EyesLogger.info 'Trying to get DOM snapshot...'
167
- begin
168
- dont_fetch_resources = self.dont_fetch_resources
169
- enable_cross_origin_rendering = self.enable_cross_origin_rendering
170
- use_cookies = !self.dont_use_cookies
171
- urls_to_skip = visual_grid_manager.resource_cache.urls_to_skip
172
- dom_script = Applitools::Selenium::DomSnapshotScript.new driver
173
-
174
- script_dom = dom_script.create_dom_snapshot(
175
- dont_fetch_resources,
176
- urls_to_skip,
177
- enable_cross_origin_rendering,
178
- use_cookies
179
- )
180
- rescue StandardError => e
181
- Applitools::EyesLogger.error e.class.to_s
182
- Applitools::EyesLogger.error e.message
183
- raise ::Applitools::EyesError.new 'Error while getting dom snapshot!'
184
- end
185
- Applitools::EyesLogger.info 'Done!'
186
-
187
- mod = Digest::SHA2.hexdigest(script_dom.to_s)
188
-
189
- region_x_paths = get_regions_x_paths(target_to_check)
190
-
191
- render_task = RenderTask.new(
192
- "Render #{config.short_description} - #{tag}",
193
- script_dom,
194
- visual_grid_manager,
195
- server_connector,
196
- region_x_paths,
197
- size_mod,
198
- region_to_check,
199
- target_to_check.options[:script_hooks],
200
- config.rendering_grid_force_put,
201
- self.utils.user_agent(driver),
202
- visual_grid_options.merge(target_to_check.options[:visual_grid_options]),
203
- mod
204
- )
205
- end
206
-
207
- if size_mod == 'selector' || size_mod == 'full-selector'
208
- target_to_check.convert_coordinates(&Applitools::Selenium::VgMatchWindowData::CONVERT_COORDINATES)
209
- end
210
-
211
- title = begin
212
- driver.title
213
- rescue StandardError => e
214
- logger.warn "failed (#{e.message})"
215
- ''
216
- end
217
-
218
- test_list.select { |t| t.test_uuid == test_uuid }.each do |t|
219
- t.check(tag, target_to_check, render_task, title)
220
- end
221
- test_list.each(&:becomes_not_rendered)
222
- visual_grid_manager.enqueue_render_task render_task
223
- rescue StandardError => e
224
- test_list.each(&:becomes_tested)
225
- Applitools::EyesLogger.error e.class.to_s
226
- Applitools::EyesLogger.error e.message
227
- end
228
- end
229
-
230
- def get_regions_x_paths(target)
231
- result = []
232
- collect_selenium_regions(target).each do |el, v|
233
- next unless [::Selenium::WebDriver::Element, Applitools::Selenium::Element].include?(el.class)
234
-
235
- xpath = driver.execute_script(Applitools::Selenium::Scripts::GET_ELEMENT_XPATH_JS, el)
236
- web_element_region = Applitools::Selenium::WebElementRegion.new(xpath, v)
237
- self.region_to_check = web_element_region.dup if v == :target && (size_mod == 'selector' || size_mod == 'full-selector')
238
- result << web_element_region
239
- target.regions[el] = result.size - 1
240
- end
241
- result
242
- end
243
-
244
- def collect_selenium_regions(target)
245
- selenium_regions = {}
246
- target_element = target.region_to_check
247
- setup_size_mode(target_element, target, :none)
248
- target.ignored_regions.each do |r|
249
- selenium_regions[element_or_region(r, target, :ignore)] = :ignore
250
- end
251
- target.floating_regions.each do |r|
252
- selenium_regions[element_or_region(r, target, :floating)] = :floating
253
- end
254
- target.layout_regions.each do |r|
255
- selenium_regions[element_or_region(r, target, :layout_regions)] = :layout
256
- end
257
- target.strict_regions.each do |r|
258
- selenium_regions[element_or_region(r, target, :strict_regions)] = :strict
259
- end
260
- target.content_regions.each do |r|
261
- selenium_regions[element_or_region(r, target, :content_regions)] = :content
262
- end
263
- target.accessibility_regions.each do |r|
264
- case (r = element_or_region(r, target, :accessibility_regions))
265
- when Array
266
- r.each do |rr|
267
- selenium_regions[rr] = :accessibility
268
- end
269
- else
270
- selenium_regions[r] = :accessibility
271
- end
272
- end
273
- selenium_regions[region_to_check] = :target if size_mod == 'selector' || size_mod == 'full-selector'
274
-
275
- selenium_regions
276
- end
277
-
278
- def setup_size_mode(target_element, target, key)
279
- self.size_mod = 'full-page'
280
-
281
- element_or_region = element_or_region(target_element, target, key)
282
-
283
- self.size_mod = case element_or_region
284
- when ::Selenium::WebDriver::Element, Applitools::Selenium::Element
285
- if target.options[:stitch_content]
286
- 'full-selector'
287
- else
288
- 'selector'
289
- end
290
- when Applitools::Region
291
- if element_or_region == Applitools::Region::EMPTY
292
- if target.options[:stitch_content]
293
- 'full-page'
294
- else
295
- element_or_region = Applitools::Region.from_location_size(
296
- Applitools::Location::TOP_LEFT, viewport_size
297
- )
298
- 'region'
299
- end
300
- else
301
- 'region'
302
- end
303
- else
304
- 'full-page'
305
- end
306
-
307
- self.region_to_check = element_or_region
308
- end
309
-
310
- def element_or_region(target_element, target, options_key)
311
- if target_element.respond_to?(:call)
312
- region, padding_proc = target_element.call(driver, true)
313
- case region
314
- when Array
315
- regions_to_replace = region.map { |r| Applitools::Selenium::VGRegion.new(r, padding_proc) }
316
- target.replace_region(target_element, regions_to_replace, options_key)
317
- else
318
- target.replace_region(target_element, Applitools::Selenium::VGRegion.new(region, padding_proc), options_key)
319
- end
320
- region
321
- else
322
- target_element
323
- end
324
- end
325
-
326
- def close_async
327
- # test_list.each(&:close)
328
- close(false)
329
- end
330
-
331
- def close(throw_exception = true)
332
- logger.info "close(#{throw_exception})"
333
- logger.info 'Ending server session...'
334
-
335
- raise Applitools::EyesNotOpenException.new 'Eyes not open' unless open?
336
- universal_results = universal_eyes.close # Array even for one test
337
- self.opened = false
338
- all_results = get_results(throw_exception)
339
- # universal_results = universal_eyes.eyes_get_results # Array even for one test
340
- # # require 'pry'
341
- # # binding.pry
342
- # raise Applitools::EyesError.new("Request failed: #{universal_results[:message]}") if server_error?(universal_results)
343
- # results = universal_results.map {|result| Applitools::TestResults.new(result) }
344
- # # results = results.first if results.size == 1
345
- # # session_results_url = results.url
346
- # all_results = results.compact
347
-
348
-
349
- # return false if test_list.empty?
350
- # close_async
351
- #
352
- # until (states = test_list.map(&:state_name).uniq).count == 1 && states.first == :completed
353
- # sleep 0.5
354
- # end
355
- # self.opened = false
356
- #
357
- # test_list.select { |t| t.pending_exceptions && !t.pending_exceptions.empty? }.each do |t|
358
- # t.pending_exceptions.each do |e|
359
- # raise e
360
- # end
361
- # end
362
- #
363
- # all_results = test_list.map(&:test_result).compact
364
- # failed_results = all_results.select { |r| !r.as_expected? }
365
- #
366
- # if throw_exception
367
- # all_results.each do |r|
368
- # raise Applitools::NewTestError.new new_test_error_message(r), r if r.new?
369
- # raise Applitools::DiffsFoundError.new diffs_found_error_message(r), r if r.unresolved? && !r.new?
370
- # raise Applitools::TestFailedError.new test_failed_error_message(r), r if r.failed?
371
- # end
372
- # end
373
-
374
- # failed_results.empty? ? all_results.first : failed_results.first
375
- all_results.first
376
- end
377
-
378
- def get_results(throw_exception = true)
379
- logger.info "get_results(#{throw_exception})"
380
- logger.info 'Getting results...'
381
-
382
- universal_results = universal_eyes.eyes_get_results # Array even for one test
383
- # require 'pry'
384
- # binding.pry
385
- raise Applitools::EyesError.new("Request failed: #{universal_results[:message]}") if server_error?(universal_results)
386
- results = universal_results.map {|result| Applitools::TestResults.new(result) }
387
- all_results = results.compact
388
-
389
- if throw_exception
390
- all_results.each do |r|
391
- raise Applitools::NewTestError.new new_test_error_message(r), r if r.new?
392
- raise Applitools::DiffsFoundError.new diffs_found_error_message(r), r if r.unresolved? && !r.new?
393
- raise Applitools::TestFailedError.new test_failed_error_message(r), r if r.failed?
394
- end
395
- end
396
- all_results
397
- end
398
-
399
- def abort_async
400
- test_list.each(&:abort)
401
- universal_sdk_abort
402
- end
403
-
404
- def abort_if_not_closed
405
- self.opened = false
406
- test_list.each(&:abort)
407
- universal_sdk_abort
408
- end
409
-
410
- alias abort abort_if_not_closed
411
-
412
- def open?
413
- opened
414
- end
415
-
416
- # rubocop:disable Style/AccessorMethodName
417
- def get_all_test_results
418
- test_list.map(&:test_result)
419
- end
420
- # rubocop:enable Style/AccessorMethodName
421
-
422
- # rubocop:disable Style/AccessorMethodName
423
- def set_viewport_size(value)
424
- # require('pry')
425
- # binding.pry
426
- self.utils.set_viewport_size driver, value
427
- rescue => e
428
- logger.error e.class.to_s
429
- logger.error e.message
430
- raise Applitools::TestFailedError.new "#{e.class} - #{e.message}"
431
- end
432
- # rubocop:enable Style/AccessorMethodName
433
-
434
- def new_test_error_message(result)
435
- original_results = result.original_results
436
- "New test '#{original_results['name']}' " \
437
- "of '#{original_results['appName']}' " \
438
- "Please approve the baseline at #{original_results['appUrls']['session']} "
439
- end
440
-
441
- def diffs_found_error_message(result)
442
- original_results = result.original_results
443
- "Test '#{original_results['name']}' " \
444
- "of '#{original_results['appname']}' " \
445
- "detected differences! See details at #{original_results['appUrls']['session']}"
446
- end
447
-
448
- def test_failed_error_message(result)
449
- original_results = result.original_results
450
- "Test '#{original_results['name']}' of '#{original_results['appName']}' " \
451
- "is failed! See details at #{original_results['appUrls']['session']}"
452
- end
453
-
454
- def server_connector
455
- @server_connector.server_url = config.server_url
456
- @server_connector.api_key = config.api_key
457
- @server_connector.proxy = config.proxy if config.proxy
458
- @server_connector
459
- end
460
-
461
- def configuration
462
- config.deep_dup
463
- end
464
-
465
- def configuration=(value)
466
- Applitools::ArgumentGuard.is_a?(value, :configuration, Applitools::Selenium::Configuration)
467
- self.config = value.deep_dup
468
- end
469
-
470
- alias get_configuration configuration
471
- alias set_configuration configuration=
472
-
473
- def add_mouse_trigger(_mouse_action, _element); end
474
-
475
- def add_text_trigger(_control, _text); end
476
-
477
- def disabled=(value)
478
- @disabled = Applitools::Utils.boolean_value value
479
- end
480
-
481
- def disabled?
482
- @disabled
483
- end
484
-
485
- private :new_test_error_message, :diffs_found_error_message, :test_failed_error_message
486
-
487
- private
488
-
489
- def ensure_frame_visible(*_args); end
490
-
491
- def reset_frames_scroll_position(*_args); end
492
- end
493
- end
494
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Applitools
4
- module Selenium
5
- class WebElementRegion
6
- include Applitools::Jsonable
7
- json_fields :selector, :category, :type
8
-
9
- def initialize(selector, category)
10
- self.selector = selector
11
- self.category = category
12
- self.type = 'xpath'
13
- end
14
- end
15
- end
16
- end