eyes_selenium 3.15.34 → 3.15.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: af47a3cf5f78a02f3ddd19d4ef5cb2e74996b39a734ac537b6b0bd844a5a3cd1
4
- data.tar.gz: bcdfcd5b4d844f2b2e7a5c6476a4064ae95d0989b022f4ef72462880f3104815
3
+ metadata.gz: aab8529dcb077f8221beb47146b533b99972fed1bb8564526ce3e3080ccadab4
4
+ data.tar.gz: c019144e8b13f7c3f7217dac08d96fbc91e935e028502406c0e76f1518e8facc
5
5
  SHA512:
6
- metadata.gz: e34b2b52f33d50c3a855306497cff6c071600cdd504fab00693edd5624a2b36f714a148ef53120f2d8fdc3e8286b6f836ca3bf5faf64955a9ab87768fef344d2
7
- data.tar.gz: 332597fba9f007cd911ffcac3ee3f7abe1ad361c61488576ac8f50e87613e8f288c0a02d0475dd8b5b204593a021f28876337326604287862312382f905c896c
6
+ metadata.gz: 99b0b16d5160a1ccbff7915afedaf15b62965ca8a58980e73e198f3e1aa5986d4277dcf423cfaf14da1c61329e831f768af2e15c79fb202a47771da4b4169ad1
7
+ data.tar.gz: baf60a724aaf8819182a61b726cfbef865e49fe745fbb3c58a9ec589148f95d04aacb6e87b8534bcfcfe84be50a15eed8e8c1c4893b79811b88427b2f33c9255
@@ -1,10 +1,10 @@
1
1
  require 'applitools/selenium/stitch_modes'
2
- require 'applitools/selenium/stitch_modes'
3
2
  require 'applitools/selenium/browsers_info'
4
3
 
5
4
  module Applitools
6
5
  module Selenium
7
6
  class Configuration < Applitools::EyesBaseConfiguration
7
+
8
8
  DEFAULT_CONFIG = proc do
9
9
  {
10
10
  force_full_page_screenshot: false,
@@ -12,7 +12,8 @@ module Applitools
12
12
  stitch_mode: Applitools::Selenium::StitchModes::CSS,
13
13
  hide_scrollbars: false,
14
14
  hide_caret: false,
15
- browsers_info: Applitools::Selenium::BrowsersInfo.new
15
+ browsers_info: Applitools::Selenium::BrowsersInfo.new,
16
+ accessibility_validation: Applitools::AccessibilityLevel::NONE
16
17
  }
17
18
  end
18
19
  class << self
@@ -30,6 +31,15 @@ module Applitools
30
31
 
31
32
  object_field :browsers_info, Applitools::Selenium::BrowsersInfo
32
33
  int_field :concurrent_sessions
34
+ enum_field :accessibility_validation, Applitools::AccessibilityLevel.enum_values
35
+
36
+ def match_level_keys
37
+ super << :accessibility_validation
38
+ end
39
+
40
+ def default_match_settings
41
+ super.merge(accessibility_validation: accessibility_validation)
42
+ end
33
43
 
34
44
  def add_browser(*args)
35
45
  case args.size
@@ -38,7 +38,9 @@ module Applitools::Selenium
38
38
  #
39
39
  # @param [Applitools::Location] value The location.
40
40
  def restore_state(value)
41
- transforms = value.values.compact.select { |el| !el.empty? }
41
+ Applitools::Utils::EyesSeleniumUtils.set_current_transforms(executor, "translate(10px, 0px)")
42
+
43
+ transforms = value.values.compact.map(&:to_s).select { |el| !el.empty? }
42
44
  Applitools::Utils::EyesSeleniumUtils.set_transforms(executor, value)
43
45
  if transforms.empty?
44
46
  self.last_state_position = Applitools::Location::TOP_LEFT
@@ -6,11 +6,11 @@ module Applitools
6
6
  options = Applitools::Utils.extract_options!(args)
7
7
  server_url = options.delete(:server_url)
8
8
  server_url = args.first unless server_url
