class Applitools::Selenium::VisualGridEyes

Constants

USE_DEFAULT_MATCH_TIMEOUT

Attributes

api_key[RW]
compare_with_parent_branch[RW]
config[RW]
current_config[RW]
current_url[RW]
debug_screenshots[RW]
disabled[RW]
dont_get_title[RW]
driver[RW]
driver_lock[RW]
enable_patterns[RW]
fetched_cache_map[RW]
opened[RW]
proxy[RW]
region_to_check[RW]
runner[RW]
save_failed_tests[RW]
scale_ratio[RW]
server_url[RW]
size_mod[RW]
stitching_overlap[RW]
test_list[RW]
test_uuid[RW]
universal_driver[RW]
universal_eyes[RW]
utils[RW]
visual_grid_manager[RW]

Public Class Methods

environment_sdk() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 56
def self.environment_sdk
  {
    name: :eyes_selenium,
    currentVersion: Applitools::EyesSelenium::VERSION
  }
end
new(visual_grid_manager, server_url = nil) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 41
def initialize(visual_grid_manager, server_url = nil)
  ensure_config
  @server_connector = Applitools::Connectivity::ServerConnector.new(server_url)
  @server_connector.obtain_agent_id do
    full_agent_id
  end
  self.server_url = server_url if server_url
  self.visual_grid_manager = visual_grid_manager
  self.test_list = Applitools::Selenium::TestList.new
  self.opened = false
  self.test_list ||= Applitools::Selenium::TestList.new
  self.driver_lock = Mutex.new
  self.utils = Applitools::Utils::EyesSeleniumUtils
end

Public Instance Methods

abort()
Alias for: abort_if_not_closed
abort_async() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 399
def abort_async
  test_list.each(&:abort)
  universal_sdk_abort
end
abort_if_not_closed() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 404
def abort_if_not_closed
  self.opened = false
  test_list.each(&:abort)
  universal_sdk_abort
end
Also aliased as: abort
add_mouse_trigger(_mouse_action, _element) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 473
def add_mouse_trigger(_mouse_action, _element); end
add_text_trigger(_control, _text) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 475
def add_text_trigger(_control, _text); end
check(*args) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 144
def check(*args)
  args.compact!
  case (first_arg = args.shift)
  when String
    tag = first_arg
    target = args.shift
  when Applitools::Selenium::Target
    target = first_arg
  when Hash
    target = first_arg[:target]
    tag = first_arg[:name] || first_arg[:tag]
  end

  render_task = nil
  target.default_full_page_for_vg

  return universal_check(tag, target)

  target_to_check = target.finalize
  begin
    check_in_frame(target_frames: target_to_check.frames) do
      sleep wait_before_screenshots
      Applitools::EyesLogger.info 'Trying to get DOM snapshot...'
      begin
        dont_fetch_resources = self.dont_fetch_resources
        enable_cross_origin_rendering = self.enable_cross_origin_rendering
        use_cookies = !self.dont_use_cookies
        urls_to_skip = visual_grid_manager.resource_cache.urls_to_skip
        dom_script = Applitools::Selenium::DomSnapshotScript.new driver

        script_dom = dom_script.create_dom_snapshot(
          dont_fetch_resources,
          urls_to_skip,
          enable_cross_origin_rendering,
          use_cookies
        )
      rescue StandardError => e
        Applitools::EyesLogger.error e.class.to_s
        Applitools::EyesLogger.error e.message
        raise ::Applitools::EyesError.new 'Error while getting dom snapshot!'
      end
      Applitools::EyesLogger.info 'Done!'

      mod = Digest::SHA2.hexdigest(script_dom.to_s)

      region_x_paths = get_regions_x_paths(target_to_check)

      render_task = RenderTask.new(
        "Render #{config.short_description} - #{tag}",
        script_dom,
        visual_grid_manager,
        server_connector,
        region_x_paths,
        size_mod,
        region_to_check,
        target_to_check.options[:script_hooks],
        config.rendering_grid_force_put,
        self.utils.user_agent(driver),
        visual_grid_options.merge(target_to_check.options[:visual_grid_options]),
        mod
      )
    end

    if size_mod == 'selector' || size_mod == 'full-selector'
      target_to_check.convert_coordinates(&Applitools::Selenium::VgMatchWindowData::CONVERT_COORDINATES)
    end

    title = begin
      driver.title
    rescue StandardError => e
      logger.warn "failed (#{e.message})"
      ''
    end

    test_list.select { |t| t.test_uuid == test_uuid }.each do |t|
      t.check(tag, target_to_check, render_task, title)
    end
    test_list.each(&:becomes_not_rendered)
    visual_grid_manager.enqueue_render_task render_task
  rescue StandardError => e
    test_list.each(&:becomes_tested)
    Applitools::EyesLogger.error e.class.to_s
    Applitools::EyesLogger.error e.message
  end
