eyes_selenium 3.14.3 → 3.14.4

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 (42) hide show
  1. checksums.yaml +5 -5
  2. data/lib/applitools/selenium/border_aware_element_content_location_provider.rb +2 -0
  3. data/lib/applitools/selenium/browser.rb +66 -56
  4. data/lib/applitools/selenium/context_based_scale_provider.rb +2 -0
  5. data/lib/applitools/selenium/css_transform/css_transform.rb +21 -0
  6. data/lib/applitools/selenium/css_translate_element_position_provider.rb +48 -0
  7. data/lib/applitools/selenium/css_translate_position_provider.rb +29 -10
  8. data/lib/applitools/selenium/dom_capture/dom_capture.rb +113 -0
  9. data/lib/applitools/selenium/dom_capture/dom_capture_script.rb +103 -0
  10. data/lib/applitools/selenium/driver.rb +9 -2
  11. data/lib/applitools/selenium/element.rb +2 -0
  12. data/lib/applitools/selenium/element_position_provider.rb +3 -1
  13. data/lib/applitools/selenium/entire_element_screenshot.rb +20 -0
  14. data/lib/applitools/selenium/eyes.rb +203 -396
  15. data/lib/applitools/selenium/eyes_screenshot.rb +60 -0
  16. data/lib/applitools/selenium/eyes_target_locator.rb +12 -24
  17. data/lib/applitools/selenium/fixed_cut_provider.rb +48 -0
  18. data/lib/applitools/selenium/frame.rb +11 -1
  19. data/lib/applitools/selenium/frame_chain.rb +9 -1
  20. data/lib/applitools/selenium/full_page_capture_algorithm.rb +85 -50
  21. data/lib/applitools/selenium/fullpage_screenshot.rb +37 -0
  22. data/lib/applitools/selenium/keyboard.rb +2 -0
  23. data/lib/applitools/selenium/mouse.rb +2 -0
  24. data/lib/applitools/selenium/move_to_region_visibility_strategy.rb +2 -0
  25. data/lib/applitools/selenium/nop_region_visibility_strategy.rb +2 -0
  26. data/lib/applitools/selenium/region_provider.rb +91 -0
  27. data/lib/applitools/selenium/sauce/driver.rb +2 -0
  28. data/lib/applitools/selenium/scroll_position_provider.rb +13 -2
  29. data/lib/applitools/selenium/takes_screenshot_image_provider.rb +5 -3
  30. data/lib/applitools/selenium/target.rb +32 -6
  31. data/lib/applitools/selenium/viewport_screenshot.rb +46 -0
  32. data/lib/applitools/selenium/viewport_size.rb +2 -0
  33. data/lib/applitools/version.rb +3 -1
  34. data/lib/eyes_selenium.rb +4 -9
  35. metadata +16 -27
  36. data/lib/applitools/capybara.rb +0 -8
  37. data/lib/applitools/poltergeist/applitools_compatible.rb +0 -32
  38. data/lib/applitools/poltergeist/driver.rb +0 -11
  39. data/lib/applitools/selenium/capybara/capybara_settings.rb +0 -23
  40. data/lib/applitools/selenium/capybara/driver.rb +0 -37
  41. data/lib/applitools/selenium/eyes_full_page_screenshot.rb +0 -47
  42. data/lib/applitools/selenium/eyes_web_driver_screenshot.rb +0 -341
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Applitools::Selenium
2
4
  # @!visibility private
3
5
  class Keyboard
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Applitools::Selenium
2
4
  # @!visibility private
3
5
  class Mouse
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Applitools::Selenium
2
4
  class MoveToRegionVisibilityStrategy
3
5
  extend Forwardable
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Applitools::Selenium
2
4
  # @!visibility private
