Class: Capybara::Node::Base

Inherits:
Object
  • Object
show all
Includes:
Minitest::Expectations, Actions, Finders, Matchers
Defined in:
lib/capybara/node/base.rb,
lib/capybara/minitest/spec.rb

Overview

A Base represents either an element on a page through the subclass Element or a document through Document.

Both types of Node share the same methods, used for interacting with the elements on the page. These methods are divided into three categories, finders, actions and matchers. These are found in the modules Finders, Actions and Matchers respectively.

A Session exposes all methods from Document directly:

session = Capybara::Session.new(:rack_test, my_app)
session.visit('/')
session.fill_in('Foo', with: 'Bar')    # from Capybara::Node::Actions
bar = session.find('#bar')                # from Capybara::Node::Finders
bar.select('Baz', from: 'Quox')        # from Capybara::Node::Actions
session.has_css?('#foobar')               # from Capybara::Node::Matchers

Direct Known Subclasses

Document, Element

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Matchers

#==, #assert_all_of_selectors, #assert_matches_selector, #assert_no_selector, #assert_no_text, #assert_none_of_selectors, #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_css?, #matches_selector?, #matches_xpath?, #not_matches_css?, #not_matches_selector?, #not_matches_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, #ancestor, #find, #find_button, #find_by_id, #find_field, #find_link, #first, #sibling

Constructor Details

#initialize(session, base) ⇒ Base

Returns a new instance of Base.



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

def initialize(session, base)
  @session = session
  @base = base
end

Instance Attribute Details

#baseObject (readonly)

Returns the value of attribute base.



26
27
28
# File 'lib/capybara/node/base.rb', line 26

def base
  @base
end

#query_scopeObject (readonly)

Returns the value of attribute query_scope.



26
27
28
# File 'lib/capybara/node/base.rb', line 26

def query_scope
  @query_scope
end

#sessionObject (readonly)

Returns the value of attribute session.



26
27
28
# File 'lib/capybara/node/base.rb', line 26

def session
  @session
end

Instance Method Details

#find_css(css) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



99
100
101
# File 'lib/capybara/node/base.rb', line 99

def find_css(css)
  base.find_css(css)
end

#find_xpath(xpath) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



104
105
106
# File 'lib/capybara/node/base.rb', line 104

def find_xpath(xpath)
  base.find_xpath(xpath)
end

#reloadObject

overridden in subclasses, e.g. Capybara::Node::Element



38
39
40
# File 'lib/capybara/node/base.rb', line 38

def reload
  self
end

#session_optionsObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



109
110
111
# File 'lib/capybara/node/base.rb', line 109

def session_options
  session.config
end

#synchronize(seconds = session_options.default_max_wait_time, errors: nil) ⇒ Object

This method is Capybara’s primary defence against asynchronicity problems. It works by attempting to run a given block of code until it succeeds. The exact behaviour of this method depends on a number of factors. Basically there are certain exceptions which, when raised from the block, instead of bubbling up, are caught, and the block is re-run.

Certain drivers, such as RackTest, have no support for asynchronous processes, these drivers run the block, and any error raised bubbles up immediately. This allows faster turn around in the case where an expectation fails.

Only exceptions that are ElementNotFound or any subclass thereof cause the block to be rerun. Drivers may specify additional exceptions which also cause reruns. This usually occurs when a node is manipulated which no longer exists on the page. For example, the Selenium driver specifies ‘Selenium::WebDriver::Error::ObsoleteElementError`.

As long as any of these exceptions are thrown, the block is re-run, until a certain amount of time passes. The amount of time defaults to Capybara.default_max_wait_time and can be overridden through the ‘seconds` argument. This time is compared with the system time to see how much time has passed. On rubies/platforms which don’t support access to a monotonic process clock if the return value of ‘Time.now` is stubbed out, Capybara will raise `Capybara::FrozenInTime`.

Parameters:

  • seconds (Integer) (defaults to: session_options.default_max_wait_time)

    (current sessions default_max_wait_time) Maximum number of seconds to retry this block

  • errors (Array<Exception>) (defaults to: nil)

    (driver.invalid_element_errors + [Capybara::ElementNotFound]) exception types that cause the block to be rerun

Returns:

  • (Object)

    The result of the given block

Raises:



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/capybara/node/base.rb', line 76

def synchronize(seconds = session_options.default_max_wait_time, errors: nil)
  if session.synchronized
    yield
  else
    session.synchronized = true
    start_time = Capybara::Helpers.monotonic_time
    begin
      yield
    rescue StandardError => e
      session.raise_server_error!
      raise e unless driver.wait? && catch_error?(e, errors)
      raise e if (Capybara::Helpers.monotonic_time - start_time) >= seconds
      sleep(0.05)
      raise Capybara::FrozenInTime, "Time appears to be frozen. Capybara does not work with libraries which freeze time, consider using time travelling instead" if Capybara::Helpers.monotonic_time == start_time
      reload if session_options.automatic_reload
      retry
    ensure
      session.synchronized = false
    end
  end
end

#to_capybara_nodeObject



113
114
115
# File 'lib/capybara/node/base.rb', line 113

def to_capybara_node
  self
end