Class: PageMagic::Element

Inherits:
Object
  • Object
show all
Extended by:
Forwardable, SelectorMethods, Elements
Includes:
Locators, SelectorMethods, SessionMethods, WaitMethods, Watchers
Defined in:
lib/page_magic/element.rb,
lib/page_magic/element/query.rb,
lib/page_magic/element/locators.rb,
lib/page_magic/element/selector.rb,
lib/page_magic/element/selector_methods.rb

Overview

for the benefit of pull review :@

Defined Under Namespace

Modules: Locators, SelectorMethods Classes: Query, Selector

Constant Summary collapse

EVENT_TYPES =
[:set, :select, :select_option, :unselect_option, :click].freeze
DEFAULT_HOOK =
proc {}.freeze
EVENT_NOT_SUPPORTED_MSG =
'%s event not supported'.freeze

Constants included from Elements

PageMagic::Elements::INVALID_METHOD_NAME_MSG, PageMagic::Elements::TYPES

Constants included from Watchers

Watchers::ELEMENT_MISSING_MSG

Constants included from Locators

Locators::ELEMENT_NOT_DEFINED_MSG

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from SelectorMethods

selector

Methods included from Elements

element, element_definitions

Methods included from Watchers

#changed?, #watch, #watcher, #watchers

Methods included from SessionMethods

#execute_script, #page, #path, #url

Methods included from WaitMethods

#wait_until

Methods included from Locators

#element_by_name, #element_definitions

Constructor Details

#initialize(browser_element) ⇒ Element

Returns a new instance of Element.



63
64
65
66
67
68
69
70
# File 'lib/page_magic/element.rb', line 63

def initialize(browser_element)
  @browser_element = browser_element
  @parent_element = self.class.parent_element
  @before_events = self.class.before_events
  @after_events = self.class.after_events
  @element_definitions = self.class.element_definitions.dup
  wrap_events(browser_element)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



89
90
91
92
93
94
95
96
97
98
# File 'lib/page_magic/element.rb', line 89

def method_missing(method, *args, &block)
  ElementContext.new(self).send(method, *args, &block)
rescue ElementMissingException
  begin
    return browser_element.send(method, *args, &block) if browser_element.respond_to?(method)
    return parent_element.send(method, *args, &block)
  rescue NoMethodError
    super
  end
end

Instance Attribute Details

#after_eventsObject (readonly)

Returns the value of attribute after_events.



16
17
18
# File 'lib/page_magic/element.rb', line 16

def after_events
  @after_events
end

#before_eventsObject (readonly)

Returns the value of attribute before_events.



16
17
18
# File 'lib/page_magic/element.rb', line 16

def before_events
  @before_events
end

#browser_elementObject (readonly)

Returns the value of attribute browser_element.



16
17
18
# File 'lib/page_magic/element.rb', line 16

def browser_element
  @browser_element
end

#nameObject (readonly)

Returns the value of attribute name.



16
17
18
# File 'lib/page_magic/element.rb', line 16

def name
  @name
end

#parent_elementObject (readonly)

Returns the value of attribute parent_element.



16
17
18
# File 'lib/page_magic/element.rb', line 16

def parent_element
  @parent_element
end

#typeObject (readonly)

Returns the value of attribute type.



16
17
18
# File 'lib/page_magic/element.rb', line 16

def type
  @type
end

Class Method Details

.==(other) ⇒ Object



58
59
60
# File 'lib/page_magic/element.rb', line 58

def ==(other)
  other <= PageMagic::Element && element_definitions == other.element_definitions
end

.after_eventsArray

If a block is passed in, it adds it to be run after an event is triggered on an element. See EVENT_TYPES for the

Returns:

  • (Array)

    all registered blocks



# File 'lib/page_magic/element.rb', line 19

.before_eventsObject

If a block is passed in, it adds it to be run before an event is triggered on an element.

See Also:



27
28
29
30
31
32
33
34
# File 'lib/page_magic/element.rb', line 27