3
5
  class NopRegionVisibilityStrategy
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Applitools
4
+ module Selenium
5
+ class RegionProvider
6
+ FF_OLD_VERSION = '45.0'
7
+
8
+ attr_accessor :driver, :eye_region, :scroll_position_provider
9
+
10
+ def initialize(driver, eye_region)
11
+ self.driver = driver
12
+ self.eye_region = eye_region
13
+ self.scroll_position_provider = Applitools::Selenium::ScrollPositionProvider.new driver
14
+ end
15
+
16
+ def region(include_borders = true)
17
+ region = if include_borders
18
+ location = eye_region.location.offset_negative(
19
+ Applitools::Location.new(eye_region.padding_left, eye_region.padding_top)
20
+ )
21
+ size = eye_region.size.tap do |s|
22
+ s.width += eye_region.padding_left + eye_region.padding_right
23
+ s.height += eye_region.padding_top + eye_region.padding_bottom
24
+ end
25
+ Applitools::Region.from_location_size(location, size)
26
+ else
27
+ Applitools::Region.from_location_size(eye_region.location, eye_region.size)
28
+ end
29
+ if inside_a_frame?
30
+ frame_window = calculate_frame_window
31
+ return frame_window if eye_region.is_a?(Applitools::Region) && eye_region.empty?
32
+ region.location = region.location.offset(frame_window.location)
33
+ region.intersect(frame_window) unless frame_window.empty?
34
+ # exception if empty
35
+ else
36
+ region.location = region.location.offset_negative scroll_position_provider.current_position
37
+ end
38
+ return eye_region if eye_region.is_a?(Applitools::Region) && eye_region.empty?
39
+ region
40
+ end
41
+
42
+ def coordinate_type
43
+ nil
44
+ end
45
+
46
+ def calculate_frame_window
47
+ return Applitools::Region::EMPTY unless inside_a_frame?
48
+ frame_window_calculator.frame_window(driver.frame_chain)
49
+ end
50
+
51
+ private
52
+
53
+ def inside_a_frame?
54
+ !driver.frame_chain.empty?
55
+ end
56
+
57
+ def frame_window_calculator
58
+ return FirefoxFrameWindowCalculator if
59
+ driver.browser.running_browser_name == :firefox &&
60
+ (Gem::Version.new(driver.capabilities.version) <=> Gem::Version.new(FF_OLD_VERSION)) > 0
61
+ FrameWindowCalculator
62
+ end
63
+
64
+ module FrameWindowCalculator
65
+ extend self
66
+ def frame_window(frame_chain)
67
+ chain = Applitools::Selenium::FrameChain.new other: frame_chain
68
+ window = nil
69
+ frames_offset = Applitools::Location.new(0, 0)
70
+ chain.map(&:dup).each do |frame|
71
+ frames_offset = frame.location.offset(frames_offset).offset_negative(frame.parent_scroll_position)
72
+ if window.nil?
73
+ window = Applitools::Region.from_location_size(frame.location, frame.size)
74
+ else
75
+ window.intersect(Applitools::Region.from_location_size(frame.location, frame.size))
76
+ end
77
+ # exception if empty window
78
+ end
79
+ window
80
+ end
81
+ end
82
+
83
+ module FirefoxFrameWindowCalculator
84
+ extend self
85
+ def frame_window(_frame_chain)
86
+ Applitools::Region::EMPTY
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: false
2
+
1
3
  if defined? Sauce::Selenium2
2
4
  if defined? Capybara
3
5
  Sauce::Capybara::Driver.class_eval do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Applitools::Selenium
2
4
  # @!visibility private
3
5
  class ScrollPositionProvider
@@ -49,7 +51,7 @@ module Applitools::Selenium
49
51
  # Returns the entire size of the viewport.
50
52
  #
51
53
  # @return [Applitools::RectangleSize] The viewport size.
52
- def entire_size
54
+ def entire_size(image_width, image_height)
53
55
  viewport_size = Applitools::Utils::EyesSeleniumUtils.extract_viewport_size(executor)
54
56
  result = Applitools::Utils::EyesSeleniumUtils.entire_page_size(executor)
55
57
  logger.info "Entire size: #{result}"