9
- runner = options.delete(:visual_grid_runner)
9
+ runner = options.delete(:visual_grid_runner) || options.delete(:runner)
10
10
  if runner.is_a? Applitools::Selenium::VisualGridRunner
11
11
  super Applitools::Selenium::VisualGridEyes.new(runner, server_url)
12
12
  else
13
- super Applitools::Selenium::SeleniumEyes.new(server_url)
13
+ super Applitools::Selenium::SeleniumEyes.new(server_url, runner: runner || Applitools::ClassicRunner.new)
14
14
  end
15
15
  end
16
16
 
@@ -116,6 +116,8 @@ module Applitools::Selenium
116
116
  logger.info 'Done! Adding initial screenshot..'
117
117
  logger.info "Initial part:(0,0) [#{image.width} x #{image.height}]"
118
118
 
119
+ image.crop!(0,0,stitched_image.width < image.width ? stitched_image.width : image.width, stitched_image.height < image.height ? stitched_image.height : image.height)
120
+
119
121
  stitched_image.replace! image, 0, 0
120
122
  logger.info 'Done!'
121
123
 
@@ -109,7 +109,7 @@ module Applitools::Selenium
109
109
  # Eyes Server at the specified url.
110
110
  #
111
111
  # @param server_url The Eyes Server URL.
112
- def initialize(server_url = nil)
112
+ def initialize(*args)
113
113
  ensure_config
114
114
  super
115
115
  self.base_agent_id = "eyes.selenium.ruby/#{Applitools::VERSION}".freeze
@@ -178,7 +178,7 @@ module Applitools::Selenium
178
178
 
179
179
  self.device_pixel_ratio = UNKNOWN_DEVICE_PIXEL_RATIO
180
180
  self.position_provider = self.class.position_provider(
181
- stitch_mode, driver, disable_horizontal_scrolling, disable_vertical_scrolling, explicit_entire_size
181
+ stitch_mode, driver, disable_horizontal_scrolling, disable_vertical_scrolling, explicit_entire_size
182
182
  )
183
183
 
184
184
  self.eyes_screenshot_factory = lambda do |image|
@@ -191,6 +191,11 @@ module Applitools::Selenium
191
191
  self.viewport_size = nil if force_driver_resolution_as_viewport_size
192
192
  ensure_running_session
193
193
  end
194
+ if runner
195
+ runner.add_batch(batch.id) do
196
+ server_connector.close_batch(batch.id)
197
+ end
198
+ end
194
199
  @driver
195
200
  end
196
201
 
@@ -208,25 +213,25 @@ module Applitools::Selenium
208
213
  # @option value [Symbol] :css use Css to perform stitching.
209
214
  # @option value [Symbol] :scroll Scroll to perform stitching.
210
215
  # @return [Symbol] The type of stitching.
211
- def stitch_mode=(value)
212
- @stitch_mode = if value.to_s.upcase == Applitools::STITCH_MODE[:css].to_s
213
- Applitools::STITCH_MODE[:css]
214
- else
215
- Applitools::STITCH_MODE[:scroll]
216
- end
217
- unless driver.nil?
218
- self.position_provider = self.class.position_provider(
219
- stitch_mode, driver, disable_horizontal_scrolling, disable_vertical_scrolling, explicit_entire_size
220
- )
221
- end
222
- if stitch_mode == Applitools::STITCH_MODE[:css]
223
- @css_transition_original_hide_scrollbars = hide_scrollbars
224
- self.hide_scrollbars = true
225
- else
226
- self.hide_scrollbars = @css_transition_original_hide_scrollbars || false
227
- end
228
- value
229
- end
216
+ # def stitch_mode=(value)
217
+ # @stitch_mode = if value.to_s.upcase == Applitools::STITCH_MODE[:css].to_s
218
+ # Applitools::STITCH_MODE[:css]
219
+ # else
220
+ # Applitools::STITCH_MODE[:scroll]
221
+ # end
222
+ # unless driver.nil?
223
+ # self.position_provider = self.class.position_provider(
224
+ # stitch_mode, driver, disable_horizontal_scrolling, disable_vertical_scrolling, explicit_entire_size
225
+ # )
226
+ # end
227
+ # if stitch_mode == Applitools::STITCH_MODE[:css]
228
+ # @css_transition_original_hide_scrollbars = hide_scrollbars
229
+ # self.hide_scrollbars = true
230
+ # else
231
+ # self.hide_scrollbars = @css_transition_original_hide_scrollbars || false
232
+ # end
233
+ # value
234
+ # end
230
235
 
