module Howitzer::Web::IframeDsl::ClassMethods

This module holds frame dsl class methods

Protected Instance Methods

iframe(name, *args) click to toggle source

Creates a group of methods to interact with described HTML frame on page @note This method generates following dynamic methods:

<b><em>frame_name</em>_iframe</b> - equals capybara #within_frame(...) method

<b>has_<em>frame_name</em>_iframe?</b> - equals capybara #has_selector(...) method

<b>has_no_<em>frame_name</em>_iframe?</b> - equals capybara #has_no_selector(...) method

@param name [Symbol, String] an unique iframe name @param args [Array] original Capybara arguments. For details, see ‘Capybara::Session#within_frame`. @raise [NameError] if page class can not be found @example Using in a page class

class FbPage < Howitzer::Web::Page
  element :like, :xpath, ".//*[text()='Like']"
  def like
    like_element.click
  end

  def liked?
    #some code here
  end
end

module Utils
  class GroupFbPage < Howitzer::Web::Page
  end
end

class HomePage < Howitzer::Web::Page
  iframe :fb, 1

 # frame with explicit class declaration
 # iframe :fb, FbPage, 1

 # frame with namespace
  iframe :utils_group_fb
end

HomePage.on do
  fb_iframe do |frame|
    frame.like
    expect(frame).to be_liked
  end
end
HomePage.on { is_expected.to have_fb_iframe }

@!visibility public

# File lib/howitzer/web/iframe_dsl.rb, line 85
def iframe(name, *args)
  raise ArgumentError, 'iframe selector arguments must be specified' if args.blank?

  klass = args.first.is_a?(Class) ? args.shift : find_matching_class(name)
  raise NameError, "class can not be found for #{name} iframe" if klass.blank?

  define_iframe(klass, name, args)
  define_has_iframe(name, args)
  define_has_no_iframe(name, args)
end

Private Instance Methods

define_has_iframe(name, args) click to toggle source
# File lib/howitzer/web/iframe_dsl.rb, line 107
def define_has_iframe(name, args)
  define_method("has_#{name}_iframe?") do |**params|
    capybara_context.has_selector?(*iframe_element_selector(args, params))
  end
end
define_has_no_iframe(name, args) click to toggle source
# File lib/howitzer/web/iframe_dsl.rb, line 113
def define_has_no_iframe(name, args)
  define_method("has_no_#{name}_iframe?") do |**params|
    capybara_context.has_no_selector?(*iframe_element_selector(args, params))
  end
end
define_iframe(klass, name, args) click to toggle source
# File lib/howitzer/web/iframe_dsl.rb, line 98
def define_iframe(klass, name, args)
  define_method "#{name}_iframe" do |**params, &block|
    capybara_context.within_frame(*convert_iframe_arguments(args, params)) do
      klass.displayed?
      block.call klass.instance
    end
  end
end
find_matching_class(name) click to toggle source
# File lib/howitzer/web/iframe_dsl.rb, line 119
def find_matching_class(name)
  Howitzer::Web::Page.descendants.select { |el| el.name.underscore.tr('/', '_') == "#{name}_page" }
                     .max_by { |el| el.name.count('::') }
end