Class: Applitools::Selenium::Driver
- Inherits:
-
SimpleDelegator
- Object
- SimpleDelegator
- Applitools::Selenium::Driver
- Extended by:
- Forwardable
- Defined in:
- lib/applitools/selenium/driver.rb
Constant Summary collapse
- RIGHT_ANGLE =
90
- FINDERS =
Available finders
{ class: 'class name', class_name: 'class name', css: 'css', id: 'id', link: 'link text', link_text: 'link text', name: 'name', partial_link_text: 'partial link text', tag_name: 'tag name', xpath: 'xpath' }.freeze
Instance Attribute Summary collapse
-
#browser ⇒ Object
readonly
Returns the value of attribute browser.
-
#rotation ⇒ Object
Returns the value of attribute rotation.
Class Method Summary collapse
- .normalize_image(driver, image, rotation) ⇒ Object
-
.normalize_rotation(driver, image, rotation) ⇒ Object
Rotates the image as necessary.
- .normalize_width(driver, image) ⇒ Object
Instance Method Summary collapse
-
#default_content_viewport_size(force_query = false) ⇒ Applitools::RectangleSize
Gets
default_content_viewport_size
. -
#execute_script(*args) ⇒ Object
Executes javascript in browser context.
-
#find_element(how, what) ⇒ Applitools::Selenium::Element
Finds an element in a window.
- #find_element_by_name_or_id(name_or_id) ⇒ Object
-
#find_elements(how, what) ⇒ [Applitools::Selenium::Element]
Finds elements in a window.
-
#frame_chain ⇒ Applitools::Selenium::FrameChain
Returns a copy of current frame chain.
-
#frame_chain! ⇒ Object
Returns current frame chain.
-
#hide_scrollbars ⇒ Object
Hide the main document’s scrollbars and returns the original overflow value.
-
#initialize(eyes, options) ⇒ Driver
constructor
Initializes a class instance.
-
#landscape_orientation? ⇒ Boolean
Returns
true
if the driver orientation is landscape. -
#mobile_device? ⇒ Boolean
Returns
true
if the platform running the test is a mobile platform. -
#overflow=(overflow) ⇒ Object
(also: #set_overflow)
Set the overflow value for document element and return the original overflow value.
-
#remote_web_driver ⇒ Object
Returns native driver.
-
#screenshot_as(format) {|png_screenshot| ... } ⇒ String
Takes a screenshot.
- #switch_to ⇒ Object
- #universal_driver_config ⇒ Object
Constructor Details
#initialize(eyes, options) ⇒ Driver
Initializes a class instance.
If driver is not provided, Applitools::Selenium::Driver will raise an EyesError exception.
55 56 57 58 59 60 61 62 |
# File 'lib/applitools/selenium/driver.rb', line 55 def initialize(eyes, ) super([:driver]) @is_mobile_device = .fetch(:is_mobile_device, false) @eyes = eyes @frame_chain = Applitools::Selenium::FrameChain.new @browser = Applitools::Selenium::Browser.new(self, @eyes) Applitools::EyesLogger.warn '"screenshot_as" method not found!' unless driver.respond_to? :screenshot_as end |
Instance Attribute Details
#browser ⇒ Object (readonly)
Returns the value of attribute browser.
41 42 43 |
# File 'lib/applitools/selenium/driver.rb', line 41 def browser @browser end |
#rotation ⇒ Object
Returns the value of attribute rotation.
42 43 44 |
# File 'lib/applitools/selenium/driver.rb', line 42 def rotation @rotation end |
Class Method Details
.normalize_image(driver, image, rotation) ⇒ Object
342 343 344 345 |
# File 'lib/applitools/selenium/driver.rb', line 342 def normalize_image(driver, image, rotation) normalize_rotation(driver, image, rotation) normalize_width(driver, image) end |
.normalize_rotation(driver, image, rotation) ⇒ Object
Rotates the image as necessary. The rotation is either manually forced by passing a value in the rotation
parameter, or automatically inferred if the rotation
parameter is nil
.
driver
-
Applitools::Selenium::Driver
The driver which produced the screenshot. image
-
ChunkyPNG::Canvas
The image to normalize. rotation
-
Integer
|nil
The degrees by which to rotate the image: positive values = clockwise rotation,
negative values = counter-clockwise, 0 = force no rotation, +nil+ = rotate automatically when needed.
354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 |
# File 'lib/applitools/selenium/driver.rb', line 354 def normalize_rotation(driver, image, rotation) return if rotation && rotation.zero? num_quadrants = 0 if !rotation.nil? if (rotation % RIGHT_ANGLE).nonzero? raise Applitools::EyesError.new('Currently only quadrant rotations are supported. Current rotation: '\ "#{rotation}") end num_quadrants = (rotation / RIGHT_ANGLE).to_i elsif rotation.nil? && driver.mobile_device? && driver.landscape_orientation? && image.height > image.width # For Android, we need to rotate images to the right, and for iOS to the left. num_quadrants = driver.android? ? 1 : -1 end Applitools::Utils::ImageUtils.quadrant_rotate!(image, num_quadrants) end |
.normalize_width(driver, image) ⇒ Object
372 373 374 375 376 377 |
# File 'lib/applitools/selenium/driver.rb', line 372 def normalize_width(driver, image) return if driver.mobile_device? normalization_factor = driver.browser.image_normalization_factor(image) Applitools::Utils::ImageUtils.scale!(image, normalization_factor) unless normalization_factor == 1 end |
Instance Method Details
#default_content_viewport_size(force_query = false) ⇒ Applitools::RectangleSize
Gets default_content_viewport_size
.
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 |
# File 'lib/applitools/selenium/driver.rb', line 216 def (force_query = false) logger.info('default_content_viewport_size()') if && !force_query logger.info "Using cached viewport_size #{}" return end current_frames = frame_chain switch_to.default_content unless current_frames.empty? logger.info 'Extracting viewport size...' @cached_default_content_viewport_size = utils.(self) logger.info "Done! Viewport size is #{@cached_default_content_viewport_size}" switch_to.frames(frame_chain: current_frames) unless current_frames.empty? @cached_default_content_viewport_size end |
#execute_script(*args) ⇒ Object
Executes javascript in browser context.
67 68 69 |
# File 'lib/applitools/selenium/driver.rb', line 67 def execute_script(*args) raises_error { __getobj__.execute_script(*args) } end |
#find_element(how, what) ⇒ Applitools::Selenium::Element
Finds an element in a window.
149 150 151 152 153 154 155 156 |
# File 'lib/applitools/selenium/driver.rb', line 149 def find_element(*args) how, what = extract_args(args) return find_element_by_name_or_id(what) if how == :name_or_id # Make sure that "how" is a valid locator. raise ArgumentError, "cannot find element by: #{how.inspect}" unless FINDERS[how.to_sym] Applitools::Selenium::Element.new(self, driver.find_element(how, what)) end |
#find_element_by_name_or_id(name_or_id) ⇒ Object
158 159 160 161 162 |
# File 'lib/applitools/selenium/driver.rb', line 158 def find_element_by_name_or_id(name_or_id) found_by_name = find_elements name: name_or_id return found_by_name.first unless found_by_name.empty? find_element id: name_or_id end |
#find_elements(how, what) ⇒ [Applitools::Selenium::Element]
Finds elements in a window.
179 180 181 182 183 184 185 |
# File 'lib/applitools/selenium/driver.rb', line 179 def find_elements(*args) how, what = extract_args(args) raise ArgumentError, "cannot find element by: #{how.inspect}" unless FINDERS[how.to_sym] driver.find_elements(how, what).map { |el| Applitools::Selenium::Element.new(self, el) } end |
#frame_chain ⇒ Applitools::Selenium::FrameChain
Returns a copy of current frame chain. Frame chain stores information about all parent frames,
including scroll offset an frame coordinates.
201 202 203 |
# File 'lib/applitools/selenium/driver.rb', line 201 def frame_chain Applitools::Selenium::FrameChain.new other: @frame_chain end |
#frame_chain! ⇒ Object
Returns current frame chain. Frame chain stores information about all parent frames,
including scroll offset an frame coordinates
207 208 209 |
# File 'lib/applitools/selenium/driver.rb', line 207 def frame_chain! @frame_chain end |
#hide_scrollbars ⇒ Object
Hide the main document’s scrollbars and returns the original overflow value.
102 103 104 |
# File 'lib/applitools/selenium/driver.rb', line 102 def @browser. end |
#landscape_orientation? ⇒ Boolean
Returns true
if the driver orientation is landscape.
87 88 89 90 91 92 |
# File 'lib/applitools/selenium/driver.rb', line 87 def landscape_orientation? driver.orientation.to_s.upcase == LANDSCAPE rescue NameError, Selenium::WebDriver::Error::WebDriverError, Selenium::WebDriver::Error::UnknownError Applitools::EyesLogger.debug 'driver has no "orientation" attribute. Assuming: portrait.' false end |
#mobile_device? ⇒ Boolean
Returns true
if the platform running the test is a mobile platform. false
otherwise.
95 96 97 98 99 |
# File 'lib/applitools/selenium/driver.rb', line 95 def mobile_device? # We CAN'T check if the device is an +Appium::Driver+ since it is not a RemoteWebDriver. Because of that we use a # flag we got as an option in the constructor. @is_mobile_device end |
#overflow=(overflow) ⇒ Object Also known as: set_overflow
Set the overflow value for document element and return the original overflow value.
107 108 109 |
# File 'lib/applitools/selenium/driver.rb', line 107 def overflow=(overflow) @browser.set_overflow(overflow) end |
#remote_web_driver ⇒ Object
Returns native driver
114 115 116 |
# File 'lib/applitools/selenium/driver.rb', line 114 def remote_web_driver driver end |
#screenshot_as(format) {|png_screenshot| ... } ⇒ String
Takes a screenshot.
124 125 126 127 128 129 130 131 132 |
# File 'lib/applitools/selenium/driver.rb', line 124 def screenshot_as(format) raise "Invalid format (#{format}) passed! Available formats: :png, :base64" unless [:base64, :png].include? format png_screenshot = driver.screenshot_as(:png) yield png_screenshot if block_given? screenshot = Applitools::Screenshot.from_any_image(png_screenshot) self.class.normalize_rotation(self, screenshot, rotation) return Applitools::Utils::ImageUtils.base64_from_png_image(screenshot.restore) if format == :base64 screenshot.to_blob end |
#switch_to ⇒ Object
233 234 235 236 237 |
# File 'lib/applitools/selenium/driver.rb', line 233 def switch_to @switch_to ||= Applitools::Selenium::EyesTargetLocator.new( self, driver.switch_to, FrameChangeEventListener.new(self) ) end |
#universal_driver_config ⇒ Object
239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 |
# File 'lib/applitools/selenium/driver.rb', line 239 def universal_driver_config if respond_to?(:session_id) { serverUrl: server_url, sessionId: session_id, capabilities: capabilities.as_json } else { serverUrl: server_url, sessionId: bridge.session_id, capabilities: capabilities.as_json } end end |