@@ -60,7 +62,16 @@ module Applitools::Selenium
60
62
  result.width = [viewport_size.width, result.width].min if disable_horizontal
61
63
  result.height = [viewport_size.height, result.height].min if disable_vertical
62
64
  logger.info "Actual size to scroll: #{result}"
63
- result
65
+ return result unless executor.frame_chain.empty?
66
+ original_scroll_position = current_position
67
+ scroll_to_bottom_right
68
+ bottom_right_position = current_position
69
+ restore_state(original_scroll_position)
70
+ Applitools::RectangleSize.new(bottom_right_position.x + image_width, bottom_right_position.y + image_height)
71
+ end
72
+
73
+ def scroll_to_bottom_right
74
+ Applitools::Utils::EyesSeleniumUtils.scroll_to_bottom_right(executor)
64
75
  end
65
76
 
66
77
  def force_offset
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Applitools::Selenium
2
4
  # @!visibility private
3
5
  class TakesScreenshotImageProvider
@@ -10,11 +12,11 @@ module Applitools::Selenium
10
12
  #
11
13
  # @param [Applitools::Selenium::Driver] driver
12
14
  # @param [Hash] options The options for taking a screenshot.
13
- # @option options [Boolean] :debug_screenshot
15
+ # @option options [Boolean] :debug_screenshots
14
16
  # @option options [Enumerator] :name_enumerator The name enumerator.
15
17
  def initialize(driver, options = {})
16
18
  self.driver = driver
17
- options = { debug_screenshot: false }.merge! options
19
+ options = { debug_screenshots: false }.merge! options
18
20
  self.debug_screenshot_provider = options[:debug_screenshot_provider]
19
21
  end
20
22
 
@@ -32,7 +34,7 @@ module Applitools::Selenium
32
34
 
33
35
  private
34
36
 
35
- attr_accessor :debug_screenshot
37
+ attr_accessor :debug_screenshots
36
38
 
37
39
  def save_debug_screenshot(screenshot, suffix)
38
40
  debug_screenshot_provider.save(screenshot, suffix || '')
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Applitools
2
4
  module Selenium
3
5
  class Target
@@ -11,19 +13,23 @@ module Applitools
11
13
  new
12
14
  end
13
15
 
14
- def region(element)
15
- new.region(element)
16
+ def region(*args)
17
+ new.region(*args)
16
18
  end
17
19
  end
18
20
 
19
- attr_accessor :element, :frames, :region_to_check, :coordinate_type, :options, :ignored_regions, :floating_regions
21
+ attr_accessor :element, :frames, :region_to_check, :coordinate_type, :options, :ignored_regions,
22
+ :floating_regions, :frame_or_element
23
+
24
+ private :frame_or_element, :frame_or_element=
20
25
 
21
26
  # Initialize a Applitools::Selenium::Target instance.
22
27
  def initialize
23
28
  self.frames = []
24
29
  self.options = {
25
- ignore_caret: false,
26
- ignore_mismatch: false
30
+ ignore_caret: true,
31
+ ignore_mismatch: false,
32
+ send_dom: nil
27
33
  }
28
34
  reset_for_fullscreen
29
35
  end
@@ -114,11 +120,13 @@ module Applitools
114
120
 
115
121
  def fully
116
122
  options[:stitch_content] = true
123
+ handle_frames
117
124
  self
118
125
  end
119
126
 
120
127
  def frame(element)
121
- frames << element
128
+ frames << frame_or_element if frame_or_element
129
+ self.frame_or_element = element
122
130
  reset_for_fullscreen
123
131
  self
124
132
  end
@@ -135,9 +143,14 @@ module Applitools
135
143
  # @!parse def region(element, how, what); end;
136
144
 
137
145
  def region(*args)
146
+ handle_frames
138
147
  self.region_to_check = case args.first
139
148
  when Applitools::Selenium::Element, Applitools::Region, ::Selenium::WebDriver::Element
140
149
  proc { args.first }
