class Applitools::Selenium::Target
Attributes
Public Class Methods
# File lib/applitools/selenium/target.rb, line 9 def frame(element) new.frame(element) end
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
# File lib/applitools/selenium/target.rb, line 17 def region(*args) new.region(*args) end
# File lib/applitools/selenium/target.rb, line 13 def window new end
Public Instance Methods
# 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
# 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
# File lib/applitools/selenium/target.rb, line 103 def content(*args) region = region_from_args(args) content_regions << region if region self end
# File lib/applitools/selenium/target.rb, line 353 def convert_coordinates(&block) self.convert_coordinates_block = block end
# 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
# 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
# File lib/applitools/selenium/target.rb, line 115 def exact(*args) match_level(Applitools::MatchLevel::EXACT, *args) end
# 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
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
# 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
# File lib/applitools/selenium/target.rb, line 172 def fully(value = true) options[:stitch_content] = value ? true : false handle_frames self end
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
# File lib/applitools/selenium/target.rb, line 97 def layout(*args) region = region_from_args(args) layout_regions << region if region self end
# 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
# 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
# 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
# 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
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
# 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
# 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
# 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
# File lib/applitools/selenium/target.rb, line 221 def send_dom(value = true) options[:send_dom] = value ? true : false self end
# File lib/applitools/selenium/target.rb, line 109 def strict(*args) region = region_from_args(args) strict_regions << region if region self end
# File lib/applitools/selenium/target.rb, line 226 def use_dom(value = true) options[:use_dom] = value ? true : false self end
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# 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
# File lib/applitools/selenium/target.rb, line 413 def reset_accessibility_regions self.accessibility_regions = [] end
# File lib/applitools/selenium/target.rb, line 433 def reset_content_regions self.content_regions = [] end
# File lib/applitools/selenium/target.rb, line 417 def reset_dynamic_regions self.dynamic_regions = [] end
# File lib/applitools/selenium/target.rb, line 425 def reset_floating self.floating_regions = [] end
# 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
# File lib/applitools/selenium/target.rb, line 421 def reset_ignore self.ignored_regions = [] end
# File lib/applitools/selenium/target.rb, line 429 def reset_layout_regions self.layout_regions = [] end
# File lib/applitools/selenium/target.rb, line 437 def reset_strict_regions self.strict_regions = [] end