end
close(throw_exception = true) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 331
def close(throw_exception = true)
  logger.info "close(#{throw_exception})"
  logger.info 'Ending server session...'

  raise Applitools::EyesNotOpenException.new 'Eyes not open' unless open?
  universal_results = universal_eyes.close # Array even for one test
  self.opened = false
  all_results = get_results(throw_exception)
  # universal_results = universal_eyes.eyes_get_results # Array even for one test
  # # require 'pry'
  # # binding.pry
  # raise Applitools::EyesError.new("Request failed: #{universal_results[:message]}") if server_error?(universal_results)
  # results = universal_results.map {|result| Applitools::TestResults.new(result) }
  # # results = results.first if results.size == 1
  # # session_results_url = results.url
  # all_results = results.compact


  # return false if test_list.empty?
  # close_async
  #
  # until (states = test_list.map(&:state_name).uniq).count == 1 && states.first == :completed
  #   sleep 0.5
  # end
  # self.opened = false
  #
  # test_list.select { |t| t.pending_exceptions && !t.pending_exceptions.empty? }.each do |t|
  #   t.pending_exceptions.each do |e|
  #     raise e
  #   end
  # end
  #
  # all_results = test_list.map(&:test_result).compact
  # failed_results = all_results.select { |r| !r.as_expected? }
  #
  # if throw_exception
  #   all_results.each do |r|
  #     raise Applitools::NewTestError.new new_test_error_message(r), r if r.new?
  #     raise Applitools::DiffsFoundError.new diffs_found_error_message(r), r if r.unresolved? && !r.new?
  #     raise Applitools::TestFailedError.new test_failed_error_message(r), r if r.failed?
  #   end
  # end

  # failed_results.empty? ? all_results.first : failed_results.first
  all_results.first
end
close_async() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 326
def close_async
  # test_list.each(&:close)
  close(false)
end
collect_selenium_regions(target) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 244
def collect_selenium_regions(target)
  selenium_regions = {}
  target_element = target.region_to_check
  setup_size_mode(target_element, target, :none)
  target.ignored_regions.each do |r|
    selenium_regions[element_or_region(r, target, :ignore)] = :ignore
  end
  target.floating_regions.each do |r|
    selenium_regions[element_or_region(r, target, :floating)] = :floating
  end
  target.layout_regions.each do |r|
    selenium_regions[element_or_region(r, target, :layout_regions)] = :layout
  end
  target.strict_regions.each do |r|
    selenium_regions[element_or_region(r, target, :strict_regions)] = :strict
  end
  target.content_regions.each do |r|
    selenium_regions[element_or_region(r, target, :content_regions)] = :content
  end
  target.accessibility_regions.each do |r|
    case (r = element_or_region(r, target, :accessibility_regions))
    when Array
      r.each do |rr|
        selenium_regions[rr] = :accessibility
      end
    else
      selenium_regions[r] = :accessibility
    end
  end
  selenium_regions[region_to_check] = :target if size_mod == 'selector' || size_mod == 'full-selector'

  selenium_regions
end
configuration() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 461
def configuration
  config.deep_dup
end
Also aliased as: get_configuration
configuration=(value) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 465
def configuration=(value)
  Applitools::ArgumentGuard.is_a?(value, :configuration, Applitools::Selenium::Configuration)
  self.config = value.deep_dup