150
+ when String
151
+ proc do |driver|
152
+ driver.find_element(name_or_id: args.first)
153
+ end
141
154
  else
142
155
  proc do |driver|
143
156
  driver.find_element(*args)
@@ -150,6 +163,13 @@ module Applitools
150
163
  self
151
164
  end
152
165
 
166
+ def finalize
167
+ return self unless frame_or_element
168
+ region = frame_or_element
169
+ self.frame_or_element = nil
170
+ dup.region(region)
171
+ end
172
+
153
173
  private
154
174
 
155
175
  def reset_for_fullscreen
@@ -169,6 +189,12 @@ module Applitools
169
189
  def reset_floating
170
190
  self.floating_regions = []
171
191
  end
192
+
193
+ def handle_frames
194
+ return unless frame_or_element
195
+ frames << frame_or_element
196
+ self.frame_or_element = nil
197
+ end
172
198
  end
173
199
  end
174
200
  end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+ require_relative 'eyes_screenshot'
3
+ module Applitools::Selenium
4
+ # @!visibility private
5
+ class ViewportScreenshot < Applitools::Selenium::EyesScreenshot
6
+ attr_accessor :top_left_location
7
+
8
+ def sub_screenshot(region, _coordinate_type, throw_if_clipped = false, force_nil_if_clipped = false)
9
+ logger.info "get_subscreenshot(#{region}, #{throw_if_clipped})"
10
+ Applitools::ArgumentGuard.not_nil region, 'region'
11
+
12
+ as_is_subscreenshot_region = region.intersect(image_region)
13
+
14
+ if as_is_subscreenshot_region.empty? || (throw_if_clipped && as_is_subscreenshot_region.size != region.size)
15
+ return nil if force_nil_if_clipped
16
+ raise Applitools::OutOfBoundsException.new "Region #{region} is out" \
17
+ ' of screenshot bounds.'
18
+ end
19
+
20
+ cropped_image = Applitools::Screenshot.from_image(
21
+ image.crop(
22
+ as_is_subscreenshot_region.x,
23
+ as_is_subscreenshot_region.y,
24
+ as_is_subscreenshot_region.width,
25
+ as_is_subscreenshot_region.height
26
+ )
27
+ )
28
+
29
+ self.class.new(cropped_image, region_provider: region_provider).tap do |s|
30
+ s.top_left_location = top_left_location.dup.offset(region.location)
31
+ end
32
+ end
33
+
34
+ def screenshot_offset
35
+ offset = Applitools::Location::TOP_LEFT.dup
36
+ offset.offset region_provider.scroll_position_provider.current_position
37
+ frame_window = region_provider.calculate_frame_window
38
+ offset.offset_negative(frame_window.location)
39
+ offset
40
+ end
41
+
42
+ def top_left_location
43
+ @top_left_location ||= screenshot_offset
44
+ end
45
+ end
46
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: false
2
+
1
3
  module Applitools::Selenium
2
4
  class ViewportSize
3
5
  JS_GET_VIEWPORT_SIZE = <<-JS.freeze
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: false
2
+
1
3
  module Applitools
2
- VERSION = '3.14.3'.freeze
4
+ VERSION = '3.14.4'.freeze
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'eyes_core'
2
4
 
3
5
  module Applitools
@@ -9,6 +11,7 @@ module Applitools
9
11
 
10
12
  module Selenium
11
13
  extend Applitools::RequireUtils
14
+ class UnsupportedCoordinateType < EyesError; end
12
15
  def self.load_dir
13
16
  File.dirname(File.expand_path(__FILE__))
14
17
  end
@@ -16,7 +19,7 @@ module Applitools
16
19
  end
17
20
 
18
21
  Applitools::Selenium.require_dir 'selenium'
19
- Applitools::Selenium.require_dir 'poltergeist'
22
+ Applitools::Selenium.require_dir 'selenium/dom_capture'
20
23
 
21
24
  if defined? Selenium::WebDriver::Driver
22
25
  Selenium::WebDriver::Driver.class_eval do
