eyes_core 3.18.4 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/lib/applitools/appium/eyes.rb +1 -0
  3. data/lib/applitools/appium/target.rb +218 -193
  4. data/lib/applitools/connectivity/proxy.rb +11 -3
  5. data/lib/applitools/connectivity/server_connector.rb +2 -1
  6. data/lib/applitools/core/accessibility_level.rb +11 -0
  7. data/lib/applitools/core/batch_info.rb +24 -2
  8. data/lib/applitools/core/classic_runner.rb +8 -1
  9. data/lib/applitools/core/eyes_base.rb +80 -28
  10. data/lib/applitools/core/eyes_base_configuration.rb +22 -1
  11. data/lib/applitools/core/eyes_runner.rb +12 -0
  12. data/lib/applitools/core/floating_region.rb +17 -8
  13. data/lib/applitools/core/image_match_settings.rb +54 -0
  14. data/lib/applitools/core/match_level.rb +3 -1
  15. data/lib/applitools/core/test_results.rb +2 -2
  16. data/lib/applitools/core/universal_eyes_checks.rb +66 -0
  17. data/lib/applitools/core/universal_eyes_open.rb +100 -0
  18. data/lib/applitools/core/universal_new_api.rb +43 -0
  19. data/lib/applitools/universal_sdk/universal_check_settings.rb +184 -0
  20. data/lib/applitools/universal_sdk/universal_client.rb +142 -0
  21. data/lib/applitools/universal_sdk/universal_client_socket.rb +110 -0
  22. data/lib/applitools/universal_sdk/universal_eyes.rb +45 -0
  23. data/lib/applitools/universal_sdk/universal_eyes_config.rb +203 -0
  24. data/lib/applitools/universal_sdk/universal_eyes_manager.rb +40 -0
  25. data/lib/applitools/universal_sdk/universal_eyes_manager_config.rb +62 -0
  26. data/lib/applitools/universal_sdk/universal_server.rb +81 -0
  27. data/lib/applitools/utils/utils.rb +13 -0
  28. data/lib/applitools/version.rb +2 -1
  29. data/lib/eyes_core.rb +3 -0
  30. metadata +69 -2
@@ -6,6 +6,11 @@ require 'applitools/core/eyes_base_configuration'
6
6
  require 'applitools/core/match_level'
7
7
  require 'zlib'
8
8
 
9
+ require_relative 'universal_eyes_open'
10
+ require_relative 'universal_eyes_checks'
11
+ require_relative 'universal_new_api'
12
+ require_relative '../universal_sdk/universal_client'
13
+
9
14
  require_relative 'match_level_setter'
10
15
 
11
16
  module Applitools
@@ -19,6 +24,13 @@ module Applitools
19
24
  }.freeze
20
25
 
21
26
  class EyesBase
27
+ # new open, with eyes-manager
28
+ include Applitools::UniversalEyesOpen
29
+ # all checks here
30
+ include Applitools::UniversalEyesChecks
31
+ # add extract_text, extract_text_regions, locate
32
+ include Applitools::UniversalNewApi
33
+
22
34
  include Applitools::MatchLevelSetter
23
35
  extend Forwardable
24
36
  extend Applitools::Helpers
@@ -28,6 +40,25 @@ module Applitools
28
40
  SCREENSHOT_AS_IS = Applitools::EyesScreenshot::COORDINATE_TYPES[:screenshot_as_is].freeze
29
41
  CONTEXT_RELATIVE = Applitools::EyesScreenshot::COORDINATE_TYPES[:context_relative].freeze
30
42
 
