class Applitools::Selenium::DomSnapshotScript::RecursiveSnapshotter

Constants

POLL_INTERVAL_MS

Attributes

cross_origin_rendering[RW]
driver[RW]
script[RW]
should_skip_failed_frames[RW]
use_cookies[RW]

Public Class Methods

new(driver, script, cross_origin_rendering, use_cookies) click to toggle source
# File lib/applitools/selenium/visual_grid/dom_snapshot_script.rb, line 101
def initialize(driver, script, cross_origin_rendering, use_cookies)
  self.should_skip_failed_frames = true
  self.driver = driver
  self.script = script
  self.cross_origin_rendering = cross_origin_rendering
  self.use_cookies = use_cookies
end

Public Instance Methods

create_cross_frames_dom_snapshots() click to toggle source
# File lib/applitools/selenium/visual_grid/dom_snapshot_script.rb, line 109
def create_cross_frames_dom_snapshots
  dom = create_dom_snapshot_threaded
  process_dom_snapshot_frames dom
  dom
end
create_dom_snapshot_threaded() click to toggle source
# File lib/applitools/selenium/visual_grid/dom_snapshot_script.rb, line 115
def create_dom_snapshot_threaded
  script.run
end
process_dom_snapshot_frames(dom) click to toggle source
# File lib/applitools/selenium/visual_grid/dom_snapshot_script.rb, line 119
def process_dom_snapshot_frames dom
  dom["cookies"] = driver.manage.all_cookies if use_cookies

  dom["frames"].each do |frame|
    selector = frame['selector']
    unless selector
      Applitools::EyesLogger.warn "inner frame with null selector"
      next
    end
    begin
      original_frame_chain = driver.frame_chain
      frame_element = driver.find_element(:css, selector)
      frame_src = frame_element.attribute('src')
      Applitools::EyesLogger.info "process_dom_snapshot_frames src = #{frame_src}"
      driver.switch_to.frame(frame_element)

      process_dom_snapshot_frames frame

      driver.switch_to.default_content
      unless original_frame_chain.empty?
        driver.switch_to.frames frame_chain: original_frame_chain
      end
    rescue StandardError => e
      Applitools::EyesLogger.error e.class.to_s
      Applitools::EyesLogger.error e.message
      if should_skip_failed_frames
        Applitools::EyesLogger.warn "failed switching to frame #{selector}"
      else
        raise ::Applitools::EyesError.new 'failed switching to frame'
      end
    end
  end

  self.snapshot_and_process_cors_frames(dom) if self.cross_origin_rendering
end
snapshot_and_process_cors_frames(dom) click to toggle source
# File lib/applitools/selenium/visual_grid/dom_snapshot_script.rb, line 155
def snapshot_and_process_cors_frames(dom)
  dom["crossFrames"].each do |frame|
    selector = frame['selector']
    unless selector
      Applitools::EyesLogger.warn "cross frame with null selector"
      next
    end
    frame_index = frame['index']
    begin
      original_frame_chain = driver.frame_chain
      frame_element = driver.find_element(:css, selector) #
      frame_src = frame_element.attribute('src')
      Applitools::EyesLogger.info "snapshot_and_process_cors_frames src = #{frame_src}"
      driver.switch_to.frame(frame_element)

      frame_dom = create_cross_frames_dom_snapshots
      dom['frames'] ||= []
      dom['frames'].push frame_dom
      frame_url = frame_dom['url']
      dom['cdt'][frame_index]['attributes'].push({ 'name' => 'data-applitools-src', 'value' => frame_url })
      Applitools::EyesLogger.info "Created cross origin frame snapshot #{frame_url}"
      process_dom_snapshot_frames frame_dom

      driver.switch_to.default_content
      unless original_frame_chain.empty?
        driver.switch_to.frames(frame_chain: original_frame_chain)
      end
    rescue StandardError => e
      Applitools::EyesLogger.error e.class.to_s
      Applitools::EyesLogger.error e.message
      if should_skip_failed_frames
        Applitools::EyesLogger.warn "failed extracting and processing cross frame #{selector}"
      else
        raise ::Applitools::EyesError.new 'failed switching to frame'
      end
    end
  end
end