end
Also aliased as: set_configuration
configure() { |config| ... } click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 72
def configure
  return unless block_given?
  yield(config)
  nil
end
disabled=(value) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 477
def disabled=(value)
  @disabled = Applitools::Utils.boolean_value value
end
disabled?() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 481
def disabled?
  @disabled
end
element_or_region(target_element, target, options_key) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 310
def element_or_region(target_element, target, options_key)
  if target_element.respond_to?(:call)
    region, padding_proc = target_element.call(driver, true)
    case region
    when Array
      regions_to_replace = region.map { |r| Applitools::Selenium::VGRegion.new(r, padding_proc) }
      target.replace_region(target_element, regions_to_replace, options_key)
    else
      target.replace_region(target_element, Applitools::Selenium::VGRegion.new(region, padding_proc), options_key)
    end
    region
  else
    target_element
  end
end
ensure_config() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 63
def ensure_config
  self.config = Applitools::Selenium::Configuration.new
  self.send_dom = true
end
eyes_connector() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 136
def eyes_connector
  logger.info('Creating VisualGridEyes server connector')
  ::Applitools::Selenium::EyesConnector.new(server_url, driver_lock: driver_lock).tap do |connector|
    connector.batch = batch
    connector.config = config.deep_clone
  end
end
full_agent_id() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 68
def full_agent_id
  "eyes.selenium.visualgrid.ruby/#{Applitools::VERSION}"
end
get_all_test_results() click to toggle source

rubocop:disable Style/AccessorMethodName

# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 417
def get_all_test_results
  test_list.map(&:test_result)
end
get_configuration()
Alias for: configuration
get_regions_x_paths(target) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 230
def get_regions_x_paths(target)
  result = []
  collect_selenium_regions(target).each do |el, v|
    next unless [::Selenium::WebDriver::Element, Applitools::Selenium::Element].include?(el.class)

    xpath = driver.execute_script(Applitools::Selenium::Scripts::GET_ELEMENT_XPATH_JS, el)
    web_element_region = Applitools::Selenium::WebElementRegion.new(xpath, v)
    self.region_to_check = web_element_region.dup if v == :target && (size_mod == 'selector' || size_mod == 'full-selector')
    result << web_element_region
    target.regions[el] = result.size - 1
  end
  result
end
get_results(throw_exception = true) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 378
def get_results(throw_exception = true)
  logger.info "get_results(#{throw_exception})"
  logger.info 'Getting results...'

  universal_results = universal_eyes.eyes_get_results # Array even for one test
  # require 'pry'
  # binding.pry
  raise Applitools::EyesError.new("Request failed: #{universal_results[:message]}") if server_error?(universal_results)
  results = universal_results.map {|result| Applitools::TestResults.new(result) }
  all_results = results.compact

  if throw_exception
    all_results.each do |r|
      raise Applitools::NewTestError.new new_test_error_message(r), r if r.new?
      raise Applitools::DiffsFoundError.new diffs_found_error_message(r), r if r.unresolved? && !r.new?
      raise Applitools::TestFailedError.new test_failed_error_message(r), r if r.failed?
    end
  end
  all_results
end
get_viewport_size(web_driver = driver) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 123
def get_viewport_size(web_driver = driver)
  Applitools::ArgumentGuard.not_nil 'web_driver', web_driver
  # self.utils.extract_viewport_size(driver)
  driver_config_json = universal_driver_config(web_driver)

  Applitools::EyesLogger.debug 'extract_viewport_size()'
  viewport_size = runner.universal_client.core_get_viewport_size(driver_config_json)
  result = Applitools::RectangleSize.new viewport_size[:width], viewport_size[:height]

  Applitools::EyesLogger.debug "Viewport size is #{result}."
  result
