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_matches_selector, #assert_no_selector, #assert_no_text, #assert_not_matches_selector, #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?, #matches_selector?, #not_matches_selector?

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.



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

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



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

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

#allow_reload!Object



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

def allow_reload!
  @allow_reload = true
end

#checked?Boolean

Whether or not the element is checked.

Returns:

  • (Boolean)

    Whether the element is checked



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

def checked?
  synchronize { base.checked? }
end

#clickObject

Click the Element



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

def click
  synchronize { base.click }
end

#disabled?Boolean

Whether or not the element is disabled.

Returns:

  • (Boolean)

    Whether the element is disabled



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

def disabled?
  synchronize { base.disabled? }
end

#double_clickObject

Double Click the Element



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

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:



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

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

#hoverObject

Hover on the Element



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

def hover
  synchronize { base.hover }
end

#inspectObject



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

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



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

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



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

def path
  synchronize { base.path }
end

#reloadObject



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

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



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

def right_click
  synchronize { base.right_click }
end

#select_optionObject

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



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

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



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

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>)


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

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



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

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



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

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



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

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



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

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

#unselect_optionObject

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



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

def unselect_option
  synchronize { base.unselect_option }
end

#valueString

Returns The value of the form element.

Returns:

  • (String)

    The value of the form element



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

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



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

def visible?
  synchronize { base.visible? }
end