Class: Capybara::Widgets::Widget

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

Direct Known Subclasses

Page

Class Method Summary collapse

Instance Method Summary collapse

Methods included from AsyncHelper

#eventually

Constructor Details

#initialize(*search_scope) ⇒ Widget

Returns a new instance of Widget.



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

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



88
89
90
91
92
93
94
# File 'lib/capybara/widgets/core/widget.rb', line 88

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



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

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



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

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



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

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



61
62
63
# File 'lib/capybara/widgets/core/widget.rb', line 61

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

Instance Method Details

#displayed?Boolean

Returns:

  • (Boolean)


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

def displayed?
  root.visible?
end

#element(*query) ⇒ Object



37
38
39
# File 'lib/capybara/widgets/core/widget.rb', line 37

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

#has_element?(*query) ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/capybara/widgets/core/widget.rb', line 41

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



33
34
35
# File 'lib/capybara/widgets/core/widget.rb', line 33

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



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

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