Class: Capybara::Widgets::Widget

Inherits:
Object
  • Object
show all
Includes:
DSL
Defined in:
lib/capybara/widgets/core/widget.rb

Direct Known Subclasses

Page

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*search_scope) ⇒ Widget

Returns a new instance of Widget.



8
9
10
11
12
13
14
15
16
17
18
# File 'lib/capybara/widgets/core/widget.rb', line 8

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

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_sym, *arguments, &block) ⇒ Object

delegate missing methods to the @root node



82
83
84
85
86
87
88
# File 'lib/capybara/widgets/core/widget.rb', line 82

def method_missing(method_sym, *arguments, &block)
  if root.respond_to? method_sym
    root.send(method_sym, *arguments, &block)
  else
    super
  end
end

Class Method Details

.component(name, klass, *query) ⇒ Object



44
45
46
47
48
49
# File 'lib/capybara/widgets/core/widget.rb', line 44

def component(name, klass, *query)
  define_method name do
    component_root = query.length > 0 ? root.find(*query) : root
    klass.new(component_root)
  end
end

.element(name, *query) ⇒ Object



51
52
53
54
55
56
57
# File 'lib/capybara/widgets/core/widget.rb', line 51

def element(name, *query)
  define_method("#{name}!") { root.find(*query).click }
  define_method(name) { root.find(*query) }
  define_method("#{name}=") { |arg| root.find(*query).set(arg) }
  define_method("has_#{name}?") { |*args| root.has_selector?(*query, *args) }
  define_method("has_no_#{name}?") { |*args| root.has_no_selector?(*query, *args) }
end

.required_component(*component_names) ⇒ Object Also known as: required_components



65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/capybara/widgets/core/widget.rb', line 65

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

.required_element(*element_names) ⇒ Object Also known as: required_elements



59
60
61
# File 'lib/capybara/widgets/core/widget.rb', line 59

def required_element(*element_names)
  define_method(:elements_loaded?) { element_names.map { |name| self.send("has_#{name}?") }.count(false) == 0 }
end

Instance Method Details

#element(*query) ⇒ Object



35
36
37
# File 'lib/capybara/widgets/core/widget.rb', line 35

def element(*query)
  root.find(*query)
end

#has_element?(*query) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
# File 'lib/capybara/widgets/core/widget.rb', line 39

def has_element?(*query)
  root.has_selector?(*query)
end

#narrowObject

override this method if you need to narrow down search context for a particular UI widget / block



31
32
33
# File 'lib/capybara/widgets/core/widget.rb', line 31

def narrow
  @root
end

#rootObject

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



22
23
24
25
26
27
28
# File 'lib/capybara/widgets/core/widget.rb', line 22

def root
  unless @narrowed
    @narrowed = true
    @root = narrow
  end
  @root
end