@@ -26,11 +29,3 @@ if defined? Selenium::WebDriver::Driver
26
29
  end
27
30
  end
28
31
  end
29
-
30
- if defined? Appium::Driver
31
- Appium::Driver.class_eval do
32
- def driver_for_eyes(eyes)
33
- Applitools::Selenium::Driver.new(eyes, driver: driver || start_driver, is_mobile_device: true)
34
- end
35
- end
36
- 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.14.3
4
+ version: 3.14.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Applitools Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-19 00:00:00.000000000 Z
11
+ date: 2019-01-24 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.14.3
19
+ version: 3.14.4
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.14.3
26
+ version: 3.14.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: selenium-webdriver
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -39,21 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: capybara
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: watir
42
+ name: css_parser
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - ">="
@@ -73,33 +59,36 @@ executables: []
73
59
  extensions: []
74
60
  extra_rdoc_files: []
75
61
  files:
76
- - lib/applitools/capybara.rb
77
- - lib/applitools/poltergeist/applitools_compatible.rb
78
- - lib/applitools/poltergeist/driver.rb
79
62
  - lib/applitools/selenium/border_aware_element_content_location_provider.rb
80
63
  - lib/applitools/selenium/browser.rb
81
- - lib/applitools/selenium/capybara/capybara_settings.rb
82
- - lib/applitools/selenium/capybara/driver.rb
83
64
  - lib/applitools/selenium/context_based_scale_provider.rb
65
+ - lib/applitools/selenium/css_transform/css_transform.rb
66
+ - lib/applitools/selenium/css_translate_element_position_provider.rb
84
67
  - lib/applitools/selenium/css_translate_position_provider.rb
68
+ - lib/applitools/selenium/dom_capture/dom_capture.rb
69
+ - lib/applitools/selenium/dom_capture/dom_capture_script.rb
85
70
  - lib/applitools/selenium/driver.rb
86
71
  - lib/applitools/selenium/element.rb
87
72
  - lib/applitools/selenium/element_position_provider.rb
73
+ - lib/applitools/selenium/entire_element_screenshot.rb
88
74
  - lib/applitools/selenium/eyes.rb
89
- - lib/applitools/selenium/eyes_full_page_screenshot.rb
75
+ - lib/applitools/selenium/eyes_screenshot.rb
90
76
  - lib/applitools/selenium/eyes_target_locator.rb
91
- - lib/applitools/selenium/eyes_web_driver_screenshot.rb
77
+ - lib/applitools/selenium/fixed_cut_provider.rb
92
78
  - lib/applitools/selenium/frame.rb
93
79
  - lib/applitools/selenium/frame_chain.rb
94
80
  - lib/applitools/selenium/full_page_capture_algorithm.rb
81
+ - lib/applitools/selenium/fullpage_screenshot.rb
95
82
  - lib/applitools/selenium/keyboard.rb
96
83
  - lib/applitools/selenium/mouse.rb
97
84
  - lib/applitools/selenium/move_to_region_visibility_strategy.rb
98
85
  - lib/applitools/selenium/nop_region_visibility_strategy.rb
86
+ - lib/applitools/selenium/region_provider.rb
99
87
  - lib/applitools/selenium/sauce/driver.rb
100
88
  - lib/applitools/selenium/scroll_position_provider.rb
101
89
  - lib/applitools/selenium/takes_screenshot_image_provider.rb
102
90
  - lib/applitools/selenium/target.rb
91
+ - lib/applitools/selenium/viewport_screenshot.rb
103
92
  - lib/applitools/selenium/viewport_size.rb
104
93
  - lib/applitools/version.rb
105
94
  - lib/eyes_selenium.rb
@@ -123,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
112
  version: '0'
124
113
  requirements: []
125
114
  rubyforge_project:
126
- rubygems_version: 2.6.14
115
+ rubygems_version: 2.7.7
127
116
  signing_key:
128
117
  specification_version: 4
129
118
  summary: Applitools Ruby Images SDK