class Capybara::Widgets::Widget

Public Class Methods

component(name, klass, *query) click to toggle source
# File lib/capybara/widgets/core/widget.rb, line 76
def component(name, klass, *query)
  define_method name do |*args|
    component_root = query.length > 0 ? root.find(*resolve(*query, *args)) : root
    klass.new(component_root)
  end
  define_method "has_#{name}?".to_sym do |*args|
    root.has_selector?(*resolve(*query, *args))
  end
  define_method "has_no_#{name}?" do |*args|
    root.has_no_selector?(*resolve(*query, *args))
  end
end
element(name, *query) click to toggle source
# File lib/capybara/widgets/core/widget.rb, line 89
def element(name, *query)
  define_method("#{name}!") { |*args| root.find(*resolve(*query, *args)).click }
  define_method(name) { |*args| root.find(*resolve(*query, *args)) }
  define_method("#{name}=") { |arg| root.find(*resolve(*query)).set(arg) }
  define_method("has_#{name}?") { |*args| root.has_selector?(*resolve(*query, *args)) }
  define_method("has_no_#{name}?") { |*args| root.has_no_selector?(*resolve(*query, *args)) }
end
new(*search_scope) click to toggle source
# File lib/capybara/widgets/core/widget.rb, line 28
def initialize(*search_scope)
  case search_scope.length
    when 0
      @root = page
    when 1
      @root = search_scope[0].respond_to?(:find) ? search_scope[0] : page.find(search_scope[0])
    else
      @root = page.find(*search_scope)
  end
  @narrowed = false
end
required_component(*component_names) click to toggle source
# File lib/capybara/widgets/core/widget.rb, line 103
def required_component(*component_names)
  define_method(:components_loaded?) do
    component_names.map do |name|
      component = self.send(name)
      if component.respond_to?(:elements_loaded?)
        component.elements_loaded?
      else
        true
      end
    end.count(false) == 0
  end
end
Also aliased as: required_components
required_components(*component_names)
Alias for: required_component
required_element(*element_names) click to toggle source
# File lib/capybara/widgets/core/widget.rb, line 97
def required_element(*element_names)
  define_method(:elements_loaded?) { element_names.map { |name| self.send("has_#{name}?") }.count(false) == 0 }
end
Also aliased as: required_elements
required_elements(*element_names)
Alias for: required_element
root_element(*query) click to toggle source

override :narrow method if :root_element is used in a class

# File lib/capybara/widgets/core/widget.rb, line 69
def root_element(*query)
  define_method(:root_query) { resolve(*query) }
  define_method(:narrow) { root.find(*resolve(*query)) }
  define_method(:has_root_element?) { page.has_selector?(*resolve(*query))}
  define_method(:has_no_root_element?) { page.has_no_selector?(*resolve(*query))}
end

Public Instance Methods

method_missing(method_sym, *arguments, &block) click to toggle source

delegate missing methods to the @root node

Calls superclass method
# File lib/capybara/widgets/core/widget.rb, line 120
def method_missing(method_sym, *arguments, &block)
  if root.respond_to? method_sym
    root.send(method_sym, *arguments, &block)
  else
    super
  end
end
narrow() click to toggle source

@deprecated, use :root_element method instead

# File lib/capybara/widgets/core/widget.rb, line 51
def narrow
  @root
end
resolve(*query_with_args) click to toggle source
# File lib/capybara/widgets/core/widget.rb, line 55
def resolve(*query_with_args)
  query = query_with_args.shift
  args = query_with_args
  if query.is_a?(Proc)
    # resolve lambda selector in scope of widget instance
    return self.instance_exec(*args, &query)
  else
    return query, *args
  end
end
root() click to toggle source

running narrow only before a first call to root, useful when you want to call a method on widget that uses “page” and you don't want to run “narrow” during init

# File lib/capybara/widgets/core/widget.rb, line 42
def root
  unless @narrowed
    @narrowed = true
    @root = narrow
  end
  @root
end

Private Instance Methods

set_target_app() click to toggle source
# File lib/capybara/widgets/core/widget.rb, line 130
def set_target_app
  if Capybara.current_driver != driver || Capybara.session_name != session_name || Capybara.default_selector != default_selector
    puts "Switching target: #{driver}:#{session_name}:#{default_selector}"
    Capybara.current_driver = self.driver
    Capybara.session_name = self.session_name
    Capybara.default_selector = self.default_selector
  end
end