43
+ class << self
44
+ def set_viewport_size(driver, viewport_size)
45
+ Applitools::ArgumentGuard.not_nil(driver, 'Driver')
46
+ Applitools::ArgumentGuard.not_nil(viewport_size, 'viewport_size')
47
+ Applitools::ArgumentGuard.is_a?(viewport_size, 'viewport_size', Applitools::RectangleSize)
48
+ Applitools::EyesLogger.info "Set viewport size #{viewport_size}"
49
+ begin
50
+ driver_config_json = driver.universal_driver_config
51
+ required_size = Applitools::RectangleSize.from_any_argument viewport_size
52
+ @universal_client = Applitools::Connectivity::UniversalClient.new
53
+ @universal_client.core_set_viewport_size(driver_config_json, required_size.to_hash)
54
+ rescue => e
55
+ Applitools::EyesLogger.error e.class
56
+ Applitools::EyesLogger.error e.message
57
+ raise Applitools::EyesError.new 'Failed to set viewport size!'
58
+ end
59
+ end
60
+ end
61
+
31
62
  attr_accessor :config
32
63
  private :config, :config=
33
64
 
@@ -60,6 +91,9 @@ module Applitools
60
91
 
61
92
  def_delegators 'config', *Applitools::EyesBaseConfiguration.methods_to_delegate
62
93
 
94
+ # attr_accessor :universal_client, :universal_eyes_manager
95
+ attr_accessor :universal_eyes, :universal_driver
96
+
63
97
  def initialize(*args)
64
98
  options = Applitools::Utils.extract_options!(args)
65
99
  self.runner = options[:runner]
@@ -100,6 +134,9 @@ module Applitools
100
134
  self.server_scale = 0
101
135
  self.server_remainder = 0
102
136
  self.compare_with_parent_branch = false
137
+
138
+ self.universal_eyes = nil # eyes.open
139
+ self.universal_driver = nil # eyes.open
103
140
  end
104
141
 
105
142
  def ensure_config
@@ -158,15 +195,20 @@ module Applitools
158
195
  self.last_screenshot = nil
159
196
  clear_user_inputs
160
197
 
198
+ if !running_session && !universal_eyes
199
+ logger.info('Server session was not started')
200
+ logger.info('--- Empty test ended')
201
+ return Applitools::TestResults.new
202
+ end
203
+
204
+
161
205
  if running_session.nil?
162
206
  logger.info 'Closed'
163
207
  return false
164
208
  end
165
209
 
166
210
  logger.info 'Aborting server session...'
167
- server_connector.stop_session(running_session, true, false)
168
- logger.info '---Test aborted'
169
-
211
+ universal_sdk_abort
170
212
  rescue Applitools::EyesError => e
171
213
  logger.error e.message
172
214
 
@@ -207,18 +249,18 @@ module Applitools
207
249
  raise e
208
250
  end
209
251
 
210
- def update_config_from_options(options)
211
- # Applitools::ArgumentGuard.hash options, 'open_base parameter', [:test_name]
212
- default_options = { session_type: 'SEQUENTIAL' }
213
- options = default_options.merge options
214
-
215
- self.app_name = options[:app_name] if options[:app_name]
216
-
217
- # Applitools::ArgumentGuard.not_nil options[:test_name], 'options[:test_name]'
218
- self.test_name = options[:test_name] if options[:test_name]
219
- self.viewport_size = options[:viewport_size] if options[:viewport_size]
220
- self.session_type = options[:session_type] if options[:session_type]
221
- end
252
+ # def update_config_from_options(options)
253
+ # # Applitools::ArgumentGuard.hash options, 'open_base parameter', [:test_name]
254
+ # default_options = { session_type: 'SEQUENTIAL' }
255
+ # options = default_options.merge options
256
+ #
257
+ # self.app_name = options[:app_name] if options[:app_name]
258
+ #
259
+ # # Applitools::ArgumentGuard.not_nil options[:test_name], 'options[:test_name]'
260
+ # self.test_name = options[:test_name] if options[:test_name]
261
+ # self.viewport_size = options[:viewport_size] if options[:viewport_size]
262
+ # self.session_type = options[:session_type] if options[:session_type]
263
+ # end
222
264
 
223
265
  def merge_config(other_config)
224
266
  config.merge(other_config)
@@ -393,40 +435,50 @@ module Applitools
393
435
 
394
436
  clear_user_inputs
395
437
 
