Module: Capybara
Constant Summary
-
VERSION =
# File 'lib/capybara/version.rb', line 4'3.40.0'
Class Attribute Summary
- .current_driver ⇒ Symbol (also: .mode) rw
- .current_driver=(name) rw
-
.session_name ⇒ Symbol
rw
The current session name.
- .session_name=(name) rw
- .specified_session rw private
- .specified_session=(session) rw private
Class Method Summary
-
.add_selector(name, **options) { ... }
Add a new selector to
Capybara
. -
.always_include_port
See .configure
-
.app
See .configure
-
.app_host
See .configure
-
.configure {|config| ... }
Configure Capybara to suit your needs.
-
.current_session ⇒ Capybara::Session
The current
Session
based on what is set as .app and .current_driver. -
.default_driver
See .configure
-
.default_max_wait_time
See .configure
-
.default_selector
See .configure
- .drivers
-
HTML(html) ⇒ Nokogiri::HTML::Document
Parse raw html into a document using Nokogiri, and adjust textarea contents as defined by the spec.
-
.javascript_driver
See .configure
-
.mode
Alias for .current_driver.
-
.modify_selector(name) { ... }
Modify a selector previously created by .add_selector.
-
.register_driver(name) {|app| ... }
Register a new driver for
Capybara
. -
.register_server(name) {|app, port, host| ... }
Register a new server for
Capybara
. -
.reset!
Alias for .reset_sessions!.
-
.reset_sessions!
(also: .reset!)
Reset sessions, cleaning out the pool of sessions.
-
.reuse_server
See .configure
-
.run_default_server(app, port)
Runs Capybara’s default server for the given application and port under most circumstances you should not have to call this method manually.
-
.server
See .configure
- .servers
- .session_options
-
.string(html) ⇒ Capybara::Node::Simple
Wraps the given string, which should contain an .HTML document or fragment in a
Node::Simple
which exposes allNode::Matchers
,Node::Finders
andNode::DocumentMatchers
. -
.threadsafe
See .configure
-
.use_default_driver
Use the default driver as the current driver.
-
.use_html5_parsing
See .configure
-
.using_driver(driver)
Yield a block using a specific driver.
-
.using_session(name_or_session, &block)
Yield a block using a specific session name or
Session
instance. -
.using_wait_time(seconds)
Yield a block using a specific wait time.
- .config private
- .session_pool private
DSL
- Extended
page | Shortcut to accessing the current session. |
using_session | Shortcut to working in a different session. |
using_wait_time | Shortcut to using a different wait time. |
Class Attribute Details
.current_driver ⇒ Symbol
(rw)
Also known as: .mode
# File 'lib/capybara.rb', line 261
def current_driver if threadsafe Thread.current.thread_variable_get : else @current_driver end || default_driver end
.current_driver=(name) (rw)
[ GitHub ]# File 'lib/capybara.rb', line 270
def current_driver=(name) if threadsafe Thread.current.thread_variable_set :, name else @current_driver = name end end
.session_name ⇒ Symbol
(rw)
The current session name.
# File 'lib/capybara.rb', line 337
def session_name if threadsafe Thread.current.thread_variable_get(: ) || Thread.current.thread_variable_set(:, :default) else @session_name ||= :default end end
.session_name=(name) (rw)
[ GitHub ]# File 'lib/capybara.rb', line 346
def session_name=(name) if threadsafe Thread.current.thread_variable_set :, name else @session_name = name end end
.specified_session (rw, private)
[ GitHub ]# File 'lib/capybara.rb', line 426
def specified_session if threadsafe Thread.current.thread_variable_get : else @specified_session ||= nil end end
.specified_session=(session) (rw, private)
[ GitHub ]# File 'lib/capybara.rb', line 434
def specified_session=(session) if threadsafe Thread.current.thread_variable_set :, session else @specified_session = session end end
Class Method Details
.add_selector(name, **options) { ... }
Add a new selector to Capybara
. Selectors can be used by various methods in Capybara
to find certain elements on the page in a more convenient way. For example adding a selector to find certain table rows might look like this:
Capybara.add_selector(:row) do
xpath { |num| ".//tbody/tr[#{num}]" }
end
This makes it possible to use this selector in a variety of ways:
find(:row, 3)
page.find('table#myTable').find(:row, 3).text
page.find('table#myTable').has_selector?(:row, 3)
within(:row, 3) { expect(page).to have_content('$100.000') }
Here is another example:
Capybara.add_selector(:id) do
xpath { |id| XPath.descendant[XPath.attr(:id) == id.to_s] }
end
Note that this particular selector already ships with Capybara
.
.always_include_port
See .configure
# File 'lib/capybara.rb', line 57
SessionConfig::OPTIONS.each do |method| def_delegators :config, method, "#{method}=" end
.app
See .configure
.app_host
See .configure
# File 'lib/capybara.rb', line 57
SessionConfig::OPTIONS.each do |method| def_delegators :config, method, "#{method}=" end
.config (private)
[ GitHub ].configure {|config| ... }
Configure Capybara to suit your needs.
Capybara.configure do |config|
config.run_server = false
config.app_host = 'http://www.google.com'
end
#### Configurable options
-
use_html5_parsing (Boolean =
false
) - When Nokogiri >= 1.12.0 ornokogumbo
is installed, whether HTML5 parsing will be used for .HTML strings. -
always_include_port (Boolean =
false
) - Whether the Rack server’s port should automatically be inserted into every visited URL unless another port is explicitly specified. -
app_host (String,
nil
) - The default host to use when giving a relative URL to visit, must be a valid URL e.g.http://www.example.com
. -
asset_host (String =
nil
) - Where dynamic assets are hosted - will be prepended to relative asset locations if present. -
automatic_label_click (Boolean =
false
) - Whether{Element#choose
},{Element#check
},Element#uncheck
will attempt to click the associated ‘<label>` element if the checkbox/radio button are non-visible. -
automatic_reload (Boolean =
true
) - Whether to automatically reload elements asCapybara
is waiting. -
default_max_wait_time (Numeric = ‘2`) - The maximum number of seconds to wait for asynchronous processes to finish.
-
default_normalize_ws (Boolean =
false
) - Whether text predicates and matchers use normalize whitespace behavior. -
default_retry_interval (Numeric = ‘0.01`) - The number of seconds to delay the next check in asynchronous processes.
-
default_selector (‘:css`,
:xpath
=:css
) - Methods which take a selector use the given type by default. See alsoSelector
. -
default_set_options (Hash = ‘{}`) - The default options passed to {Element#set}.
-
enable_aria_label (Boolean =
false
) - Whether fields, links, and buttons will match againstaria-label
attribute. -
enable_aria_role (Boolean =
false
) - Selectors will check for relevant aria role (currently onlybutton
). -
exact (Boolean =
false
) - Whether locators are matched exactly or with substrings. Only affects selector conditions written using the ‘XPath#is` method. -
exact_text (Boolean =
false
) - Whether the text matchers and:text
filter match exactly or on substrings. -
ignore_hidden_elements (Boolean =
true
) - Whether to ignore hidden elements on the page. -
match (‘:one`,
:first
,:prefer_exact
,:smart
=:smart
) - The matching strategy to find nodes. -
predicates_wait (Boolean =
true
) - Whether Capybara’s predicate matchers use waiting behavior by default. -
raise_server_errors (Boolean =
true
) - Should errors raised in the server be raised in the tests? -
reuse_server (Boolean =
true
) - Whether to reuse the server thread between multiple sessions using the same app object. -
run_server (Boolean =
true
) - Whether to start a Rack server for the given Rack app. -
save_path (String =
Dir.pwd
) - Where to put pages saved through save_page, save_screenshot, save_and_open_page, or save_and_open_screenshot. -
server (Symbol =
:default
(which uses puma)) - The name of the registered server to use when running the app under test. -
server_port (Integer) - The port
Capybara
will run the application server on, if not specified a random port will be used. -
server_host (String = “127.0.0.1”) - The IP address
Capybara
will bind the application server to. If the test application is to be accessed from an external host, you will want to change this to “0.0.0.0” or to a more specific IP address that your test client can reach. -
server_errors (Array<Class> = ‘[Exception]`) - Error classes that should be raised in the tests if they are raised in the server and
configure
istrue
. -
test_id (Symbol, String,
nil
=nil
) - Optional attribute to match locator against with built-in selectors along with id. -
threadsafe (Boolean =
false
) - Whether sessions can be configured individually. -
w3c_click_offset (Boolean = ‘true’) - Whether click offsets should be from element center (true) or top left (false)
#### DSL Options
When using capybara/dsl
, the following options are also available:
-
default_driver (Symbol = ‘:rack_test`) - The name of the driver to use by default.
-
javascript_driver (Symbol = ‘:selenium`) - The name of a driver to use for JavaScript enabled tests.
# File 'lib/capybara.rb', line 114
def configure yield config end
.current_session ⇒ Capybara::Session
The current Session
based on what is set as .app and .current_driver.
# File 'lib/capybara.rb', line 316
def current_session specified_session || session_pool["#{current_driver}:#{session_name}:#{app.object_id}"] end
.default_driver
See .configure
.default_max_wait_time
See .configure
# File 'lib/capybara.rb', line 57
SessionConfig::OPTIONS.each do |method| def_delegators :config, method, "#{method}=" end
.default_selector
See .configure
# File 'lib/capybara.rb', line 57
SessionConfig::OPTIONS.each do |method| def_delegators :config, method, "#{method}=" end
.drivers
[ GitHub ]# File 'lib/capybara.rb', line 204
def drivers @drivers ||= RegistrationContainer.new end
HTML(html) ⇒ Nokogiri::HTML::Document
Parse raw html into a document using Nokogiri, and adjust textarea contents as defined by the spec.
# File 'lib/capybara.rb', line 390
def HTML(html) # rubocop:disable Naming/MethodName # Nokogiri >= 1.12.0 or Nokogumbo installed and allowed for use html_parser, using_html5 = if defined?(Nokogiri::HTML5) && Capybara.use_html5_parsing [Nokogiri::HTML5, true] else [defined?(Nokogiri::HTML4) ? Nokogiri::HTML4 : Nokogiri::HTML, false] end html_parser.parse(html).tap do |document| document.xpath('//template').each do |template| # template elements content is not part of the document template.inner_html = '' end document.xpath('//textarea').each do |textarea| # The Nokogiri HTML5 parser already returns spec compliant contents textarea['_capybara_raw_value'] = using_html5 ? textarea.content : textarea.content.delete_prefix("\n") end end end
.javascript_driver
See .configure
.mode
Alias for .current_driver.
# File 'lib/capybara.rb', line 268
alias_method :mode, :current_driver
.modify_selector(name) { ... }
Modify a selector previously created by .add_selector. For example, adding a new filter to the :button
selector to filter based on button style (a class) might look like this
Capybara.modify_selector(: ) do
filter (:btn_style, valid_values: [:primary, :secondary]) { |node, style| node[:class].split.include? "btn-#{style}" }
end
.register_driver(name) {|app| ... }
# File 'lib/capybara.rb', line 131
def register_driver(name, &block) drivers.send(:register, name, block) end
.register_server(name) {|app, port, host| ... }
# File 'lib/capybara.rb', line 150
def register_server(name, &block) servers.send(:register, name.to_sym, block) end
.reset!
Alias for .reset_sessions!.
# File 'lib/capybara.rb', line 329
alias_method :reset!, :reset_sessions!
.reset_sessions! Also known as: .reset!
Reset sessions, cleaning out the pool of sessions. This will remove any session information such as cookies.
# File 'lib/capybara.rb', line 325
def reset_sessions! # reset in reverse so sessions that started servers are reset last session_pool.reverse_each { |_mode, session| session.reset! } end
.reuse_server
See .configure
.run_default_server(app, port)
Runs Capybara’s default server for the given application and port under most circumstances you should not have to call this method manually.
.server
See .configure
.servers
[ GitHub ]# File 'lib/capybara.rb', line 208
def servers @servers ||= RegistrationContainer.new end
.session_options
[ GitHub ]# File 'lib/capybara.rb', line 410
def config. end
.session_pool (private)
[ GitHub ]# File 'lib/capybara.rb', line 420
def session_pool @session_pool ||= Hash.new do |hash, name| hash[name] = Capybara::Session.new(current_driver, app) end end
.string(html) ⇒ Capybara::Node::Simple
Wraps the given string, which should contain an .HTML document or fragment in a Node::Simple
which exposes all Node::Matchers
, Node::Finders
and Node::DocumentMatchers
. This allows you to query any string containing .HTML in the exact same way you would query the current document in a Capybara
session.
.threadsafe
See .configure
.use_default_driver
Use the default driver as the current driver
# File 'lib/capybara.rb', line 282
def use_default_driver self.current_driver = nil end
.use_html5_parsing
See .configure
.using_driver(driver)
Yield a block using a specific driver
# File 'lib/capybara.rb', line 290
def using_driver(driver) previous_driver = Capybara.current_driver Capybara.current_driver = driver yield ensure self.current_driver = previous_driver end
.using_session(name_or_session, &block)
Yield a block using a specific session name or Session
instance.
# File 'lib/capybara.rb', line 358
def using_session(name_or_session, &block) previous_session = current_session previous_session_info = { specified_session: specified_session, session_name: session_name, current_driver: current_driver, app: app } self.specified_session = self.session_name = nil if name_or_session.is_a? Capybara::Session self.specified_session = name_or_session else self.session_name = name_or_session end if block.arity.zero? yield else yield current_session, previous_session end ensure self.session_name, self.specified_session = previous_session_info.values_at(:session_name, :specified_session) self.current_driver, self.app = previous_session_info.values_at(:current_driver, :app) if threadsafe end
.using_wait_time(seconds)
Yield a block using a specific wait time
# File 'lib/capybara.rb', line 302
def using_wait_time(seconds) previous_wait_time = Capybara.default_max_wait_time Capybara.default_max_wait_time = seconds yield ensure Capybara.default_max_wait_time = previous_wait_time end