eyes_core 3.18.1 → 4.0.0

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/applitools/appium/eyes.rb +2 -1
  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 +4 -2
  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 +82 -29
  10. data/lib/applitools/core/eyes_base_configuration.rb +34 -2
  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/match_window_data.rb +4 -0
  16. data/lib/applitools/core/session_start_info.rb +2 -1
  17. data/lib/applitools/core/test_results.rb +2 -2
  18. data/lib/applitools/core/universal_eyes_checks.rb +66 -0
  19. data/lib/applitools/core/universal_eyes_open.rb +100 -0
  20. data/lib/applitools/core/universal_new_api.rb +43 -0
  21. data/lib/applitools/universal_sdk/universal_check_settings.rb +184 -0
  22. data/lib/applitools/universal_sdk/universal_client.rb +142 -0
  23. data/lib/applitools/universal_sdk/universal_client_socket.rb +110 -0
  24. data/lib/applitools/universal_sdk/universal_eyes.rb +45 -0
  25. data/lib/applitools/universal_sdk/universal_eyes_config.rb +203 -0
  26. data/lib/applitools/universal_sdk/universal_eyes_manager.rb +40 -0
  27. data/lib/applitools/universal_sdk/universal_eyes_manager_config.rb +62 -0
  28. data/lib/applitools/universal_sdk/universal_server.rb +81 -0
  29. data/lib/applitools/utils/utils.rb +13 -0
  30. data/lib/applitools/version.rb +2 -1
  31. data/lib/eyes_core.rb +3 -0
  32. 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)
@@ -319,7 +361,7 @@ module Applitools
319
361
  branch_name: branch_name, parent_branch_name: parent_branch_name,
320
362
  baseline_branch_name: baseline_branch_name, save_diffs: save_diffs,
321
363
  properties: properties
322
-
364
+ session_start_info.agent_run_id = agent_run_id if agent_run_id
323
365
  match_window_data.start_info = session_start_info
324
366
  match_window_data.update_baseline_if_new = save_new_tests
325
367
  match_window_data.update_baseline_if_different = save_failed_tests
@@ -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
@@ -597,6 +649,7 @@ module Applitools
597
649
  branch_name: branch_name, parent_branch_name: parent_branch_name,
598
650
  baseline_branch_name: baseline_branch_name, save_diffs: save_diffs,
599
651
  properties: properties
652
+ session_start_info.agent_run_id = agent_run_id if agent_run_id
600
653
 
601
654
  logger.info 'Starting server session...'
602
655
  self.running_session = server_connector.start_session session_start_info
@@ -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'],
@@ -25,7 +25,10 @@ module Applitools
25
25
  default_match_settings: Applitools::ImageMatchSettings.new,
26
26
  accessibility_validation: nil,
27
27
  properties: [],
28
- match_timeout: DEFAULT_MATCH_TIMEOUT
28
+ match_timeout: DEFAULT_MATCH_TIMEOUT,
29
+ dont_fetch_resources: true,
30
+ enable_cross_origin_rendering: true,
31
+ dont_use_cookies: false,
29
32
  }.freeze
30
33
 
31
34
  class << self
@@ -118,6 +121,10 @@ module Applitools
118
121
  object_field :accessibility_validation, Applitools::AccessibilitySettings, true
119
122
  object_field :properties, Array
120
123
  int_field :match_timeout
124
+ string_field :agent_run_id
125
+ boolean_field :dont_fetch_resources
126
+ boolean_field :enable_cross_origin_rendering
127
+ boolean_field :dont_use_cookies
121
128
 
122
129
  methods_to_delegate.delete(:batch_info)
123
130
  methods_to_delegate.delete(:batch_info=)
@@ -187,7 +194,32 @@ module Applitools
187
194
  properties << { name: name, value: value } if name && value
188
195
  end
189
196
 
197
+ def disable_browser_fetching=(value)
198
+ self.dont_fetch_resources = value
199
+ end
200
+
190
201
  methods_to_delegate.push(:set_proxy)
191
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
+
192
224
  end
193
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
@@ -87,6 +87,10 @@ module Applitools
87
87
  current_data['Options']['Name'] = value
88
88
  end
89
89
 
90
+ def variation_group_id=(value)
91
+ current_data['Options']['variantId'] = value
92
+ end
93
+
90
94
  def user_inputs=(value)
91
95
  Applitools::ArgumentGuard.is_a? value, 'value', Array
92
96
  current_data['UserInputs'] += value.select { |i| i.respond_to? :to_hash }
@@ -5,7 +5,7 @@ module Applitools
5
5
  include Applitools::Jsonable
6
6
  json_fields :batchInfo, :agentId, :appIdOrName, :verId, :environment, :environmentName, :branchName, :defaultMatchSettings,
7
7
  :scenarioIdOrName, :properties, :parentBranchName, :compareWithParentBranch, :baselineEnvName, :saveDiffs, :sessionType,
8
- :baselineBranchName
8
+ :baselineBranchName, :agentRunId
9
9
 
10
10
  wrap_data do |value|
11
11
  { startInfo: value }
@@ -28,6 +28,7 @@ module Applitools
28
28
  self.save_diffs = options[:save_diffs]
29
29
  self.session_type = options[:session_type]
30
30
  self.baseline_branch_name = options[:baseline_branch_name]
31
+ self.agentRunId = options[:agent_run_id] if options[:agent_run_id]
31
32
  end
32
33
 
33
34
  def to_hash
@@ -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