396
- unless running_session
438
+ if !running_session && !universal_eyes
397
439
  be_silent || logger.info('Server session was not started')
398
440
  be_silent || logger.info('--- Empty test ended')
399
441
  return Applitools::TestResults.new
400
442
  end
401
443
 
402
- is_new_session = running_session.new_session?
403
- session_results_url = running_session.url
444
+ # is_new_session = running_session.new_session?
445
+ # session_results_url = running_session.url
404
446
 
405
447
  logger.info 'Ending server session...'
406
448
 
407
- save = is_new_session && save_new_tests || !is_new_session && failed && save_failed_tests
449
+ # save = is_new_session && save_new_tests || !is_new_session && failed && save_failed_tests
408
450
 
409
- logger.info "Automatically save test? #{save}"
451
+ # logger.info "Automatically save test? #{save}"
410
452
 
411
- results = server_connector.stop_session running_session, false, save
453
+ # U-Notes : universal server returns Array ; keys as sym
454
+ universal_results = universal_eyes.close # Array even for one test
455
+ # require 'pry'
456
+ # binding.pry
457
+ key_transformed_results = Applitools::Utils.deep_stringify_keys(universal_results)
458
+ results = key_transformed_results.map {|result| Applitools::TestResults.new(result) }
459
+ results = results.first if results.size == 1
460
+ session_results_url = results.url
461
+ # results = server_connector.stop_session running_session, false, save
412
462
  runner.aggregate_result(results) if runner
413
463
 
414
- results.is_new = is_new_session
415
- results.url = session_results_url
464
+ # results.is_new = is_new_session
465
+ # results.url = session_results_url
466
+ save = results.new? && save_new_tests || !results.new? && failed && save_failed_tests
467
+ logger.info "Automatically save test? #{save}"
416
468
 
417
469
  logger.info results.to_s(verbose_results)
418
470
 
419
471
  if results.unresolved?
420
472
  if results.new?
421
473
  logger.error "--- New test ended. see details at #{session_results_url}"
422
- error_message = "New test '#{session_start_info.scenario_id_or_name}' " \
423
- "of '#{session_start_info.app_id_or_name}' " \
474
+ error_message = "New test '#{test_name}' " \
475
+ "of '#{app_name}' " \
424
476
  "Please approve the baseline at #{session_results_url} "
425
477
  raise Applitools::NewTestError.new error_message, results if throw_exception
426
478
  else
427
479
  logger.error "--- Differences are found. see details at #{session_results_url}"
428
- error_message = "Test '#{session_start_info.scenario_id_or_name}' " \
429
- "of '#{session_start_info.app_id_or_name}' " \
480
+ error_message = "Test '#{test_name}' " \
481
+ "of '#{app_name}' " \
430
482
  "detected differences! See details at #{session_results_url}"
431
483
  raise Applitools::DiffsFoundError.new error_message, results if throw_exception
432
484
  end
@@ -435,7 +487,7 @@ module Applitools
435
487
 
436
488
  if results.failed?
437
489
  logger.error "--- Failed test ended. see details at #{session_results_url}"
438
- error_message = "Test '#{session_start_info.scenario_id_or_name}' of '#{session_start_info.app_id_or_name}' " \
490
+ error_message = "Test '#{test_name}' of '#{app_name}' " \
439
491
  "is failed! See details at #{session_results_url}"
440
492
  raise Applitools::TestFailedError.new error_message, results if throw_exception
441
493
  return results
@@ -11,7 +11,7 @@ require 'applitools/core/image_match_settings'
11
11
 
12
12
  module Applitools
13
13
  class EyesBaseConfiguration < AbstractConfiguration
14
- DEFAULT_MATCH_TIMEOUT = 2 # seconds
14
+ DEFAULT_MATCH_TIMEOUT = 0 # seconds
15
15
 
