Class: Capybara::Node::Element

Inherits:
Base
  • Object
show all
Defined in:
lib/capybara/node/element.rb

Overview

A 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

Element also has access to HTML attributes and other properties of the element:

bar.value
bar.text
bar[:title]

See Also:

Instance Attribute Summary

Attributes inherited from Base

#base, #parent, #session

Instance Method Summary collapse

Methods inherited from Base

#find_css, #find_xpath, #synchronize

Methods included from Matchers

#==, #assert_no_selector, #assert_no_text, #assert_selector, #assert_text, #has_button?, #has_checked_field?, #has_css?, #has_field?, #has_link?, #has_no_button?, #has_no_checked_field?, #has_no_css?, #has_no_field?, #has_no_link?, #has_no_select?, #has_no_selector?, #has_no_table?, #has_no_text?, #has_no_unchecked_field?, #has_no_xpath?, #has_select?, #has_selector?, #has_table?, #has_text?, #has_unchecked_field?, #has_xpath?

Methods included from Actions

#attach_file, #check, #choose, #click_button, #click_link, #click_link_or_button, #fill_in, #select, #uncheck, #unselect

Methods included from Finders

#all, #find, #find_button, #find_by_id, #find_field, #find_link, #first

Constructor Details

#initialize(session, base, parent, query) ⇒ Element

Returns a new instance of Element.



25
26
27
28
29
# File 'lib/capybara/node/element.rb', line 25

def initialize(session, base, parent, query)
  super(session, base)
  @parent = parent
  @query = query
end

Instance Method Details

#[](attribute) ⇒ String

Retrieve the given attribute

element[:title] # => HTML title attribute

Parameters:

  • attribute (Symbol)

    The attribute to retrieve

Returns:

  • (String)

    The value of the attribute



75
76
77
# File 'lib/capybara/node/element.rb', line 75

def [](attribute)
  synchronize { base[attribute] }
end

#allow_reload!Object



31
32
33
# File 'lib/capybara/node/element.rb', line 31

def allow_reload!
  @allow_reload = true
end

#checked?Boolean

Whether or not the element is checked.

Returns:

  • (Boolean)

    Whether the element is checked



260
261
262
# File 'lib/capybara/node/element.rb', line 260

def checked?
  synchronize { base.checked? }
end

#clickObject

Click the Element



133
134
135
# File 'lib/capybara/node/element.rb', line 133

def click
  synchronize { base.click }
end

#disabled?Boolean

Whether or not the element is disabled.

Returns:

  • (Boolean)

    Whether the element is disabled



280
281
282
# File 'lib/capybara/node/element.rb', line 280

def disabled?
  synchronize { base.disabled? }
end

#double_clickObject

Double Click the Element



149
150
151
# File 'lib/capybara/node/element.rb', line 149

def double_click
  synchronize { base.double_click }
end

#drag_to(node) ⇒ Object

Drag the element to the given other element.

source = page.find('#foo')
target = page.find('#bar')
source.drag_to(target)

Parameters:



315
316
317
# File 'lib/capybara/node/element.rb', line 315

def drag_to(node)
  synchronize { base.drag_to(node.base) }
end

#hoverObject

Hover on the Element



231
232
233
# File 'lib/capybara/node/element.rb', line 231

def hover
  synchronize { base.hover }
end

#inspectObject



331
332
333
334
335
# File 'lib/capybara/node/element.rb', line 331

def inspect
  %(#<Capybara::Node::Element tag="#{tag_name}" path="#{path}">)
rescue NotSupportedByDriverError
  %(#<Capybara::Node::Element tag="#{tag_name}">)
end

#nativeObject

Returns The native element from the driver, this allows access to driver specific methods.

Returns:

  • (Object)

    The native element from the driver, this allows access to driver specific methods



39
40
41
# File 'lib/capybara/node/element.rb', line 39

def native
  synchronize { base.native }
end

#pathString

An XPath expression describing where on the page the element can be found

Returns:

  • (String)

    An XPath expression



290
291
292
# File 'lib/capybara/node/element.rb', line 290

def path
  synchronize { base.path }
end

#reloadObject



319
320
321
322
323
324
325
326
327
328
329
# File 'lib/capybara/node/element.rb', line 319

def reload
  if @allow_reload
    begin
      reloaded = parent.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_clickObject

Right Click the Element



141
142
143
# File 'lib/capybara/node/element.rb', line 141

def right_click
  synchronize { base.right_click }
end

#select_optionObject

Select this node if is an option element inside a select tag



116
117
118
119
# File 'lib/capybara/node/element.rb', line 116

def select_option
  warn "Attempt to select disabled option: #{value || text}" if disabled?
  synchronize { base.select_option }
end

#selected?Boolean

Whether or not the element is selected.

Returns:

  • (Boolean)

    Whether the element is selected



270
271
272
# File 'lib/capybara/node/element.rb', line 270

def selected?
  synchronize { base.selected? }
end

#send_keys(keys, ...) ⇒ Object

Send Keystrokes to the Element

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

Parameters:

  • keys (String, Symbol, Array<String,Symbol>)


223
224
225
# File 'lib/capybara/node/element.rb', line 223

def send_keys(*args)
  synchronize { base.send_keys(*args) }
end

#set(value, options = {}) ⇒ Object

Set the value of the form element to the given value.

Parameters:

  • value (String)

    The new value

  • options (Hash{}) (defaults to: {})

    Driver specific options for how to set the value



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/capybara/node/element.rb', line 94

def set(value, options={})
  options ||= {}

  driver_supports_options = (base.method(:set).arity != 1)

  unless options.empty? || driver_supports_options
    warn "Options passed to Capybara::Node#set but the driver doesn't support them"
  end

  synchronize do
    if driver_supports_options
      base.set(value, options)
    else
      base.set(value)
    end
  end
end

#tag_nameString

Returns The tag name of the element.

Returns:

  • (String)

    The tag name of the element



239
240
241
# File 'lib/capybara/node/element.rb', line 239

def tag_name
  synchronize { base.tag_name }
end

#text(type = nil) ⇒ String

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.

Parameters:

  • type (:all, :visible) (defaults to: nil)

    Whether to return only visible or all text

Returns:

  • (String)

    The text of the element



55
56
57
58
59
60
61
62
63
64
# File 'lib/capybara/node/element.rb', line 55

def text(type=nil)
  type ||= :all unless Capybara.ignore_hidden_elements or Capybara.visible_text_only
  synchronize do
    if type == :all
      base.all_text
    else
      base.visible_text
    end
  end
end

#trigger(event) ⇒ Object

Trigger any event on the current element, for example mouseover or focus events. Does not work in Selenium.

Parameters:

  • event (String)

    The name of the event to trigger



301
302
303
# File 'lib/capybara/node/element.rb', line 301

def trigger(event)
  synchronize { base.trigger(event) }
end

#unselect_optionObject

Unselect this node if is an option element inside a multiple select tag



125
126
127
# File 'lib/capybara/node/element.rb', line 125

def unselect_option
  synchronize { base.unselect_option }
end

#valueString

Returns The value of the form element.

Returns:

  • (String)

    The value of the form element



83
84
85
# File 'lib/capybara/node/element.rb', line 83

def value
  synchronize { base.value }
end

#visible?Boolean

Whether or not the element is visible. Not all drivers support CSS, so the result may be inaccurate.

Returns:

  • (Boolean)

    Whether the element is visible



250
251
252
# File 'lib/capybara/node/element.rb', line 250

def visible?
  synchronize { base.visible? }
end