1
0
Fork 0
mirror of https://github.com/teampoltergeist/poltergeist.git synced 2022-11-09 12:05:00 -05:00
teampoltergeist--poltergeist/lib/capybara/poltergeist/node.rb
2013-03-03 20:38:43 +00:00

137 lines
2.5 KiB
Ruby

module Capybara::Poltergeist
class Node < Capybara::Driver::Node
NBSP = "\xC2\xA0"
NBSP.force_encoding("UTF-8") if NBSP.respond_to?(:force_encoding)
attr_reader :page_id, :id
def initialize(driver, page_id, id)
super(driver, self)
@page_id = page_id
@id = id
end
def browser
driver.browser
end
def command(name, *args)
browser.send(name, page_id, id, *args)
rescue BrowserError => error
case error.name
when 'Poltergeist.ObsoleteNode'
raise ObsoleteNode.new(self, error.response)
when 'Poltergeist.MouseEventFailed'
raise MouseEventFailed.new(self, error.response)
else
raise
end
end
def find(method, selector)
command(:find_within, method, selector).map { |id| self.class.new(driver, page_id, id) }
end
def find_xpath(selector)
find :xpath, selector
end
def find_css(selector)
find :css, selector
end
def all_text
filter_text command(:all_text)
end
def visible_text
filter_text command(:visible_text)
end
def [](name)
command :attribute, name
end
def value
command :value
end
def set(value)
if tag_name == 'input'
case self[:type]
when 'radio'
click
when 'checkbox'
click if value != checked?
when 'file'
files = value.respond_to?(:to_ary) ? value.to_ary.map(&:to_s) : value.to_s
command :select_file, files
else
command :set, value.to_s
end
elsif tag_name == 'textarea'
command :set, value.to_s
end
end
def select_option
command :select, true
end
def unselect_option
command(:select, false) or
raise(Capybara::UnselectNotAllowed, "Cannot unselect option from single select box.")
end
def tag_name
@tag_name ||= command(:tag_name)
end
def visible?
command :visible?
end
def checked?
self[:checked]
end
def selected?
self[:selected]
end
def disabled?
self[:disabled]
end
def click
command :click
end
def double_click
command :double_click
end
def hover
command :hover
end
def drag_to(other)
command :drag, other.id
end
def trigger(event)
command :trigger, event
end
def ==(other)
command :equals, other.id
end
private
def filter_text(text)
text.gsub(NBSP, ' ').gsub(/\s+/u, ' ').strip
end
end
end