class Capybara::Node::Element
A {Capybara::Node::Element} represents a single element on the page. It is possible to interact with the contents of this element the same as with a document:
session = Capybara::Session.new(:rack_test, my_app) bar = session.find('#bar') # from Capybara::Node::Finders bar.select('Baz', from: 'Quox') # from Capybara::Node::Actions
{Capybara::Node::Element} also has access to HTML attributes and other properties of the element:
bar.value bar.text bar[:title]
@see Capybara::Node
Public Class Methods
# File lib/capybara/node/element.rb, line 25 def initialize(session, base, query_scope, query) super(session, base) @query_scope = query_scope @query = query @allow_reload = false end
Public Instance Methods
Retrieve the given attribute
element[:title] # => HTML title attribute
@param [Symbol] attribute The attribute to retrieve @return [String] The value of the attribute
# File lib/capybara/node/element.rb, line 76 def [](attribute) synchronize { base[attribute] } end
# File lib/capybara/node/element.rb, line 32 def allow_reload! @allow_reload = true end
Whether or not the element is checked.
@return [Boolean] Whether the element is checked
# File lib/capybara/node/element.rb, line 270 def checked? synchronize { base.checked? } end
Click the Element
@!macro click_modifiers
@overload $0(*key_modifiers=[], offset={x: nil, y: nil}) @param [Array<:alt, :control, :meta, :shift>] *key_modifiers Keys to be held down when clicking @param [Hash] offset x and y coordinates to offset the click location from the top left corner of the element. If not specified will click the middle of the element.
@return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 132 def click(*keys, **offset) synchronize { base.click(keys, offset) } self end
Whether or not the element is disabled.
@return [Boolean] Whether the element is disabled
# File lib/capybara/node/element.rb, line 290 def disabled? synchronize { base.disabled? } end
Double Click the Element
@macro click_modifiers @return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 154 def double_click(*keys, **offset) synchronize { base.double_click(keys, offset) } self end
Drag the element to the given other element.
source = page.find('#foo') target = page.find('#bar') source.drag_to(target)
@param [Capybara::Node::Element] node The element to drag to
@return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 348 def drag_to(node) synchronize { base.drag_to(node.base) } self end
Hover on the Element
@return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 240 def hover synchronize { base.hover } self end
# File lib/capybara/node/element.rb, line 365 def inspect %(#<Capybara::Node::Element tag="#{base.tag_name}" path="#{base.path}">) rescue NotSupportedByDriverError %(#<Capybara::Node::Element tag="#{base.tag_name}">) rescue => e raise unless session.driver.invalid_element_errors.any? { |et| e.is_a?(et) } %(Obsolete #<Capybara::Node::Element>) end
Whether or not the element supports multiple results.
@return [Boolean] Whether the element supports multiple results.
# File lib/capybara/node/element.rb, line 310 def multiple? synchronize { base.multiple? } end
@return [Object] The native element from the driver, this allows access to driver specific methods
# File lib/capybara/node/element.rb, line 40 def native synchronize { base.native } end
Whether or not the element is readonly.
@return [Boolean] Whether the element is readonly
# File lib/capybara/node/element.rb, line 300 def readonly? synchronize { base.readonly? } end
# File lib/capybara/node/element.rb, line 353 def reload if @allow_reload begin reloaded = query_scope.reload.first(@query.name, @query.locator, @query.options) @base = reloaded.base if reloaded rescue => e raise e unless catch_error?(e) end end self end
Right Click the Element
@macro click_modifiers @return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 143 def right_click(*keys, **offset) synchronize { base.right_click(keys, offset) } self end
Select this node if is an option element inside a select tag
@return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 107 def select_option warn "Attempt to select disabled option: #{value || text}" if disabled? synchronize { base.select_option } self end
Whether or not the element is selected.
@return [Boolean] Whether the element is selected
# File lib/capybara/node/element.rb, line 280 def selected? synchronize { base.selected? } end
Send Keystrokes to the Element
@overload #send_keys(keys, …)
@param [String, Symbol, Array<String,Symbol>] keys
Examples:
element.send_keys "foo" #=> value: 'foo' element.send_keys "tet", :left, "s" #=> value: 'test' element.send_keys [:control, 'a'], :space #=> value: ' ' - assuming ctrl-a selects all contents
Symbols supported for keys :cancel :help :backspace :tab :clear :return :enter :shift :control :alt :pause :escape :space :page_up :page_down :end :home :left :up :right :down :insert :delete :semicolon :equals :numpad0 :numpad1 :numpad2 :numpad3 :numpad4 :numpad5 :numpad6 :numpad7 :numpad8 :numpad9 :multiply - numeric keypad * :add - numeric keypad + :separator - numeric keypad 'separator' key ?? :subtract - numeric keypad - :decimal - numeric keypad . :divide - numeric keypad / :f1 :f2 :f3 :f4 :f5 :f6 :f7 :f8 :f9 :f10 :f11 :f12 :meta :command - alias of :meta
@return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 230 def send_keys(*args) synchronize { base.send_keys(*args) } self end
Set the value of the form element to the given value.
@param [String] value The new value @param [Hash{}] options Driver specific options for how to set the value
@return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 96 def set(value, **options) raise Capybara::ReadOnlyElementError, "Attempt to set readonly element with value: #{value}" if readonly? synchronize { base.set(value, options) } self end
@return [String] The tag name of the element
# File lib/capybara/node/element.rb, line 249 def tag_name synchronize { base.tag_name } end
Retrieve the text of the element. If `Capybara.ignore_hidden_elements` is `true`, which it is by default, then this will return only text which is visible. The exact semantics of this may differ between drivers, but generally any text within elements with `display:none` is ignored. This behaviour can be overridden by passing `:all` to this method.
@param [:all, :visible] type Whether to return only visible or all text @return [String] The text of the element
# File lib/capybara/node/element.rb, line 56 def text(type = nil) type ||= :all unless session_options.ignore_hidden_elements or session_options.visible_text_only synchronize do if type == :all base.all_text else base.visible_text end end end
Trigger any event on the current element, for example mouseover or focus events. Does not work in Selenium.
@param [String] event The name of the event to trigger
@return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 332 def trigger(event) synchronize { base.trigger(event) } self end
Unselect this node if is an option element inside a multiple select tag
@return [Capybara::Node::Element] The element
# File lib/capybara/node/element.rb, line 118 def unselect_option synchronize { base.unselect_option } self end
@return [String] The value of the form element
# File lib/capybara/node/element.rb, line 84 def value synchronize { base.value } end
Whether or not the element is visible. Not all drivers support CSS, so the result may be inaccurate.
@return [Boolean] Whether the element is visible
# File lib/capybara/node/element.rb, line 260 def visible? synchronize { base.visible? } end