231
236
  # Takes a snapshot of the application under test and matches it with the expected output.
232
237
  #
@@ -860,10 +865,10 @@ module Applitools::Selenium
860
865
  max_height = explicit_entire_size.height
861
866
  end
862
867
  case stitch_mode
863
- when :SCROLL
868
+ when Applitools::Selenium::StitchModes::SCROLL
864
869
  Applitools::Selenium::ScrollPositionProvider.new(driver, disable_horizontal, disable_vertical,
865
870
  max_width, max_height)
866
- when :CSS
871
+ when Applitools::Selenium::StitchModes::CSS
867
872
  Applitools::Selenium::CssTranslatePositionProvider.new(driver, disable_horizontal, disable_vertical,
868
873
  max_width, max_height)
869
874
  end
@@ -21,7 +21,7 @@ module Applitools
21
21
 
22
22
  attr_accessor :element, :frames, :region_to_check, :coordinate_type, :options, :ignored_regions,
23
23
  :floating_regions, :frame_or_element, :regions, :match_level, :layout_regions, :content_regions,
24
- :strict_regions
24
+ :strict_regions, :accessibility_regions
25
25
 
26
26
  private :frame_or_element, :frame_or_element=
27
27
 
@@ -221,11 +221,20 @@ module Applitools
221
221
  replace_element(original_region, new_region, floating_regions)
222
222
  when :ignore
223
223
  replace_element(original_region, new_region, ignored_regions)
224
+ when :accessibility_regions
225
+ replace_element(original_region, new_region, accessibility_regions)
224
226
  end
225
227
  end
226
228
 
227
229
  def replace_element(original, new, array)
228
- array[array.index(original)] = new
230
+ case new
231
+ when Array
232
+ index = array.index(original)
233
+ array.delete_at(index)
234
+ array.insert(index, *new)
235
+ when Applitools::Selenium::VGRegion
236
+ array[array.index(original)] = new
237
+ end
229
238
  end
230
239
 
231
240
  def match_level(*args)
@@ -306,6 +315,55 @@ module Applitools
306
315
  dup.region(region)
307
316
  end
308
317
 
318
+ def accessibility(*args)
319
+ options = Applitools::Utils.extract_options! args
320
+ unless options[:type]
321
+ raise Applitools::EyesError,
322
+ 'You should call Target.accessibility(region, region_type: type). The region_type option is required'
323
+ end
324
+ unless Applitools::AccessibilityRegionType.enum_values.include?(options[:type])
325
+ raise Applitools::EyesIllegalArgument,
326
+ "The region type should be one of [#{Applitools::AccessibilityRegionType.enum_values.join(', ')}]"
327
+ end
328
+ handle_frames
329
+ padding_proc = proc do |region|
330
+ Applitools::AccessibilityRegion.new(
331
+ region, options[:type]
332
+ )
333
+ end
334
+
335
+ accessibility_regions << case args.first
336
+ when ::Selenium::WebDriver::Element
337
+ proc do |driver, return_element = false|
338
+ element = applitools_element_from_selenium_element(driver, args.first)
339
+ next element, padding_proc if return_element
340
+ padding_proc.call(element)
341
+ end
342
+ when Applitools::Selenium::Element
343
+ proc do |_driver, return_element = false|
344
+ next args.first, padding_proc if return_element
345
+ padding_proc.call(args.first)
346
+ end
347
+ when Applitools::Region
348
+ Applitools::AccessibilityRegion.new(
349
+ args.first, options[:type]
350
+ )
351
+ when String
352
+ proc do |driver, return_element = false|
353
+ element = driver.find_element(name_or_id: args.first)
354
+ next element, padding_proc if return_element
355
+ padding_proc.call(element)
356
+ end
357
+ else
358
+ proc do |driver, return_element = false|
359
+ elements = driver.find_elements(*args)
360
+ next elements, padding_proc if return_element
361
+ elements.map { |e| padding_proc.call(e) }
362
+ end
363
+ end
364
+ self
365
+ end
366
+
309
367
  private
