class Applitools::Selenium::Target

Attributes

accessibility_regions[RW]
content_regions[RW]
convert_coordinates_block[RW]
coordinate_type[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 331
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 do |region|
    Applitools::AccessibilityRegion.new(
      region, options[:type]
    )
  end

  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
                           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 317
def before_render_screenshot_hook(hook)
  options[:script_hooks][:beforeCaptureScreenshot] = hook
  self
end
Also aliased as: script_hook
content(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 177
def content(*args)
  return match_level(Applitools::MatchLevel::CONTENT) if args.empty?
  region = process_region(*args)
  content_regions << region
  self
end
convert_coordinates(&block) click to toggle source
# File lib/applitools/selenium/target.rb, line 397
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 380
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
exact(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 191
def exact(*args)
  match_level(Applitools::MatchLevel::EXACT, *args)
end
finalize() click to toggle source
# File lib/applitools/selenium/target.rb, line 324
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 122
def floating(*args)
  requested_padding = if args.last.is_a? Applitools::PaddingBounds
                        args.pop
                      else
                        Applitools::PaddingBounds::PIXEL_PADDING
                      end
  value = case args.first
          when Applitools::FloatingRegion
            args.first.padding(requested_padding)
          when ::Applitools::Region
            Applitools::FloatingRegion.any(args.shift, *args).padding(requested_padding)
          when ::Selenium::WebDriver::Element
            proc do |driver, return_element = false|
              args_dup = args.dup
              region = applitools_element_from_selenium_element(driver, args_dup.shift)
              padding_proc = proc do |reg|
                Applitools::FloatingRegion.any(reg, *args_dup).padding(requested_padding)
              end
              next region, padding_proc if return_element
              padding_proc.call(region)
            end
          when ::Applitools::Selenium::Element
            proc do |_driver, return_element = false|
              args_dup = args.dup
              region = args_dup.shift
              padding_proc = proc do |reg|
                Applitools::FloatingRegion.any(reg, *args_dup).padding(requested_padding)
              end
              next region, padding_proc if return_element
              padding_proc.call(region)
            end
          else
            proc do |driver, return_element = false|
              args_dup = args.dup
              region = driver.find_element(args_dup.shift, args_dup.shift)
              padding_proc = proc do |reg|
                Applitools::FloatingRegion.any(
                  reg, *args_dup
                ).padding(requested_padding)
              end
              next region, padding_proc if return_element
              padding_proc.call(region)
            end
          end
  floating_regions << value
  self
end
frame(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 258
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 << 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 246
def fully(value = true)
  options[:stitch_content] = value ? true : false
  handle_frames
  self
end
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
    requested_padding = if args.last.is_a? Applitools::PaddingBounds
                          args.pop
                        else
                          Applitools::PaddingBounds::PIXEL_PADDING
                        end
    ignored_regions << case args.first
                       when Applitools::Region
                         proc { args.first.padding(requested_padding) }
                       when ::Selenium::WebDriver::Element
                         proc do |driver, return_element = false|
                           region = applitools_element_from_selenium_element(driver, args.first)
                           padding_proc = proc do |reg|
                             Applitools::Region.from_location_size(
                               reg.location, reg.size
                             ).padding(requested_padding)
                           end
                           next region, padding_proc if return_element
                           padding_proc.call(region)
                         end
                       when Applitools::Selenium::Element
                         proc do |_driver, return_element = false|
                           region = args.first
                           padding_proc = proc do |reg|
                             Applitools::Region.from_location_size(
                               reg.location, reg.size
                             ).padding(requested_padding)
                           end
                           next region, padding_proc if return_element
                           padding_proc.call(region)
                         end
                       else
                         proc do |driver, return_element = false|
                           region = driver.find_element(*args)
                           padding_proc = proc do |reg|
                             Applitools::Region.from_location_size(
                               reg.location, reg.size
                             ).padding(requested_padding)
                           end
                           next region, padding_proc if return_element
                           padding_proc.call(region)
                         end
                       end

  end
  self
end
layout(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 170
def layout(*args)
  return match_level(Applitools::MatchLevel::LAYOUT) if args.empty?
  region = process_region(*args)
  layout_regions << region
  self
end
process_region(*args) click to toggle source
# File lib/applitools/selenium/target.rb, line 201
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 282
def region(*args)
  handle_frames
  self.region_to_check = case args.first
                         when ::Selenium::WebDriver::Element
                           proc do |driver|
                             applitools_element_from_selenium_element(driver, args.first)
                           end
                         when Applitools::Selenium::Element, Applitools::Region
                           proc { args.first }
                         when String
                           proc do |driver|
                             driver.find_element(name_or_id: args.first)
                           end
                         else
                           proc do |driver|
                             driver.find_element(*args)
                           end
                         end
  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 235
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 218
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)
  end
end
script_hook(hook)
send_dom(value = true) click to toggle source
# File lib/applitools/selenium/target.rb, line 307
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 184
def strict(*args)
  return match_level(Applitools::MatchLevel::STRICT) if args.empty?
  region = process_region(*args)
  strict_regions << region
  self
end
use_dom(value = true) click to toggle source
# File lib/applitools/selenium/target.rb, line 312
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 252
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 195
def visual_grid_options(value)
  Applitools::ArgumentGuard.hash(value, 'value')
  options[:visual_grid_options] = 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
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
reset_accessibility_regions() click to toggle source
# File lib/applitools/selenium/target.rb, line 417
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_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 403
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
  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