class PageMagic::Element

class Element - represents an element in a html page.

for the benefit of pull review :@

Capybara::Finder

Constants

DEFAULT_HOOK
EVENT_NOT_SUPPORTED_MSG
EVENT_TYPES

Attributes

after_events[R]
before_events[R]
browser_element[R]
name[R]
parent_element[R]
type[R]

Public Class Methods

==(other) click to toggle source
# File lib/page_magic/element.rb, line 74
def ==(other)
  other <= PageMagic::Element && element_definitions == other.element_definitions
end
inherited(clazz) click to toggle source

called when class inherits this one @param [Class] clazz inheriting class

Calls superclass method
# File lib/page_magic/element.rb, line 56
def inherited(clazz)
  super
  clazz.before_events.replace(before_events)
  clazz.after_events.replace(after_events)
end
load(source) click to toggle source
# File lib/page_magic/element.rb, line 62
def load(source)
  new(Capybara::Node::Simple.new(source))
end
new(browser_element) click to toggle source
# File lib/page_magic/element.rb, line 79
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
parent_element(page_element = nil) click to toggle source

Get/Sets the parent element desribed by this class @param [Element] page_element parent page element @return [Element]

# File lib/page_magic/element.rb, line 48
def parent_element(page_element = nil)
  return @parent_page_element unless page_element

  @parent_page_element = page_element
end
watch(name, method = nil, &block) click to toggle source

Defines watchers to be used by instances @see Watchers#watch

# File lib/page_magic/element.rb, line 68
def watch(name, method = nil, &block)
  before_events do
    watch(name, method: method, &block)
  end
end

Public Instance Methods

method_missing(method, *args, &block) click to toggle source
Calls superclass method
# File lib/page_magic/element.rb, line 103
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)

    parent_element.send(method, *args, &block)
  rescue NoMethodError
    super
  end
end
respond_to_missing?(*args) click to toggle source
Calls superclass method
# File lib/page_magic/element.rb, line 115
def respond_to_missing?(*args)
  super || contains_element?(args.first) || browser_element.respond_to?(*args) || parent_element.respond_to?(*args)
end

Private Instance Methods

apply_hooks(raw_element:, capybara_method:, before_events:, after_events:) click to toggle source
# File lib/page_magic/element.rb, line 131
def apply_hooks(raw_element:, capybara_method:, before_events:, after_events:)
  original_method = raw_element.method(capybara_method)
  this = self

  raw_element.define_singleton_method(capybara_method) do |*arguments, &block|
    before_events.each { |event| this.instance_exec(&event) }
    original_method.call(*arguments, &block)
    after_events.each { |event| this.instance_exec(&event) }
  end
end
contains_element?(name) click to toggle source
# File lib/page_magic/element.rb, line 142
def contains_element?(name)
  element_definitions.keys.include?(name)
end
element_context() click to toggle source
# File lib/page_magic/element.rb, line 146
def element_context
  ElementContext.new(self)
end
wrap_events(raw_element) click to toggle source
# File lib/page_magic/element.rb, line 150
def wrap_events(raw_element)
  EVENT_TYPES.each do |action_method|
    next unless raw_element.respond_to?(action_method)

    apply_hooks(raw_element: raw_element,
                capybara_method: action_method,
                before_events: before_events,
                after_events: after_events)
  end
end