16
16
  DEFAULT_CONFIG = {
17
17
  branch_name: ENV['APPLITOOLS_BRANCH'],
@@ -200,5 +200,26 @@ module Applitools
200
200
 
201
201
  methods_to_delegate.push(:set_proxy)
202
202
  methods_to_delegate.push(:add_property)
203
+
204
+ # U-Notes : Universal Add
205
+
206
+ # layoutBreakpoints?: boolean | number[]
207
+ def layout_breakpoints=(value)
208
+ config_hash[:layout_breakpoints] = (value.is_a?(Array) && value.all? {|v| v.is_a?(Numeric)}) ? value : !!value
209
+ end
210
+ def layout_breakpoints
211
+ config_hash[:layout_breakpoints]
212
+ end
213
+ collect_method :layout_breakpoints
214
+
215
+ # scrollRootElement?: TElement | TSelector
216
+ def scroll_root_element=(value)
217
+ config_hash[:scroll_root_element] = value
218
+ end
219
+ def scroll_root_element
220
+ config_hash[:scroll_root_element]
221
+ end
222
+ collect_method :scroll_root_element
223
+
203
224
  end
204
225
  end
@@ -3,9 +3,12 @@
3
3
  module Applitools
4
4
  class EyesRunner
5
5
  attr_accessor :batches_server_connectors_map
6
+ attr_accessor :universal_client, :universal_eyes_manager
6
7
 
7
8
  def initialize
8
9
  self.batches_server_connectors_map = {}
10
+ self.universal_client = Applitools::Connectivity::UniversalClient.new
11
+ self.universal_eyes_manager = nil # eyes.open
9
12
  end
10
13
 
11
14
  def add_batch(batch_id, &block)
@@ -15,5 +18,14 @@ module Applitools
15
18
  def delete_all_batches
16
19
  batches_server_connectors_map.each_value { |v| v.call if v.respond_to? :call }
17
20
  end
21
+
22
+ def get_universal_eyes_manager
23
+ return universal_eyes_manager if universal_eyes_manager
24
+ self.universal_eyes_manager = universal_client.make_manager(universal_eyes_manager_config.to_hash)
25
+ end
26
+
27
+ def close_all_eyes
28
+ get_universal_eyes_manager.close_all_eyes
29
+ end
18
30
  end
19
31
  end
@@ -93,14 +93,14 @@ module Applitools
93
93
 
94
94
  def to_hash
95
95
  {
96
- 'Top' => top,
97
- 'Left' => left,
98
- 'Width' => width,
99
- 'Height' => height,
100
- 'MaxUpOffset' => max_top_offset + padding_top,
101
- 'MaxLeftOffset' => max_left_offset + padding_left,
102
- 'MaxRightOffset' => max_right_offset + padding_right,
103
- 'MaxDownOffset' => max_bottom_offset + padding_bottom
96
+ 'top' => top,
97
+ 'left' => left,
98
+ 'width' => width,
99
+ 'height' => height,
100
+ 'maxUpOffset' => max_top_offset + padding_top,
101
+ 'maxLeftOffset' => max_left_offset + padding_left,
102
+ 'maxRightOffset' => max_right_offset + padding_right,
103
+ 'maxDownOffset' => max_bottom_offset + padding_bottom
104
104
  }
105
105
  end
106
106
  end
@@ -123,5 +123,14 @@ module Applitools
123
123
  self.max_right_offset = max_right_offset
124
124
  self.max_bottom_offset = max_bottom_offset
125
125
  end
126
+
127
+ def to_hash
128
+ {
129
+ maxUpOffset: max_top_offset,
130
+ maxDownOffset: max_bottom_offset,
131
+ maxLeftOffset: max_left_offset,
132
+ maxRightOffset: max_right_offset
133
+ }
134
+ end
126
135
  end
127
136
  end
@@ -98,6 +98,60 @@ module Applitools
98
98
  min_diff_height == other.min_diff_height &&
99
99
  match_threshold == other.match_threshold
100
100
  end
101
+
102
+ def to_hash
103
+ {
104
+ minDiffIntensity: min_diff_intensity,
105
+ minDiffWidth: min_diff_width,
106
+ minDiffHeight: min_diff_height,
107
+ matchThreshold: match_threshold
108
+ }
109
+ end
101
110
  end
111
+
112
+ # export type MatchSettings<TRegion> = {
113
+ # exact?: {
114
+ # minDiffIntensity: number
115
+ # minDiffWidth: number
116
+ # minDiffHeight: number
117
+ # matchThreshold: number
118
+ # }
119
+ # matchLevel?: MatchLevel
120
+ # sendDom?: boolean
121
+ # useDom?: boolean
122
+ # enablePatterns?: boolean
123
+ # ignoreCaret?: boolean
124
+ # ignoreDisplacements?: boolean
125
+ # accessibilitySettings?: {
126
+ # level?: AccessibilityLevel
127
+ # guidelinesVersion?: AccessibilityGuidelinesVersion
128
+ # }
129
+ # ignoreRegions?: TRegion[]
130
+ # layoutRegions?: TRegion[]
131
+ # strictRegions?: TRegion[]
132
+ # contentRegions?: TRegion[]
133
+ # floatingRegions?: (TRegion | FloatingRegion<TRegion>)[]
134
+ # accessibilityRegions?: (TRegion | AccessibilityRegion<TRegion>)[]
135
+ # }
136
+ def to_hash
137
+ result = {}
138
+ result[:exact] = exact.to_hash unless exact == Exact.new # ...
139
+ result[:matchLevel] = match_level
140
+ # result[:sendDom] = nil # duplicate configuration ?
141
+ result[:useDom] = use_dom if use_dom
142
+ result[:enablePatterns] = enable_patterns if enable_patterns
143
+ result[:ignoreCaret] = ignore_caret if ignore_caret
144
+ result[:ignoreDisplacements] = ignore_displacements if ignore_displacements
145
+ result[:accessibilitySettings] = accessibility_settings.to_hash if accessibility_settings
146
+ result[:ignoreRegions] = ignore unless ignore.empty?
147
+ result[:layoutRegions] = layout unless layout.empty?
148
+ result[:strictRegions] = strict unless strict.empty?
149
+ result[:contentRegions] = content unless content.empty?
150
+ result[:floatingRegions] = floating unless floating.empty?
151
+ result[:accessibilityRegions] = accessibility unless accessibility.empty?
152
+ result.compact
153
+ # :SplitTopHeight, :SplitBottomHeight, :scale, :remainder - deprecated ?
154
+ end
155
+
102
156
  end
103
157
  end
@@ -5,13 +5,15 @@ module Applitools
5
5
  extend self
6
6
  NONE = 'None'.freeze
7
7
  LAYOUT = 'Layout'.freeze
8
+ LAYOUT1 = 'Layout1'.freeze
8
9
  LAYOUT2 = 'Layout2'.freeze
9
10
  CONTENT = 'Content'.freeze
10
11
  STRICT = 'Strict'.freeze
11
12
  EXACT = 'Exact'.freeze
12
13
 
13
14
  def enum_values
14
- [NONE, LAYOUT, LAYOUT2, CONTENT, STRICT, EXACT]
15
+ [NONE, LAYOUT, LAYOUT1, LAYOUT2, CONTENT, STRICT, EXACT]
15
16
  end
16
17
  end
17
18
  end
19
+ # U-Notes : Added Layout1 MatchLevel
@@ -26,8 +26,8 @@ module Applitools
26
26
  @mismatches = results.fetch('mismatches', 0)
27
27
  @missing = results.fetch('missing', 0)
28
28
  @status = results.fetch('status', 0)
29
- @is_new = nil
30
- @url = nil
29
+ @is_new = results.fetch('isNew', nil)
30
+ @url = results.fetch('url', nil)
31
31
  end
32
32
 
33
33
  def passed?
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Applitools
4
+ module UniversalEyesChecks
5
+
6
+ # Takes a snapshot and matches it with the expected output.
7
+ #
8
+ # @param [String] name The name of the tag.
9
+ # @param [Applitools::Selenium::Target] target which area of the window to check.
10
+ # @return [Applitools::MatchResult] The match results.
11
+ def universal_check(name, target)
12
+ return disabled_result if respond_to?(:disabled?) && disabled?
13
+
14
+ raise Applitools::EyesNotOpenException.new('Eyes not open!') if @universal_eyes.nil?
15
+ Applitools::EyesLogger.logger.info "#{test_name} : check(#{name}) started ..."
16
+ # require 'pry'
17
+ # binding.pry
18
+ check_result = @universal_eyes.check(get_universal_check_settings(name, target))
19
+ if server_error?(check_result)
20
+ # require 'pry'
21
+ # binding.pry
22
+ raise Applitools::EyesError.new("Request failed: #{check_result[:message]}")
23
+ end
24
+
25
+ if check_result != {}
26
+ result = Applitools::MatchResult.new(Applitools::Utils.deep_stringify_keys(check_result))
27
+
28
+ check_fail_result_processing(name) unless result.as_expected?
29
+ end
30
+
31
+ logger.info 'Done!'
32
+ end
33
+
34
+ private
35
+
36
+ def disabled_result
37
+ logger.info "#{__method__} Ignored"
38
+ result = Applitools::MatchResults.new
39
+ result.as_expected = true
40
+ result
41
+ end
42
+
43
+ def get_universal_check_settings(name, target)
44
+ universal_check_settings = Applitools::UniversalCheckSettings.new(name: name)
45
+ universal_check_settings.from_original_target(target, self)
46
+ # require 'pry'
47
+ # binding.pry
48
+ universal_check_settings.to_hash
49
+ end
50
+
51
+ def check_fail_result_processing(name)
52
+ self.failed = true
53
+ logger.info "Mistmatch! #{name}" #unless running_session.new_session?
54
+
55
+ if failure_reports == :immediate
56
+ raise Applitools::TestFailedException.new "Mistmatch found in #{test_name} of #{app_name}"
57
+ end
58
+ end
59
+
60
+ def server_error?(universal_results)
61
+ universal_results.is_a?(Hash) && universal_results[:message] && universal_results[:stack]
62
+ end
63
+
64
+ end
65
+ end
66
+ # U-Notes : Added internal Applitools::UniversalEyesChecks
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Applitools
4
+ module UniversalEyesOpen
5
+
6
+ # Starts a test
7
+ #
8
+ # @param options [Hash] options
9
+ # @option options :driver The driver that controls the browser hosting the application
10
+ # under the test. (*Required* option)
11
+ # @option options [String] :app_name The name of the application under the test. (*Required* option)
12
+ # @option options [String] :test_name The test name (*Required* option)
13
+ # @option options [String | Hash] :viewport_size The required browser's viewport size
14
+ # (i.e., the visible part of the document's body) or +nil+ to use the current window's viewport.
15
+ # @option options :session_type The type of the test (e.g., standard test / visual performance test).
16
+ # Default value is 'SEQUENTAL'
17
+ # @return [Applitools::Selenium::Driver] A wrapped web driver which enables Eyes
18
+ # trigger recording and frame handling
19
+ def universal_open(options = {})
20
+ original_driver = options.delete(:driver)
21
+ Applitools::ArgumentGuard.not_nil original_driver, 'options[:driver]'
22
+
23
+ if respond_to?(:disabled?) && disabled?
24
+ logger.info('Ignored')
25
+ return original_driver
26
+ end
27
+
28
+ self.driver = Applitools::Selenium::SeleniumEyes.eyes_driver(original_driver, self)
29
+
30
+ update_config_from_options(options)
31
+ universal_driver_config = driver.universal_driver_config
32
+ universal_eyes_manager = runner.get_universal_eyes_manager
33
+
34
+ universal_eyes_config = Applitools::UniversalEyesConfig.new
35
+ universal_eyes_config.from_original_sdk(self)
36
+
37
+ # require('pry')
38
+ # binding.pry
39
+
40
+ @universal_eyes = universal_eyes_manager.open_eyes(universal_driver_config, universal_eyes_config.to_hash)
41
+ raise Applitools::EyesNotOpenException.new('Eyes not open!') if @universal_eyes.nil?
42
+
43
+ self.open = true if respond_to?(:open=, true)
44
+ self.running_session = true if respond_to?(:running_session=, true)
45
+ driver
46
+ rescue Applitools::EyesError => e
47
+ logger.error e.message
48
+ raise e
49
+ end
50
+
51
+ def universal_sdk_abort
52
+ if respond_to?(:disabled?) && disabled?
53
+ logger.info "#{__method__} Ignore disabled"
54
+ return false
55
+ end
56
+ # raise Applitools::EyesNotOpenException.new('Eyes not open!') if @eyes.nil?
57
+ return if @universal_eyes.nil?
58
+ result = @universal_eyes.abort
59
+
60
+ if result.is_a? Hash
61
+ logger.info "---Test aborted" if !result[:message] && !result[:stack]
62
+ else
63
+ # TestCheckFrameInFrame_Fully_Fluent_VG\
64
+ # require('pry')
65
+ # binding.pry
66
+ end
67
+ end
68
+
69
+ private
70
+
71
+ def update_config_from_options(options)
72
+ default_options = { session_type: 'SEQUENTIAL' }
73
+
74
+ options = default_options.merge options
75
+
76
+ self.app_name = options[:app_name] if options[:app_name]
77
+ self.test_name = options[:test_name] if options[:test_name]
78
+ if (config.viewport_size.nil? || config.viewport_size&.empty?) && options[:viewport_size]
79
+ self.viewport_size = Applitools::RectangleSize.from_any_argument options[:viewport_size]
80
+ end
81
+ self.session_type = options[:session_type] if options[:session_type]
82
+
83
+ raise Applitools::EyesIllegalArgument, config.validation_errors.values.join('/n') unless config.valid?
84
+
85
+ logger.info "Agent = #{full_agent_id}"
86
+ logger.info "open(app_name: #{app_name}, test_name: #{test_name}," \
87
+ " viewport_size: #{viewport_size})"
88
+
89
+ raise Applitools::EyesError.new 'API key is missing! Please set it using api_key=' if
90
+ api_key.nil? || (api_key && api_key.empty?)
91
+
92
+ logger.info "Batch is #{@batch}" if @batch
93
+ app_env = app_environment if respond_to? :app_environment
94
+ logger.info "Application environment is #{app_env}"
95
+ test_info = "'#{test_name}' of '#{app_name}' #{app_env}"
96
+ logger.info "--- New test started - #{test_info}"
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: false
2
+
3
+ module Applitools
4
+ module UniversalNewApi
5
+
6
+ # export type OCRExtractSettings<TElement, TSelector> = {
7
+ # target: RegionReference<TElement, TSelector>
8
+ # hint?: string
9
+ # minMatch?: number
10
+ # language?: string
11
+ # }
12
+ def extract_text(targets_array)
13
+ targets_array.map do |target|
14
+ target['target'] = { elementId: target['target'].ref } if target['target'].is_a?(::Selenium::WebDriver::Element)
15
+ target
16
+ end
17
+ universal_eyes.extract_text(targets_array)
18
+ end
19
+
20
+
21
+ # export type OCRSearchSettings<TPattern extends string> = {
22
+ # patterns: TPattern[]
23
+ # ignoreCase?: boolean
24
+ # firstOnly?: boolean
25
+ # language?: string
26
+ # }
27
+ def extract_text_regions(patterns_array)
28
+ results = universal_eyes.extract_text_regions(patterns_array)
29
+ Applitools::Utils.deep_stringify_keys(results)
30
+ end
31
+
32
+
33
+ def locate(locate_settings)
34
+ settings = {
35
+ locatorNames: locate_settings[:locator_names],
36
+ firstOnly: !!locate_settings[:first_only]
37
+ }
38
+ results = universal_eyes.locate(settings)
39
+ Applitools::Utils.deep_stringify_keys(results)
40
+ end
41
+
42
+ end
43
+ end