%i(after_events before_events).each do |method|
  define_method method do |&block|
    instance_variable_name = "@#{method}".to_sym
    instance_variable_value = instance_variable_get(instance_variable_name) || [DEFAULT_HOOK]
    instance_variable_value << block if block
    instance_variable_set(instance_variable_name, instance_variable_value)
  end
end

.inherited(clazz) ⇒ Object

called when class inherits this one

Parameters:

  • clazz (Class)

    inheriting class



46
47
48
49
50
# File 'lib/page_magic/element.rb', line 46

def inherited(clazz)
  super
  clazz.before_events.replace(before_events)
  clazz.after_events.replace(after_events)
end

.parent_element(page_element = nil) ⇒ Element

Get/Sets the parent element desribed by this class

Parameters:

  • page_element (Element) (defaults to: nil)

    parent page element

Returns:



39
40
41
42
# File 'lib/page_magic/element.rb', line 39

def parent_element(page_element = nil)
  return @parent_page_element unless page_element
  @parent_page_element = page_element
end

.watch(name, method = nil, &block) ⇒ Object

Defines watchers to be used by instances

See Also:



54
55
56
# File 'lib/page_magic/element.rb', line 54

def watch(name, method = nil, &block)
  before_events { watch(name, method, &block) }
end

Instance Method Details

#clickObject

calls method of the same name on the underlying Capybara element

Raises:



79
80
81
82
83
84
85
86
87
# File 'lib/page_magic/element.rb', line 79

EVENT_TYPES.each do |method|
  define_method method do |*args|
    unless browser_element.respond_to?(method)
      raise NotSupportedException, EVENT_NOT_SUPPORTED_MSG % method
    end

    browser_element.send(method, *args)
  end
end

#respond_to?(*args) ⇒ Boolean

Returns:

  • (Boolean)


100
101
102
# File 'lib/page_magic/element.rb', line 100

def respond_to?(*args)
  super || contains_element?(args.first) || browser_element.respond_to?(*args) || parent_element.respond_to?(*args)
end

#selectObject

calls method of the same name on the underlying Capybara element

Raises:



79
80
81
82
83
84
85
86
87
# File 'lib/page_magic/element.rb', line 79

EVENT_TYPES.each do |method|
  define_method method do |*args|
    unless browser_element.respond_to?(method)
      raise NotSupportedException, EVENT_NOT_SUPPORTED_MSG % method
    end

    browser_element.send(method, *args)
  end
end

#select_optionObject

calls method of the same name on the underlying Capybara element

Raises:



79
80
81
82
83
84
85
86
87
# File 'lib/page_magic/element.rb', line 79

EVENT_TYPES.each do |method|
  define_method method do |*args|
    unless browser_element.respond_to?(method)
      raise NotSupportedException, EVENT_NOT_SUPPORTED_MSG % method
    end

    browser_element.send(method, *args)
  end
end

#sessionSession

get the current session

Returns:

  • (Session)

    returns the session of the parent page element. Capybara session



108
# File 'lib/page_magic/element.rb', line 108

def_delegator :parent_element, :session

#setObject

calls method of the same name on the underlying Capybara element

Raises:



79
80
81
82
83
84
85
86
87
# File 'lib/page_magic/element.rb', line 79

EVENT_TYPES.each do |method|
  define_method method do |*args|
    unless browser_element.respond_to?(method)
      raise NotSupportedException, EVENT_NOT_SUPPORTED_MSG % method
    end

    browser_element.send(method, *args)
  end
end

#unselect_optionObject

calls method of the same name on the underlying Capybara element

Raises:



79
80
81
82
83
84
85
86
87
# File 'lib/page_magic/element.rb', line 79

EVENT_TYPES.each do |method|
  define_method method do |*args|
    unless browser_element.respond_to?(method)
      raise NotSupportedException, EVENT_NOT_SUPPORTED_MSG % method
    end

    browser_element.send(method, *args)
  end
end