class Applitools::Selenium::Target

Attributes

accessibility_regions[RW]
content_regions[RW]
convert_coordinates_block[RW]
coordinate_type[RW]
dynamic_regions[RW]
element[RW]
floating_regions[RW]
frame_or_element[RW]
frames[RW]
ignored_regions[RW]
layout_regions[RW]
options[RW]
region_to_check[RW]
regions[RW]
strict_regions[RW]

Public Class Methods

frame(element) click to toggle source
# File lib/applitools/selenium/target.rb, line 9
def frame(element)
  new.frame(element)
end
new() click to toggle source

Initialize a Applitools::Selenium::Target instance.

# File lib/applitools/selenium/target.rb, line 29
def initialize
  self.frames = []
  self.options = {
    ignore_mismatch: false,
    script_hooks: { beforeCaptureScreenshot: '' },
    visual_grid_options: {}
  }
  self.regions = {}
  self.convert_coordinates_block = nil
  reset_for_fullscreen
end
region(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 17
def region(*args)
  new.region(*args)
end
window() click to toggle source
# File lib/applitools/selenium/target.rb, line 13
def window
  new
end

Public Instance Methods

accessibility(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 250
def accessibility(*args)
  options = Applitools::Utils.extract_options! args
  unless options[:type]
    raise Applitools::EyesError,
      'You should call Target.accessibility(region, type: type). The :type option is required'
  end
  unless Applitools::AccessibilityRegionType.enum_values.include?(options[:type])
    raise Applitools::EyesIllegalArgument,
      "The region type should be one of [#{Applitools::AccessibilityRegionType.enum_values.join(', ')}]"
  end
  handle_frames
  padding_proc = proc { |region| Applitools::AccessibilityRegion.new(region, options[:type]) }

  accessibility_regions << case args.first
    when ::Selenium::WebDriver::Element
      proc do |driver, return_element = false|
        element = applitools_element_from_selenium_element(driver, args.first)
        next element, padding_proc if return_element
        padding_proc.call(element)
    end
    when Applitools::Selenium::Element
      proc do |_driver, return_element = false|
        next args.first, padding_proc if return_element
        padding_proc.call(args.first)
      end
    when Applitools::Region
      Applitools::AccessibilityRegion.new(
        args.first, options[:type]
      )
    when String
      proc do |driver, return_element = false|
        element = driver.find_element(name_or_id: args.first)
        next element, padding_proc if return_element
        padding_proc.call(element)
      end
    when :css
      { region: args[1], type: options[:type] }
    else
      proc do |driver, return_element = false|
        elements = driver.find_elements(*args)
        next elements, padding_proc if return_element
        elements.map { |e| padding_proc.call(e) }
      end
    end
  self
end
before_render_screenshot_hook(hook) click to toggle source
# File lib/applitools/selenium/target.rb, line 231
def before_render_screenshot_hook(hook)
  if hook.is_a?(Hash) && hook[:beforeCaptureScreenshot]
    options[:script_hooks] = hook
  else
    options[:script_hooks][:beforeCaptureScreenshot] = hook
  end
  self
end
Also aliased as: script_hook, hooks
content(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 103
def content(*args)
  region = region_from_args(args)
  content_regions << region if region
  self
end
convert_coordinates(&block) click to toggle source
# File lib/applitools/selenium/target.rb, line 353
def convert_coordinates(&block)
  self.convert_coordinates_block = block
end
default_full_page_for_vg() click to toggle source
# File lib/applitools/selenium/target.rb, line 336
def default_full_page_for_vg
  # if options[:stitch_content].nil?
  #   case region_to_check
  #   when nil
  #     fully(true)
  #   when Proc
  #     begin
  #       r = region_to_check.call
  #       # fully(true) if r == Applitools::Region::EMPTY
  #     rescue StandardError
  #       fully(false)
  #     end
  #   end
  # end
  nil
end
dynamic(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 297
def dynamic(*args)
  options = Applitools::Utils.extract_options! args
  handle_frames
  padding_proc = proc { |region| Applitools::DynamicRegion.new(region, options[:type]) }

  dynamic_regions << case args.first
    when ::Selenium::WebDriver::Element
      proc do |driver, return_element = false|
        element = applitools_element_from_selenium_element(driver, args.first)
        next element, padding_proc if return_element
        padding_proc.call(element)
      end
    when Applitools::Selenium::Element
      proc do |_driver, return_element = false|
        next args.first, padding_proc if return_element
        padding_proc.call(args.first)
      end
    when Applitools::Region
      Applitools::DynamicRegion.new(
        args.first, options[:type]
      )
    when String
      proc do |driver, return_element = false|
        element = driver.find_element(name_or_id: args.first)
        next element, padding_proc if return_element
        padding_proc.call(element)
      end
    when :css
      { region: args[1], type: options[:type] }
    else
      proc do |driver, return_element = false|
        elements = driver.find_elements(*args)
        next elements, padding_proc if return_element
        elements.map { |e| padding_proc.call(e) }
      end
    end
  self
end
exact(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 115
def exact(*args)
  match_level(Applitools::MatchLevel::EXACT, *args)
end
finalize() click to toggle source
# File lib/applitools/selenium/target.rb, line 243
def finalize
  return self unless frame_or_element
  region = frame_or_element
  self.frame_or_element = nil
  dup.region(region)
end
floating(*args) click to toggle source

Sets the wanted floating region @param region_or_element [Applitools::FloatingRegion, Selenium::WebDriver::Element, Applitools::Selenium::Element, Applitools::Region] @param bounds [Applitools::FloatingBounds] @!parse def floating(region_or_element, bounds, padding); end; @param left [Integer] @param top [Integer] @param right [Integer] @param bottom [Integer] @param padding [Applitools::PaddingBounds] @example

target.floating(:id, 'my_id', 10, 10, 10, 10)

@example

target.floating(:id, 'my_id', Applitools::FloatingBounds.new(10, 10, 10, 10))

@example

target.floating(region, Applitools::FloatingBounds.new(10, 10, 10, 10))

@example

target.floating(floating_region)

@example

target.floating(floating_region, bounds)

@example

target.floating(:id, 'my_id', Applitools::FloatingBounds.new(10, 10, 10, 10), Applitools::PaddingBounds.new(10, 10, 10, 10))

@!parse def floating(region_or_element, bounds, left,top, right, bottom, padding); end;

# File lib/applitools/selenium/target.rb, line 81
def floating(*args)
  options = Applitools::Utils.extract_options!(args)
  padding = options && options[:padding]
  requested_padding = get_requested_padding(padding, args)
  bounds = get_bounds(args)
  value = convert_to_universal(args)
  value = { type: args[0], selector: args[1] } if value.nil?
  value = value[:selector] if value.is_a?(Hash) && (value[:type].to_s === 'id')
  region = { region: value }
  region.merge!(bounds) if bounds != {}
  region.merge!(padding: requested_padding) if requested_padding != {}
  region.merge!(regionId: options[:region_id]) if options[:region_id]
  floating_regions << region
  self
end
frame(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 184
def frame(*args)
  element = case args.first
            when ::Selenium::WebDriver::Element, Applitools::Selenium::Element, String
              args.first
            else
              proc { |d| d.find_element(*args) }
            end
  frames << element
  # frames << frame_or_element if frame_or_element
  # self.frame_or_element = element
  reset_for_fullscreen
  self
end
fully(value = true) click to toggle source
# File lib/applitools/selenium/target.rb, line 172
def fully(value = true)
  options[:stitch_content] = value ? true : false
  handle_frames
  self
end
hooks(hook)
ignore(*args) click to toggle source

Add the wanted ignored regions.

@param [Applitools::Selenium::Element, Applitools::Region, ::Selenium::WebDriver::Element] region_or_element the region to ignore or an element representing the region to ignore @param [Symbol, String] how A finder to be used (see Selenium::WebDriver documentation for complete list of available finders) @param [Symbol, String] what An id or selector to find @!parse def ignore(region_or_element, how, what, padding = Applitools::PaddingBounds::PIXEL_PADDING); end;

# File lib/applitools/selenium/target.rb, line 48
def ignore(*args)
  if args.empty?
    reset_ignore
  else
    region = region_from_args(args)
    ignored_regions << region if region
  end
  self
end
layout(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 97
def layout(*args)
  region = region_from_args(args)
  layout_regions << region if region
  self
end
layout_breakpoints(value = true) click to toggle source
# File lib/applitools/selenium/target.rb, line 370
def layout_breakpoints(value = true)
  if value.is_a?(Hash) && (value.has_key?(:breakpoints) || value.has_key?('breakpoints'))
    options[:layout_breakpoints] = value
  else
    options[:layout_breakpoints] = { breakpoints: value }
  end
  self
end
lazy_load(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 391
def lazy_load(*args) # scroll_length, waiting_time, max_amount_to_scroll
  options[:lazy_load] = args.is_a?(Hash) ? args : true
  self
end
page_id(value) click to toggle source
# File lib/applitools/selenium/target.rb, line 385
def page_id(value)
  Applitools::ArgumentGuard.not_nil(value, 'page_id')
  options[:page_id] = value
  self
end
process_region(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 125
def process_region(*args)
  r = args.first
  case r
  when ::Selenium::WebDriver::Element
    proc do |driver|
      applitools_element_from_selenium_element(driver, args.dup.first)
    end
  when Applitools::Region, Applitools::Selenium::Element
    proc { r }
  else
    proc do |driver|
      args_dup = args.dup
      driver.find_element(args_dup.shift, args_dup.shift)
    end
  end
end
region(*args) click to toggle source

Add the desired region. @param [Applitools::Selenium::Element, Applitools::Region, ::Selenium::WebDriver::Element] element the target region or an element representing the target region @param [Symbol, String] how The finder to be used (:css, :id, etc. see Selenium::WebDriver documentation for complete list of available finders) @param [Symbol, String] what Selector or id of an element @example Add region by element

target.region(an_element)

@example Add target region by finder

target.region(:id, 'target_region')

@return [Applitools::Selenium::Target] A Target instance. @!parse def region(element, how, what); end;

# File lib/applitools/selenium/target.rb, line 209
def region(*args)
  value = convert_to_universal(args)
  value = { type: args[0], selector: args[1] } if value.nil?
  value = value[:selector] if value.is_a?(Hash) && (value[:type].to_s === 'id')
  self.region_to_check = value
  self.coordinate_type = Applitools::EyesScreenshot::COORDINATE_TYPES[:context_relative]
  options[:timeout] = nil
  reset_ignore
  reset_floating
  self
end
replace_element(original, new, array) click to toggle source
# File lib/applitools/selenium/target.rb, line 161
def replace_element(original, new, array)
  case new
  when Array
    index = array.index(original)
    array.delete_at(index)
    array.insert(index, *new)
  when Applitools::Selenium::VGRegion
    array[array.index(original)] = new
  end
end
replace_region(original_region, new_region, key) click to toggle source
# File lib/applitools/selenium/target.rb, line 142
def replace_region(original_region, new_region, key)
  case key
  when :content_regions
    replace_element(original_region, new_region, content_regions)
  when :strict_regions
    replace_element(original_region, new_region, strict_regions)
  when :layout_regions
    replace_element(original_region, new_region, layout_regions)
  when :floating
    replace_element(original_region, new_region, floating_regions)
  when :ignore
    replace_element(original_region, new_region, ignored_regions)
  when :accessibility_regions
    replace_element(original_region, new_region, accessibility_regions)
  when :dynamic_regions
    replace_element(original_region, new_region, dynamic_regions)
  end
end
script_hook(hook)
scroll_root_element(by, what = nil) click to toggle source
# File lib/applitools/selenium/target.rb, line 357
def scroll_root_element(by, what = nil)
  options[:scroll_root_element] = if is_element?(by)
    ref = by.ref
    ref = by.ref[1] if ref.is_a?(Array) && ref[0] === :element
    { elementId: ref }
  elsif what
    { type: by.to_s, selector: what }
  else
    by
  end
  self
end
send_dom(value = true) click to toggle source
# File lib/applitools/selenium/target.rb, line 221
def send_dom(value = true)
  options[:send_dom] = value ? true : false
  self
end
strict(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 109
def strict(*args)
  region = region_from_args(args)
  strict_regions << region if region
  self
end
use_dom(value = true) click to toggle source
# File lib/applitools/selenium/target.rb, line 226
def use_dom(value = true)
  options[:use_dom] = value ? true : false
  self
end
variation_group_id(value) click to toggle source
# File lib/applitools/selenium/target.rb, line 178
def variation_group_id(value)
  Applitools::ArgumentGuard.not_nil(value, 'variation_group_id')
  options[:variation_group_id] = value
  self
end
visual_grid_options(value) click to toggle source
# File lib/applitools/selenium/target.rb, line 119
def visual_grid_options(value)
  Applitools::ArgumentGuard.hash(value, 'value')
  options[:visual_grid_options] = value
  self
end
wait_before_capture(value) click to toggle source
# File lib/applitools/selenium/target.rb, line 379
def wait_before_capture(value)
  Applitools::ArgumentGuard.not_nil(value, 'wait_before_capture')
  options[:wait_before_capture] = value
  self
end

Private Instance Methods

applitools_element_from_selenium_element(driver, selenium_element) click to toggle source
# File lib/applitools/selenium/target.rb, line 447
def applitools_element_from_selenium_element(driver, selenium_element)
  xpath = driver.execute_script(Applitools::Selenium::Scripts::GET_ELEMENT_XPATH_JS, selenium_element)
  driver.find_element(:xpath, xpath)
end
convert_to_universal(args) click to toggle source
# File lib/applitools/selenium/target.rb, line 504
def convert_to_universal(args)
  if is_element?(args.first)
    ref = args.first.ref
    ref = args.first.ref[1] if ref.is_a?(Array) && ref[0] === :element
    return { elementId: ref }
  end
  return args.first.to_hash if is_region?(args.first)
  if is_finder?(args)
    if Applitools::Selenium::Driver::FINDERS.has_key?(args[0])
      selector = args[1]
      selector = "##{args[1]}" if args[0] === :id && !args[1].start_with?('#') && instance_of?(Applitools::Selenium::Target)
      return {type: Applitools::Selenium::Driver::FINDERS[args[0]], selector: selector}
    end
    case args[0]
      when :uiautomator # ANDROID_UI_AUTOMATOR: '-android uiautomator'
        return {type: '-android uiautomator', selector: args[1]}
      when :predicate # IOS_PREDICATE: '-ios predicate string',
        return {type: '-ios predicate string', selector: args[1]}
      when :accessibility_id
        return {type: 'accessibility id', selector: args[1]}
    end
  end
  if args.first.is_a?(String)
    return proc { |driver| driver.find_element(name_or_id: args.first) }
  end
  if args.first.is_a?(Hash) && args.first.has_key?('selector')
    if args.first.has_key?('shadow')
      return {selector: args.first['selector'], shadow: args.first['shadow']}
    else
      return {selector: args.first['selector']}
    end
  end
  nil
end
get_bounds(args) click to toggle source
# File lib/applitools/selenium/target.rb, line 464
def get_bounds(args)
  return args.pop.to_hash if args.last.is_a?(Applitools::FloatingBounds)
  last4 = args.last(4)
  if last4.size === 4 && last4.all? { |e| e.is_a?(Numeric) }
    FloatingBounds.new(*last4).to_hash
  else
    {}
  end
end
get_requested_padding(padding, args) click to toggle source
# File lib/applitools/selenium/target.rb, line 452
def get_requested_padding(padding, args)
  return padding.to_hash if padding && padding.is_a?(Applitools::PaddingBounds)
  return padding if padding && (padding.is_a?(Hash) || padding.is_a?(Numeric))
  if args.last.is_a? Applitools::PaddingBounds
    args.pop
  # elsif args.last.is_a?(Applitools::FloatingBounds)
  #   args.pop.to_hash
  else
    {}
  end
end
handle_frames() click to toggle source
# File lib/applitools/selenium/target.rb, line 441
def handle_frames
  return unless frame_or_element
  frames << frame_or_element
  self.frame_or_element = nil
end
is_element?(el) click to toggle source
# File lib/applitools/selenium/target.rb, line 489
def is_element?(el)
  el.is_a?(::Selenium::WebDriver::Element) || (el.is_a?(Applitools::Selenium::Element) && el.respond_to?(:ref))
end
is_finder?(finders) click to toggle source
# File lib/applitools/selenium/target.rb, line 497
def is_finder?(finders)
  return false unless finders.is_a?(Array)
  return false unless finders[1]
  return true if [:uiautomator, :predicate, :accessibility_id].include?(finders[0].to_sym)
  Applitools::Selenium::Driver::FINDERS.has_key?(finders[0].to_sym)
end
is_region?(region) click to toggle source
# File lib/applitools/selenium/target.rb, line 493
def is_region?(region)
  region.is_a?(Applitools::FloatingRegion) || region.is_a?(Applitools::Region) # || region.is_a?(Applitools::Selenium::Element)
end
region_from_args(args) click to toggle source
# File lib/applitools/selenium/target.rb, line 474
def region_from_args(args)
  options = Applitools::Utils.extract_options!(args)
  padding = options && options[:padding]
  requested_padding = get_requested_padding(padding, args)
  value = convert_to_universal(args)
  value = { type: args[0], selector: args[1] } if value.nil?
  value = value[:selector] if value.is_a?(Hash) && (value[:type].to_s === 'id')
  return nil if value === {selector: nil, type: nil}
  region = { region: value }
  region.merge!(padding: requested_padding) if requested_padding != {}
  region.merge!(regionId: options[:region_id]) if options[:region_id]
  region
end
reset_accessibility_regions() click to toggle source
# File lib/applitools/selenium/target.rb, line 413
def reset_accessibility_regions
  self.accessibility_regions = []
end
reset_content_regions() click to toggle source
# File lib/applitools/selenium/target.rb, line 433
def reset_content_regions
  self.content_regions = []
end
reset_dynamic_regions() click to toggle source
# File lib/applitools/selenium/target.rb, line 417
def reset_dynamic_regions
  self.dynamic_regions = []
end
reset_floating() click to toggle source
# File lib/applitools/selenium/target.rb, line 425
def reset_floating
  self.floating_regions = []
end
reset_for_fullscreen() click to toggle source
# File lib/applitools/selenium/target.rb, line 398
def reset_for_fullscreen
  self.coordinate_type = nil
  self.region_to_check = proc { Applitools::Region::EMPTY }
  reset_ignore
  reset_floating
  reset_content_regions
  reset_layout_regions
  reset_strict_regions
  reset_accessibility_regions
  reset_dynamic_regions
  options[:stitch_content] = nil
  options[:timeout] = nil
  options[:trim] = false
end
reset_ignore() click to toggle source
# File lib/applitools/selenium/target.rb, line 421
def reset_ignore
  self.ignored_regions = []
end
reset_layout_regions() click to toggle source
# File lib/applitools/selenium/target.rb, line 429
def reset_layout_regions
  self.layout_regions = []
end
reset_strict_regions() click to toggle source
# File lib/applitools/selenium/target.rb, line 437
def reset_strict_regions
  self.strict_regions = []
end