1
0
Fork 0
mirror of https://github.com/thoughtbot/capybara-webkit synced 2023-03-27 23:22:28 -04:00
capybara-webkit/lib/capybara/webkit/node.rb
Kohei Suzuki 6945ed52c7 Check node index atomically to prevent race condition
Fixes Capybara::Webkit::InvalidResponseError when nodes are missing.
2013-12-06 10:43:17 -05:00

156 lines
2.9 KiB
Ruby

module Capybara::Webkit
class Node < Capybara::Driver::Node
def visible_text
Capybara::Helpers.normalize_whitespace(invoke("text"))
end
alias_method :text, :visible_text
def all_text
Capybara::Helpers.normalize_whitespace(invoke("allText"))
end
def [](name)
value = invoke("attribute", name)
if name == 'checked' || name == 'disabled' || name == 'multiple'
value == 'true'
else
if invoke("hasAttribute", name) == 'true'
value
else
nil
end
end
end
def value
if multiple_select?
self.find_xpath(".//option").select(&:selected?).map(&:value)
else
invoke "value"
end
end
def inner_html
invoke 'getInnerHTML'
end
def inner_html=(value)
invoke 'setInnerHTML', value
end
def set(value)
invoke "set", *[value].flatten
end
def select_option
invoke "selectOption"
end
def unselect_option
select = find_xpath("ancestor::select").first
if select.multiple_select?
invoke "unselectOption"
else
raise Capybara::UnselectNotAllowed
end
end
def click
invoke("leftClick")
end
def double_click
invoke("doubleClick")
end
def right_click
invoke("rightClick")
end
def hover
invoke("hover")
end
def drag_to(element)
invoke 'dragTo', element.native
end
def tag_name
invoke "tagName"
end
def visible?
invoke("visible") == "true"
end
def selected?
invoke("selected") == "true"
end
def checked?
self['checked']
end
def disabled?
if %w(option optgroup).include? tag_name
self['disabled'] || find_xpath("parent::*")[0].disabled?
else
self['disabled']
end
end
def path
invoke "path"
end
def submit(opts = {})
invoke "submit"
end
def trigger(event)
invoke "trigger", event
end
def find_xpath(xpath)
invoke("findXpathWithin", xpath).split(',').map do |native|
self.class.new(driver, native)
end
end
alias_method :find, :find_xpath
def find_css(selector)
invoke("findCssWithin", selector).split(',').map do |native|
self.class.new(driver, native)
end
end
def invoke(name, *args)
browser.command "Node", name, allow_unattached_nodes?, native, *args
end
def allow_unattached_nodes?
!automatic_reload?
end
def automatic_reload?
Capybara.respond_to?(:automatic_reload) && Capybara.automatic_reload
end
def attached?
browser.command("Node", "isAttached", native) == "true"
end
def browser
driver.browser
end
def multiple_select?
self.tag_name == "select" && self["multiple"]
end
def ==(other)
invoke("equals", other.native) == "true"
end
end
end