mirror of
https://github.com/thoughtbot/capybara-webkit
synced 2023-03-27 23:22:28 -04:00
6945ed52c7
Fixes Capybara::Webkit::InvalidResponseError when nodes are missing.
156 lines
2.9 KiB
Ruby
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
|