end
open(*args) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 78
def open(*args)
  # visual_grid_manager.add_batch(batch.id) { visual_grid_manager.close_batch(batch.id) }
  # self.test_uuid = SecureRandom.uuid
  options = Applitools::Utils.extract_options!(args)
  universal_open(options)
  # Applitools::ArgumentGuard.hash(options, 'options', [:driver])
  #
  # config.app_name = options[:app_name] if options[:app_name]
  # config.test_name = options[:test_name] if options[:test_name]
  # config.agent_run_id = "#{config.test_name}--#{SecureRandom.hex(10)}"
  #
  # if config.viewport_size.nil? || config.viewport_size && config.viewport_size.empty?
  #   config.viewport_size = Applitools::RectangleSize.from_any_argument(options[:viewport_size]) if options[:viewport_size]
  # end
  #
  # self.driver = Applitools::Selenium::SeleniumEyes.eyes_driver(options.delete(:driver), self)
  # self.current_url = driver.current_url
  #
  # if viewport_size
  #   set_viewport_size(viewport_size)
  # else
  #   self.viewport_size = get_viewport_size
  # end
  #
  # visual_grid_manager.open(self)
  # visual_grid_manager.add_batch(batch.id) do
  #   server_connector.close_batch(batch.id)
  # end
  #
  # logger.info('Getting all browsers info...')
  # browsers_info_list = config.browsers_info
  # logger.info('Creating test descriptors for each browser info...')
  # browsers_info_list.each(viewport_size) do |bi|
  #   test = Applitools::Selenium::RunningTest.new(eyes_connector, bi, driver).tap do |t|
  #     t.on_results_received do |results|
  #       visual_grid_manager.aggregate_result(results)
  #     end
  #     t.test_uuid = test_uuid
  #   end
  #   test_list.push test
  # end
  # self.opened = true
  # driver
end
open?() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 412
def open?
  opened
end
server_connector() click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 454
def server_connector
  @server_connector.server_url = config.server_url
  @server_connector.api_key = config.api_key
  @server_connector.proxy = config.proxy if config.proxy
  @server_connector
end
set_configuration(value)
Alias for: configuration=
set_viewport_size(value) click to toggle source

rubocop:disable Style/AccessorMethodName

# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 423
def set_viewport_size(value)
  # require('pry')
  # binding.pry
  self.utils.set_viewport_size driver, value
rescue => e
  logger.error e.class.to_s
  logger.error e.message
  raise Applitools::TestFailedError.new "#{e.class} - #{e.message}"
end
setup_size_mode(target_element, target, key) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 278
def setup_size_mode(target_element, target, key)
  self.size_mod = 'full-page'

  element_or_region = element_or_region(target_element, target, key)

  self.size_mod = case element_or_region
                  when ::Selenium::WebDriver::Element, Applitools::Selenium::Element
                    if target.options[:stitch_content]
                      'full-selector'
                    else
                      'selector'
                    end
                  when Applitools::Region
                    if element_or_region == Applitools::Region::EMPTY
                      if target.options[:stitch_content]
                        'full-page'
                      else
                        element_or_region = Applitools::Region.from_location_size(
                          Applitools::Location::TOP_LEFT, viewport_size
                        )
                        'region'
                      end
                    else
                      'region'
                    end
                  else
                    'full-page'
                  end

  self.region_to_check = element_or_region
end

Private Instance Methods

diffs_found_error_message(result) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 441
def diffs_found_error_message(result)
  original_results = result.original_results
  "Test '#{original_results['name']}' " \
      "of '#{original_results['appname']}' " \
      "detected differences! See details at #{original_results['appUrls']['session']}"
end
ensure_frame_visible(*_args) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 489
def ensure_frame_visible(*_args); end
new_test_error_message(result) click to toggle source

rubocop:enable Style/AccessorMethodName

# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 434
def new_test_error_message(result)
  original_results = result.original_results
  "New test '#{original_results['name']}' " \
      "of '#{original_results['appName']}' " \
      "Please approve the baseline at #{original_results['appUrls']['session']} "
end
reset_frames_scroll_position(*_args) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 491
def reset_frames_scroll_position(*_args); end
test_failed_error_message(result) click to toggle source
# File lib/applitools/selenium/visual_grid/visual_grid_eyes.rb, line 448
def test_failed_error_message(result)
  original_results = result.original_results
  "Test '#{original_results['name']}' of '#{original_results['appName']}' " \
      "is failed! See details at #{original_results['appUrls']['session']}"
end