310
368
 
311
369
  def reset_for_fullscreen
@@ -316,11 +374,16 @@ module Applitools
316
374
  reset_content_regions
317
375
  reset_layout_regions
318
376
  reset_strict_regions
377
+ reset_accessibility_regions
319
378
  options[:stitch_content] = false
320
379
  options[:timeout] = nil
321
380
  options[:trim] = false
322
381
  end
323
382
 
383
+ def reset_accessibility_regions
384
+ self.accessibility_regions = []
385
+ end
386
+
324
387
  def reset_ignore
325
388
  self.ignored_regions = []
326
389
  end
@@ -94,12 +94,12 @@ module Applitools
94
94
  render_status['selectorRegions']
95
95
  end
96
96
 
97
- def match_level_keys
98
- %w(match_level exact scale remainder).map(&:to_sym)
99
- end
97
+ # def match_level_keys
98
+ # %w(match_level exact scale remainder ).map(&:to_sym)
99
+ # end
100
100
 
101
101
  def update_default_settings(match_data)
102
- match_level_keys.each do |k|
102
+ config.match_level_keys.each do |k|
103
103
  match_data.send("#{k}=", default_match_settings[k])
104
104
  end
105
105
  end
@@ -108,14 +108,14 @@ module Applitools
108
108
  "useragent: #{render_status['userAgent']}"
109
109
  end
110
110
 
111
- def default_match_settings
112
- {
113
- match_level: match_level,
114
- exact: exact,
115
- scale: server_scale,
116
- remainder: server_remainder
117
- }
118
- end
111
+ # def default_match_settings
112
+ # {
113
+ # match_level: match_level,
114
+ # exact: exact,
115
+ # scale: server_scale,
116
+ # remainder: server_remainder
117
+ # }
118
+ # end
119
119
 
120
120
  def set_viewport_size(*_args); end
121
121
 
@@ -53,6 +53,11 @@ module Applitools
53
53
  @need_convert_strict_regions_coordinates = true unless @strict_regions.empty?
54
54
  end
55
55
 
56
+ if target.respond_to? :accessibility_regions
57
+ @accessibility_regions = obtain_regions_coordinates(target.accessibility_regions, driver)
58
+ @need_convert_accessibility_regions_coordinates = true unless @accessibility_regions.empty?
59
+ end
60
+
56
61
  # # floating regions
57
62
  return unless target.respond_to? :floating_regions
58
63
  target.floating_regions.each do |r|
@@ -97,7 +102,9 @@ module Applitools
97
102
  region = r.region
98
103
  region = selector_regions[target.regions[region]]
99
104
  raise RegionCoordinatesError.new(r, region['error']) if region['error']
100
- result << Applitools::Region.new(region['x'], region['y'], region['width'], region['height'])
105
+ retrieved_region = Applitools::Region.new(region['x'], region['y'], region['width'], region['height'])
106
+ result_region = r.padding_proc.call(retrieved_region) if r.padding_proc.is_a? Proc
107
+ result << result_region
101
108
  end
102
109
  end
103
110
  result
@@ -132,6 +139,12 @@ module Applitools
132
139
  self.content_regions = @content_regions
133
140
  @need_convert_content_regions_coordinates = false
134
141
  end
142
+
143
+ def convert_accessibility_regions_coordinates
144
+ return unless @need_convert_accessibility_regions_coordinates
145
+ self.accessibility_regions = @accessibility_regions
146
+ @need_convert_accessibility_regions_coordinates = false
147
+ end
135
148
  end
136
149
  end
137
150
  end
@@ -48,6 +48,7 @@ module Applitools
48
48
 
49
49
  config.app_name = options[:app_name] if config.app_name.nil? || config.app_name && config.app_name.empty?
50
50
  config.test_name = options[:test_name] if config.test_name.nil? || config.test_name && config.test_name.empty?
51
+ config.viewport_size = Applitools::RectangleSize.from_any_argument(options[:viewport_size]) if config.viewport_size.nil? || config.viewport_size && config.viewport_size.empty?
51
52
 
52
53
  self.driver = options.delete(:driver)
53
54
  self.current_url = driver.current_url
@@ -59,6 +60,9 @@ module Applitools
59
60
  end
60
61
 
61
62
  visual_grid_manager.open(self)
63
+ visual_grid_manager.add_batch(batch.id) do
64
+ server_connector.close_batch(batch.id)
65
+ end
62
66
 
63
67
  logger.info("getting all browsers info...")
64
68
  browsers_info_list = config.browsers_info
@@ -169,6 +173,16 @@ module Applitools
169
173
  target.content_regions.each do |r|
170
174
  selenium_regions[element_or_region(r, target, :content_regions)] = :content
171
175
  end
176
+ target.accessibility_regions.each do |r|
177
+ case (r = element_or_region(r, target, :accessibility_regions))
178
+ when Array
179
+ r.each do |rr|
180
+ selenium_regions[rr] = :accessibility
181
+ end
182
+ else
183
+ selenium_regions[r] = :accessibility
184
+ end
185
+ end
172
186
  selenium_regions[region_to_check] = :target if size_mod == 'selector'
173
187
 
174
188
  selenium_regions
@@ -194,7 +208,13 @@ module Applitools
194
208
  def element_or_region(target_element, target, options_key)
195
209
  if target_element.respond_to?(:call)
196
210
  region, padding_proc = target_element.call(driver, true)
197
- target.replace_region(target_element, Applitools::Selenium::VGRegion.new(region, padding_proc), options_key)
211
+ case region
212
+ when Array
213
+ regions_to_replace = region.map { |r| Applitools::Selenium::VGRegion.new(r, padding_proc) }
214
+ target.replace_region(target_element, regions_to_replace, options_key)
215
+ else
216
+ target.replace_region(target_element, Applitools::Selenium::VGRegion.new(region, padding_proc), options_key)
217
+ end
198
218
  region
199
219
  else
200
220
  target_element
@@ -1,12 +1,13 @@
1
1
  module Applitools
2
2
  module Selenium
3
- class VisualGridRunner
3
+ class VisualGridRunner < ::Applitools::EyesRunner
4
4
  EMPTY_QUEUE = []
5
5
  attr_accessor :all_eyes, :resource_cache, :put_cache, :rendering_info, :render_queue
6
6
 
7
7
  alias queue render_queue
8
8
 
9
9
  def initialize(concurrent_open_sessions = 10)
10
+ super()
10
11
  self.all_eyes = []
11
12
  self.render_queue = []
12
13
  @thread_pool = Applitools::Selenium::VGThreadPool.new(concurrent_open_sessions)
@@ -41,13 +42,16 @@ module Applitools
41
42
  @rendering_info ||= connector.rendering_info
42
43
  end
43
44
 
44
- def get_all_test_results
45
+ def get_all_test_results(throw_exception = false)
45
46
  while !(all_eyes.select {|e| e.open?}.empty?)
46
47
  sleep 0.5
47
48
  end
49
+ delete_all_batches
48
50
  all_eyes.map { |e| e.test_list.map(&:test_result) }.flatten
49
51
  end
50
52
 
53
+ def aggregate_results(*_args); end
54
+
51
55
  private
52
56
 
53
57
  def all_running_tests
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Applitools
4
- VERSION = '3.15.34'.freeze
4
+ VERSION = '3.15.39'.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.34
4
+ version: 3.15.39
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-09-12 00:00:00.000000000 Z
11
+ date: 2019-11-06 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.34
19
+ version: 3.15.39
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.34
26
+ version: 3.15.39
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: selenium-webdriver
29
29
  requirement: !ruby/object:Gem::Requirement