capybara 3.20.2 → 3.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/History.md +14 -0
- data/README.md +4 -4
- data/lib/capybara.rb +11 -11
- data/lib/capybara/driver/node.rb +4 -0
- data/lib/capybara/helpers.rb +1 -1
- data/lib/capybara/minitest.rb +4 -4
- data/lib/capybara/node/actions.rb +36 -29
- data/lib/capybara/node/element.rb +123 -82
- data/lib/capybara/node/finders.rb +2 -7
- data/lib/capybara/selector/definition/css.rb +4 -1
- data/lib/capybara/selector/regexp_disassembler.rb +2 -2
- data/lib/capybara/selenium/extensions/html5_drag.rb +63 -0
- data/lib/capybara/selenium/node.rb +4 -0
- data/lib/capybara/selenium/nodes/chrome_node.rb +4 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +4 -13
- data/lib/capybara/selenium/nodes/ie_node.rb +14 -3
- data/lib/capybara/selenium/nodes/safari_node.rb +0 -13
- data/lib/capybara/spec/public/test.js +29 -3
- data/lib/capybara/spec/session/attach_file_spec.rb +13 -5
- data/lib/capybara/spec/session/has_css_spec.rb +4 -3
- data/lib/capybara/spec/session/node_spec.rb +85 -0
- data/lib/capybara/spec/spec_helper.rb +4 -0
- data/lib/capybara/version.rb +1 -1
- data/spec/selenium_spec_firefox.rb +2 -0
- data/spec/selenium_spec_ie.rb +13 -7
- data/spec/selenium_spec_safari.rb +2 -0
- data/spec/shared_selenium_session.rb +1 -51
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 260a1571a7fde6676b4d901b75e17035cd5c1b32b92f6c647e9d8ceadc78ae2a
|
4
|
+
data.tar.gz: d05339eac382154edea4059cf658c7cd828a75bd8b4570b9e85819f1641fad38
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffb2ebe0f747c4519d50138f4575f07c4171b1d2bfaa978dab3f471cac9cf839e0e570b8c25b76185530960d6da42dcdb9a6f45c9ed50ebd605c5cf4da2a4da4
|
7
|
+
data.tar.gz: 24c034c08f20d051256444c46bb86e0ab8c8468c34e45e27bf95408074ffe1c305603d0034348582d6b719af36a08f3f88365ddcd0336ba14e8216de854034ef
|
data/History.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
# Version 3.21.0
|
2
|
+
Release date: 2019-05-24
|
3
|
+
|
4
|
+
### Added
|
5
|
+
|
6
|
+
* Element#drop - Chrome and Firefox, via the selenium driver, support dropping files/data on elements
|
7
|
+
* Default CSS used for `attach_file` `make_visible: true` now includes auto for
|
8
|
+
height and width to handle more ways of hiding the file input element
|
9
|
+
* Documentation Updates and Fixes - Many thanks to Masafumi Koba! [Masafumi Koba]
|
10
|
+
|
11
|
+
### Changed
|
12
|
+
|
13
|
+
* Deprecate support for CSS locator being a Symbol
|
14
|
+
|
1
15
|
# Version 3.20.2
|
2
16
|
Release date: 2019-05-19
|
3
17
|
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
[](https://gitter.im/jnicklas/capybara?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
8
8
|
[](https://dependabot.com/compatibility-score.html?dependency-name=capybara&package-manager=bundler&version-scheme=semver)
|
9
9
|
|
10
|
-
**Note** You are viewing the README for the 3.
|
10
|
+
**Note** You are viewing the README for the 3.21.x version of Capybara.
|
11
11
|
|
12
12
|
|
13
13
|
Capybara helps you test web applications by simulating how a real user would
|
@@ -38,8 +38,6 @@ GitHub): http://groups.google.com/group/ruby-capybara
|
|
38
38
|
- [RackTest](#racktest)
|
39
39
|
- [Selenium](#selenium)
|
40
40
|
- [Apparition](#apparition)
|
41
|
-
- [Capybara-webkit](#capybara-webkit)
|
42
|
-
- [Poltergeist](#poltergeist)
|
43
41
|
- [The DSL](#the-dsl)
|
44
42
|
- [Navigating](#navigating)
|
45
43
|
- [Clicking links and buttons](#clicking-links-and-buttons)
|
@@ -59,11 +57,13 @@ GitHub): http://groups.google.com/group/ruby-capybara
|
|
59
57
|
- [Using the DSL elsewhere](#using-the-dsl-elsewhere)
|
60
58
|
- [Calling remote servers](#calling-remote-servers)
|
61
59
|
- [Using sessions](#using-sessions)
|
60
|
+
- [Named sessions](#named-sessions)
|
61
|
+
- [Using sessions manually](#using-sessions-manually)
|
62
62
|
- [XPath, CSS and selectors](#xpath-css-and-selectors)
|
63
63
|
- [Beware the XPath // trap](#beware-the-xpath--trap)
|
64
64
|
- [Configuring and adding drivers](#configuring-and-adding-drivers)
|
65
65
|
- [Gotchas:](#gotchas)
|
66
|
-
- ["Threadsafe" mode](#threadsafe)
|
66
|
+
- ["Threadsafe" mode](#threadsafe-mode)
|
67
67
|
- [Development](#development)
|
68
68
|
|
69
69
|
## <a name="key-benefits"></a>Key benefits
|
data/lib/capybara.rb
CHANGED
@@ -73,22 +73,24 @@ module Capybara
|
|
73
73
|
# [asset_host = String] Where dynamic assets are hosted - will be prepended to relative asset locations if present (Default: nil)
|
74
74
|
# [run_server = Boolean] Whether to start a Rack server for the given Rack app (Default: true)
|
75
75
|
# [raise_server_errors = Boolean] Should errors raised in the server be raised in the tests? (Default: true)
|
76
|
-
# [server_errors = Array\<Class\>] Error classes that should be raised in the tests if they are raised in the server and
|
76
|
+
# [server_errors = Array\<Class\>] Error classes that should be raised in the tests if they are raised in the server and {configure raise_server_errors} is true (Default: [Exception])
|
77
77
|
# [default_selector = :css/:xpath] Methods which take a selector use the given type by default (Default: :css)
|
78
78
|
# [default_max_wait_time = Numeric] The maximum number of seconds to wait for asynchronous processes to finish (Default: 2)
|
79
79
|
# [ignore_hidden_elements = Boolean] Whether to ignore hidden elements on the page (Default: true)
|
80
80
|
# [automatic_reload = Boolean] Whether to automatically reload elements as Capybara is waiting (Default: true)
|
81
81
|
# [save_path = String] Where to put pages saved through save_(page|screenshot), save_and_open_(page|screenshot) (Default: Dir.pwd)
|
82
|
-
# [automatic_label_click = Boolean] Whether Node#choose, Node#check, Node#uncheck will attempt to click the associated label element if the checkbox/radio button are non-visible (Default: false)
|
82
|
+
# [automatic_label_click = Boolean] Whether {Capybara::Node::Element#choose Element#choose}, {Capybara::Node::Element#check Element#check}, {Capybara::Node::Element#uncheck Element#uncheck} will attempt to click the associated label element if the checkbox/radio button are non-visible (Default: false)
|
83
83
|
# [enable_aria_label = Boolean] Whether fields, links, and buttons will match against aria-label attribute (Default: false)
|
84
84
|
# [reuse_server = Boolean] Reuse the server thread between multiple sessions using the same app object (Default: true)
|
85
85
|
# [threadsafe = Boolean] Whether sessions can be configured individually (Default: false)
|
86
|
-
# [server = Symbol] The name of the registered server to use when running the app under test (Default: :
|
87
|
-
# [default_set_options = Hash] The default options passed to Node::set (Default: {})
|
86
|
+
# [server = Symbol] The name of the registered server to use when running the app under test (Default: :default which uses puma)
|
87
|
+
# [default_set_options = Hash] The default options passed to {Capybara::Node::Element#set Element#set} (Default: {})
|
88
88
|
# [test_id = Symbol/String/nil] Optional attribute to match locator aginst with builtin selectors along with id (Default: nil)
|
89
|
-
# [predicates_wait = Boolean] Whether
|
89
|
+
# [predicates_wait = Boolean] Whether Capybara's predicate matchers use waiting behavior by default (Default: true)
|
90
90
|
# [default_normalize_ws = Boolean] Whether text predicates and matchers use normalize whitespace behaviour (Default: false)
|
91
91
|
# [allow_gumbo = Boolean] When `nokogumbo` is available, whether it will be used to parse HTML strings (Default: false)
|
92
|
+
# [match = :one/:first/:prefer_exact/:smart] The matching strategy to find nodes (Default: :smart)
|
93
|
+
# [exact_text = Boolean] Whether the text matchers and `:text` filter match exactly or on substrings (Default: false)
|
92
94
|
#
|
93
95
|
# === DSL Options
|
94
96
|
#
|
@@ -201,15 +203,13 @@ module Capybara
|
|
201
203
|
# any string containing HTML in the exact same way you would query the current document in a Capybara
|
202
204
|
# session.
|
203
205
|
#
|
204
|
-
#
|
205
|
-
#
|
206
|
+
# @example A single element
|
206
207
|
# node = Capybara.string('<a href="foo">bar</a>')
|
207
208
|
# anchor = node.first('a')
|
208
209
|
# anchor[:href] #=> 'foo'
|
209
210
|
# anchor.text #=> 'bar'
|
210
211
|
#
|
211
|
-
#
|
212
|
-
#
|
212
|
+
# @example Multiple elements
|
213
213
|
# node = Capybara.string <<-HTML
|
214
214
|
# <ul>
|
215
215
|
# <li id="home">Home</li>
|
@@ -297,7 +297,7 @@ module Capybara
|
|
297
297
|
|
298
298
|
##
|
299
299
|
#
|
300
|
-
# The current Capybara::Session based on what is set as
|
300
|
+
# The current {Capybara::Session} based on what is set as {app} and {current_driver}.
|
301
301
|
#
|
302
302
|
# @return [Capybara::Session] The currently used session
|
303
303
|
#
|
@@ -340,7 +340,7 @@ module Capybara
|
|
340
340
|
|
341
341
|
##
|
342
342
|
#
|
343
|
-
# Yield a block using a specific session name or Capybara::Session instance.
|
343
|
+
# Yield a block using a specific session name or {Capybara::Session} instance.
|
344
344
|
#
|
345
345
|
def using_session(name_or_session)
|
346
346
|
previous_session_info = {
|
data/lib/capybara/driver/node.rb
CHANGED
data/lib/capybara/helpers.rb
CHANGED
@@ -41,7 +41,7 @@ module Capybara
|
|
41
41
|
##
|
42
42
|
#
|
43
43
|
# Injects a `<base>` tag into the given HTML code, pointing to
|
44
|
-
#
|
44
|
+
# {Capybara.configure asset_host}.
|
45
45
|
#
|
46
46
|
# @param [String] html HTML code to inject into
|
47
47
|
# @param [URL] host (Capybara.asset_host) The host from which assets should be loaded
|
data/lib/capybara/minitest.rb
CHANGED
@@ -150,27 +150,27 @@ module Capybara
|
|
150
150
|
# Assertion that there is xpath
|
151
151
|
#
|
152
152
|
# @!method assert_xpath
|
153
|
-
# see Capybara::Node::Matchers#has_xpath?
|
153
|
+
# see {Capybara::Node::Matchers#has_xpath?}
|
154
154
|
|
155
155
|
##
|
156
156
|
# Assertion that there is no xpath
|
157
157
|
#
|
158
158
|
# @!method refute_xpath
|
159
159
|
# @!method assert_no_xpath
|
160
|
-
# see Capybara::Node::Matchers#has_no_xpath?
|
160
|
+
# see {Capybara::Node::Matchers#has_no_xpath?}
|
161
161
|
|
162
162
|
##
|
163
163
|
# Assertion that there is css
|
164
164
|
#
|
165
165
|
# @!method assert_css
|
166
|
-
# see Capybara::Node::Matchers#has_css?
|
166
|
+
# see {Capybara::Node::Matchers#has_css?}
|
167
167
|
|
168
168
|
##
|
169
169
|
# Assertion that there is no css
|
170
170
|
#
|
171
171
|
# @!method refute_css
|
172
172
|
# @!method assert_no_css
|
173
|
-
# see Capybara::Node::Matchers#has_no_css?
|
173
|
+
# see {Capybara::Node::Matchers#has_no_css?}
|
174
174
|
|
175
175
|
##
|
176
176
|
# Assertion that there is link
|
@@ -6,18 +6,19 @@ module Capybara
|
|
6
6
|
# @!macro waiting_behavior
|
7
7
|
# If the driver is capable of executing JavaScript, this method will wait for a set amount of time
|
8
8
|
# and continuously retry finding the element until either the element is found or the time
|
9
|
-
# expires. The length of time
|
9
|
+
# expires. The length of time this method will wait is controlled through {Capybara.configure default_max_wait_time}.
|
10
10
|
#
|
11
|
-
# @option options [false, true, Numeric] wait
|
11
|
+
# @option options [false, true, Numeric] wait
|
12
|
+
# Maximum time to wait for matching element to appear. Defaults to {Capybara.configure default_max_wait_time}.
|
12
13
|
|
13
14
|
##
|
14
15
|
#
|
15
|
-
# Finds a button or link and clicks it.
|
16
|
-
# {
|
16
|
+
# Finds a button or link and clicks it. See {#click_button} and
|
17
|
+
# {#click_link} for what locator will match against for each type of element.
|
17
18
|
#
|
18
19
|
# @overload click_link_or_button([locator], **options)
|
19
20
|
# @macro waiting_behavior
|
20
|
-
# @param [String] locator See {
|
21
|
+
# @param [String] locator See {#click_button} and {#click_link}
|
21
22
|
#
|
22
23
|
# @return [Capybara::Node::Element] The element clicked
|
23
24
|
#
|
@@ -28,13 +29,13 @@ module Capybara
|
|
28
29
|
|
29
30
|
##
|
30
31
|
#
|
31
|
-
# Finds a link by id, Capybara.test_id attribute, text or title and clicks it. Also looks at image
|
32
|
+
# Finds a link by id, {Capybara.configure test_id} attribute, text or title and clicks it. Also looks at image
|
32
33
|
# alt text inside the link.
|
33
34
|
#
|
34
35
|
# @overload click_link([locator], **options)
|
35
36
|
# @macro waiting_behavior
|
36
|
-
# @param [String] locator text, id, Capybara.test_id attribute, title or nested image's alt attribute
|
37
|
-
# @param options
|
37
|
+
# @param [String] locator text, id, {Capybara.configure test_id} attribute, title or nested image's alt attribute
|
38
|
+
# @param [Hash] options See {Capybara::Node::Finders#find_link}
|
38
39
|
#
|
39
40
|
# @return [Capybara::Node::Element] The element clicked
|
40
41
|
def click_link(locator = nil, **options)
|
@@ -44,14 +45,14 @@ module Capybara
|
|
44
45
|
##
|
45
46
|
#
|
46
47
|
# Finds a button on the page and clicks it.
|
47
|
-
# This can be any
|
48
|
-
#
|
49
|
-
# by their text content, and image
|
48
|
+
# This can be any `<input>` element of type submit, reset, image, button or it can be a
|
49
|
+
# `<button>` element. All buttons can be found by their id, name, {Capybara.configure test_id} attribute, value, or title. `<button>` elements can also be found
|
50
|
+
# by their text content, and image `<input>` elements by their alt attribute.
|
50
51
|
#
|
51
52
|
# @overload click_button([locator], **options)
|
52
53
|
# @macro waiting_behavior
|
53
54
|
# @param [String] locator Which button to find
|
54
|
-
# @param options
|
55
|
+
# @param [Hash] options See {Capybara::Node::Finders#find_button}
|
55
56
|
# @return [Capybara::Node::Element] The element clicked
|
56
57
|
def click_button(locator = nil, **options)
|
57
58
|
find(:button, locator, options).click
|
@@ -59,9 +60,9 @@ module Capybara
|
|
59
60
|
|
60
61
|
##
|
61
62
|
#
|
62
|
-
# Locate a text field or text area and fill it in with the given text
|
63
|
-
# The field can be found via its name, id, Capybara.test_id attribute, or label text.
|
64
|
-
# If no locator is provided will operate on self or a descendant
|
63
|
+
# Locate a text field or text area and fill it in with the given text.
|
64
|
+
# The field can be found via its name, id, {Capybara.configure test_id} attribute, or label text.
|
65
|
+
# If no locator is provided this will operate on self or a descendant.
|
65
66
|
#
|
66
67
|
# # will fill in a descendant fillable field with name, id, or label text matching 'Name'
|
67
68
|
# page.fill_in 'Name', with: 'Bob'
|
@@ -73,7 +74,7 @@ module Capybara
|
|
73
74
|
# @overload fill_in([locator], with:, **options)
|
74
75
|
# @param [String] locator Which field to fill in
|
75
76
|
# @param [Hash] options
|
76
|
-
# @param with: [String] The value to
|
77
|
+
# @param with: [String] The value to fill in
|
77
78
|
# @macro waiting_behavior
|
78
79
|
# @option options [String] currently_with The current value property of the field to fill in
|
79
80
|
# @option options [Boolean] multiple Match fields that can have multiple values?
|
@@ -81,9 +82,9 @@ module Capybara
|
|
81
82
|
# @option options [String] name Match fields that match the name attribute
|
82
83
|
# @option options [String] placeholder Match fields that match the placeholder attribute
|
83
84
|
# @option options [String, Array<String>, Regexp] class Match fields that match the class(es) provided
|
84
|
-
# @option options [Hash] fill_options Driver specific options regarding how to fill fields (Defaults come from Capybara.default_set_options)
|
85
|
+
# @option options [Hash] fill_options Driver specific options regarding how to fill fields (Defaults come from {Capybara.configure default_set_options})
|
85
86
|
#
|
86
|
-
# @return [Capybara::Node::Element] The element
|
87
|
+
# @return [Capybara::Node::Element] The element filled in
|
87
88
|
def fill_in(locator = nil, with:, currently_with: nil, fill_options: {}, **find_options)
|
88
89
|
find_options[:with] = currently_with if currently_with
|
89
90
|
find_options[:allow_self] = true if locator.nil?
|
@@ -91,7 +92,8 @@ module Capybara
|
|
91
92
|
end
|
92
93
|
|
93
94
|
# @!macro label_click
|
94
|
-
# @option options [Boolean] allow_label_click
|
95
|
+
# @option options [Boolean] allow_label_click
|
96
|
+
# Attempt to click the label to toggle state if element is non-visible. Defaults to {Capybara.configure automatic_label_click}.
|
95
97
|
|
96
98
|
##
|
97
99
|
#
|
@@ -178,10 +180,10 @@ module Capybara
|
|
178
180
|
|
179
181
|
##
|
180
182
|
#
|
181
|
-
# If
|
183
|
+
# If `from` option is present, {#select} finds a select box, or text input with associated datalist,
|
182
184
|
# on the page and selects a particular option from it.
|
183
185
|
# Otherwise it finds an option inside current scope and selects it.
|
184
|
-
# If the select box is a multiple select,
|
186
|
+
# If the select box is a multiple select, {#select} can be called multiple times to select more than
|
185
187
|
# one option.
|
186
188
|
# The select box can be found via its name, id or label text. The option can be found by its text.
|
187
189
|
#
|
@@ -191,7 +193,7 @@ module Capybara
|
|
191
193
|
# @macro waiting_behavior
|
192
194
|
#
|
193
195
|
# @param value [String] Which option to select
|
194
|
-
# @param from [String] The id, Capybara.test_id attribute, name or label of the select box
|
196
|
+
# @param from [String] The id, {Capybara.configure test_id} attribute, name or label of the select box
|
195
197
|
#
|
196
198
|
# @return [Capybara::Node::Element] The option element selected
|
197
199
|
def select(value = nil, from: nil, **options)
|
@@ -209,7 +211,7 @@ module Capybara
|
|
209
211
|
##
|
210
212
|
#
|
211
213
|
# Find a select box on the page and unselect a particular option from it. If the select
|
212
|
-
# box is a multiple select,
|
214
|
+
# box is a multiple select, {#unselect} can be called multiple times to unselect more than
|
213
215
|
# one option. The select box can be found via its name, id or label text.
|
214
216
|
#
|
215
217
|
# page.unselect 'March', from: 'Month'
|
@@ -218,7 +220,7 @@ module Capybara
|
|
218
220
|
# @macro waiting_behavior
|
219
221
|
#
|
220
222
|
# @param value [String] Which option to unselect
|
221
|
-
# @param from [String] The id, Capybara.test_id attribute, name or label of the select box
|
223
|
+
# @param from [String] The id, {Capybara.configure test_id} attribute, name or label of the select box
|
222
224
|
#
|
223
225
|
#
|
224
226
|
# @return [Capybara::Node::Element] The option element unselected
|
@@ -232,7 +234,7 @@ module Capybara
|
|
232
234
|
##
|
233
235
|
#
|
234
236
|
# Find a descendant file field on the page and attach a file given its path. There are two ways to use
|
235
|
-
#
|
237
|
+
# {#attach_file}, in the first method the file field can be found via its name, id or label text.
|
236
238
|
# In the case of the file field being hidden for
|
237
239
|
# styling reasons the `make_visible` option can be used to temporarily change the CSS of
|
238
240
|
# the file field, attach the file, and then revert the CSS back to original. If no locator is
|
@@ -257,13 +259,16 @@ module Capybara
|
|
257
259
|
# @param [String] locator Which field to attach the file to
|
258
260
|
# @param [String, Array<String>] paths The path(s) of the file(s) that will be attached
|
259
261
|
#
|
260
|
-
# @option options [Symbol] match
|
261
|
-
#
|
262
|
+
# @option options [Symbol] match
|
263
|
+
# The matching strategy to use (:one, :first, :prefer_exact, :smart). Defaults to {Capybara.configure match}.
|
264
|
+
# @option options [Boolean] exact
|
265
|
+
# Match the exact label name/contents or accept a partial match. Defaults to {Capybara.configure exact}.
|
262
266
|
# @option options [Boolean] multiple Match field which allows multiple file selection
|
263
267
|
# @option options [String, Regexp] id Match fields that match the id attribute
|
264
268
|
# @option options [String] name Match fields that match the name attribute
|
265
269
|
# @option options [String, Array<String>, Regexp] class Match fields that match the class(es) provided
|
266
|
-
# @option options [true, Hash] make_visible
|
270
|
+
# @option options [true, Hash] make_visible
|
271
|
+
# A Hash of CSS styles to change before attempting to attach the file, if `true`, `{ opacity: 1, display: 'block', visibility: 'visible' }` is used (may not be supported by all drivers).
|
267
272
|
# @overload attach_file(paths, &blk)
|
268
273
|
# @param [String, Array<String>] paths The path(s) of the file(s) that will be attached
|
269
274
|
# @yield Block whose actions will trigger the system file chooser to be shown
|
@@ -326,7 +331,9 @@ module Capybara
|
|
326
331
|
end
|
327
332
|
|
328
333
|
def while_visible(element, visible_css)
|
329
|
-
|
334
|
+
if visible_css == true
|
335
|
+
visible_css = { opacity: 1, display: 'block', visibility: 'visible', width: 'auto', height: 'auto' }
|
336
|
+
end
|
330
337
|
_update_style(element, visible_css)
|
331
338
|
raise ExpectationNotMet, 'The style changes in :make_visible did not make the file input visible' unless element.visible?
|
332
339
|
|
@@ -43,7 +43,7 @@ module Capybara
|
|
43
43
|
|
44
44
|
##
|
45
45
|
#
|
46
|
-
# Retrieve the text of the element. If
|
46
|
+
# Retrieve the text of the element. If {Capybara.configure ignore_hidden_elements}
|
47
47
|
# is `true`, which it is by default, then this will return only text
|
48
48
|
# which is visible. The exact semantics of this may differ between
|
49
49
|
# drivers, but generally any text within elements with `display:none` is
|
@@ -61,7 +61,7 @@ module Capybara
|
|
61
61
|
|
62
62
|
##
|
63
63
|
#
|
64
|
-
# Retrieve the given attribute
|
64
|
+
# Retrieve the given attribute.
|
65
65
|
#
|
66
66
|
# element[:title] # => HTML title attribute
|
67
67
|
#
|
@@ -74,7 +74,7 @@ module Capybara
|
|
74
74
|
|
75
75
|
##
|
76
76
|
#
|
77
|
-
# Retrieve the given CSS styles
|
77
|
+
# Retrieve the given CSS styles.
|
78
78
|
#
|
79
79
|
# element.style('color', 'font-size') # => Computed values of CSS 'color' and 'font-size' styles
|
80
80
|
#
|
@@ -109,7 +109,7 @@ module Capybara
|
|
109
109
|
# Set the value of the form element to the given value.
|
110
110
|
#
|
111
111
|
# @param [String] value The new value
|
112
|
-
# @param [Hash
|
112
|
+
# @param [Hash] options Driver specific options for how to set the value. Take default values from {Capybara.configure default_set_options}.
|
113
113
|
#
|
114
114
|
# @return [Capybara::Node::Element] The element
|
115
115
|
def set(value, **options)
|
@@ -122,8 +122,15 @@ module Capybara
|
|
122
122
|
|
123
123
|
##
|
124
124
|
#
|
125
|
-
# Select this node if is an option element inside a select tag
|
125
|
+
# Select this node if it is an option element inside a select tag.
|
126
126
|
#
|
127
|
+
# @!macro action_waiting_behavior
|
128
|
+
# If the driver dynamic pages (JS) and the element is currently non-interactable, this method will
|
129
|
+
# continuously retry the action until either the element becomes interactable or the maximum
|
130
|
+
# wait time expires.
|
131
|
+
#
|
132
|
+
# @param [false, Numeric] wait
|
133
|
+
# Maximum time to wait for the action to succeed. Defaults to {Capybara.configure default_max_wait_time}.
|
127
134
|
# @return [Capybara::Node::Element] The element
|
128
135
|
def select_option(wait: nil)
|
129
136
|
synchronize(wait) { base.select_option }
|
@@ -132,8 +139,9 @@ module Capybara
|
|
132
139
|
|
133
140
|
##
|
134
141
|
#
|
135
|
-
# Unselect this node if is an option element inside a multiple select tag
|
142
|
+
# Unselect this node if it is an option element inside a multiple select tag.
|
136
143
|
#
|
144
|
+
# @macro action_waiting_behavior
|
137
145
|
# @return [Capybara::Node::Element] The element
|
138
146
|
def unselect_option(wait: nil)
|
139
147
|
synchronize(wait) { base.unselect_option }
|
@@ -142,11 +150,12 @@ module Capybara
|
|
142
150
|
|
143
151
|
##
|
144
152
|
#
|
145
|
-
# Click the Element
|
153
|
+
# Click the Element.
|
146
154
|
#
|
155
|
+
# @macro action_waiting_behavior
|
147
156
|
# @!macro click_modifiers
|
148
|
-
# Both x: and y: must be specified if an offset is wanted, if not specified the click will occur at the middle of the element
|
149
|
-
# @overload $0(*modifier_keys, **offset)
|
157
|
+
# Both x: and y: must be specified if an offset is wanted, if not specified the click will occur at the middle of the element.
|
158
|
+
# @overload $0(*modifier_keys, wait: nil, **offset)
|
150
159
|
# @param *modifier_keys [:alt, :control, :meta, :shift] ([]) Keys to be held down when clicking
|
151
160
|
# @option offset [Integer] x X coordinate to offset the click location from the top left corner of the element
|
152
161
|
# @option offset [Integer] y Y coordinate to offset the click location from the top left corner of the element
|
@@ -160,8 +169,9 @@ module Capybara
|
|
160
169
|
|
161
170
|
##
|
162
171
|
#
|
163
|
-
# Right Click the Element
|
172
|
+
# Right Click the Element.
|
164
173
|
#
|
174
|
+
# @macro action_waiting_behavior
|
165
175
|
# @macro click_modifiers
|
166
176
|
# @return [Capybara::Node::Element] The element
|
167
177
|
def right_click(*keys, wait: nil, **offset)
|
@@ -173,8 +183,9 @@ module Capybara
|
|
173
183
|
|
174
184
|
##
|
175
185
|
#
|
176
|
-
# Double Click the Element
|
186
|
+
# Double Click the Element.
|
177
187
|
#
|
188
|
+
# @macro action_waiting_behavior
|
178
189
|
# @macro click_modifiers
|
179
190
|
# @return [Capybara::Node::Element] The element
|
180
191
|
def double_click(*keys, wait: nil, **offset)
|
@@ -186,7 +197,7 @@ module Capybara
|
|
186
197
|
|
187
198
|
##
|
188
199
|
#
|
189
|
-
# Send Keystrokes to the Element
|
200
|
+
# Send Keystrokes to the Element.
|
190
201
|
#
|
191
202
|
# @overload send_keys(keys, ...)
|
192
203
|
# @param keys [String, Symbol, Array<String,Symbol>]
|
@@ -194,65 +205,65 @@ module Capybara
|
|
194
205
|
# Examples:
|
195
206
|
#
|
196
207
|
# element.send_keys "foo" #=> value: 'foo'
|
197
|
-
# element.send_keys "tet", :left, "s"
|
208
|
+
# element.send_keys "tet", :left, "s" #=> value: 'test'
|
198
209
|
# element.send_keys [:control, 'a'], :space #=> value: ' ' - assuming ctrl-a selects all contents
|
199
210
|
#
|
200
|
-
# Symbols supported for keys
|
201
|
-
# :cancel
|
202
|
-
# :help
|
203
|
-
# :backspace
|
204
|
-
# :tab
|
205
|
-
# :clear
|
206
|
-
# :return
|
207
|
-
# :enter
|
208
|
-
# :shift
|
209
|
-
# :control
|
210
|
-
# :alt
|
211
|
-
# :pause
|
212
|
-
# :escape
|
213
|
-
# :space
|
214
|
-
# :page_up
|
215
|
-
# :page_down
|
216
|
-
# :end
|
217
|
-
# :home
|
218
|
-
# :left
|
219
|
-
# :up
|
220
|
-
# :right
|
221
|
-
# :down
|
222
|
-
# :insert
|
223
|
-
# :delete
|
224
|
-
# :semicolon
|
225
|
-
# :equals
|
226
|
-
# :numpad0
|
227
|
-
# :numpad1
|
228
|
-
# :numpad2
|
229
|
-
# :numpad3
|
230
|
-
# :numpad4
|
231
|
-
# :numpad5
|
232
|
-
# :numpad6
|
233
|
-
# :numpad7
|
234
|
-
# :numpad8
|
235
|
-
# :numpad9
|
236
|
-
# :multiply - numeric keypad *
|
237
|
-
# :add - numeric keypad +
|
238
|
-
# :separator - numeric keypad 'separator' key ??
|
239
|
-
# :subtract - numeric keypad -
|
240
|
-
# :decimal - numeric keypad .
|
241
|
-
# :divide - numeric keypad /
|
242
|
-
# :f1
|
243
|
-
# :f2
|
244
|
-
# :f3
|
245
|
-
# :f4
|
246
|
-
# :f5
|
247
|
-
# :f6
|
248
|
-
# :f7
|
249
|
-
# :f8
|
250
|
-
# :f9
|
251
|
-
# :f10
|
252
|
-
# :f11
|
253
|
-
# :f12
|
254
|
-
# :meta
|
255
|
-
# :command - alias of :meta
|
211
|
+
# Symbols supported for keys:
|
212
|
+
# * :cancel
|
213
|
+
# * :help
|
214
|
+
# * :backspace
|
215
|
+
# * :tab
|
216
|
+
# * :clear
|
217
|
+
# * :return
|
218
|
+
# * :enter
|
219
|
+
# * :shift
|
220
|
+
# * :control
|
221
|
+
# * :alt
|
222
|
+
# * :pause
|
223
|
+
# * :escape
|
224
|
+
# * :space
|
225
|
+
# * :page_up
|
226
|
+
# * :page_down
|
227
|
+
# * :end
|
228
|
+
# * :home
|
229
|
+
# * :left
|
230
|
+
# * :up
|
231
|
+
# * :right
|
232
|
+
# * :down
|
233
|
+
# * :insert
|
234
|
+
# * :delete
|
235
|
+
# * :semicolon
|
236
|
+
# * :equals
|
237
|
+
# * :numpad0
|
238
|
+
# * :numpad1
|
239
|
+
# * :numpad2
|
240
|
+
# * :numpad3
|
241
|
+
# * :numpad4
|
242
|
+
# * :numpad5
|
243
|
+
# * :numpad6
|
244
|
+
# * :numpad7
|
245
|
+
# * :numpad8
|
246
|
+
# * :numpad9
|
247
|
+
# * :multiply - numeric keypad *
|
248
|
+
# * :add - numeric keypad +
|
249
|
+
# * :separator - numeric keypad 'separator' key ??
|
250
|
+
# * :subtract - numeric keypad -
|
251
|
+
# * :decimal - numeric keypad .
|
252
|
+
# * :divide - numeric keypad /
|
253
|
+
# * :f1
|
254
|
+
# * :f2
|
255
|
+
# * :f3
|
256
|
+
# * :f4
|
257
|
+
# * :f5
|
258
|
+
# * :f6
|
259
|
+
# * :f7
|
260
|
+
# * :f8
|
261
|
+
# * :f9
|
262
|
+
# * :f10
|
263
|
+
# * :f11
|
264
|
+
# * :f12
|
265
|
+
# * :meta
|
266
|
+
# * :command - alias of :meta
|
256
267
|
#
|
257
268
|
# @return [Capybara::Node::Element] The element
|
258
269
|
def send_keys(*args)
|
@@ -262,7 +273,7 @@ module Capybara
|
|
262
273
|
|
263
274
|
##
|
264
275
|
#
|
265
|
-
# Hover on the Element
|
276
|
+
# Hover on the Element.
|
266
277
|
#
|
267
278
|
# @return [Capybara::Node::Element] The element
|
268
279
|
def hover
|
@@ -276,7 +287,7 @@ module Capybara
|
|
276
287
|
#
|
277
288
|
def tag_name
|
278
289
|
# Element type is immutable so cache it
|
279
|
-
@tag_name ||= synchronize { base.tag_name }
|
290
|
+
@tag_name ||= initial_cache[:tag_name] || synchronize { base.tag_name }
|
280
291
|
end
|
281
292
|
|
282
293
|
##
|
@@ -353,7 +364,7 @@ module Capybara
|
|
353
364
|
|
354
365
|
##
|
355
366
|
#
|
356
|
-
# An XPath expression describing where on the page the element can be found
|
367
|
+
# An XPath expression describing where on the page the element can be found.
|
357
368
|
#
|
358
369
|
# @return [String] An XPath expression
|
359
370
|
#
|
@@ -394,17 +405,41 @@ module Capybara
|
|
394
405
|
|
395
406
|
##
|
396
407
|
#
|
397
|
-
#
|
408
|
+
# Drop items on the current element.
|
409
|
+
#
|
410
|
+
# target = page.find('#foo')
|
411
|
+
# target.drop('/some/path/file.csv')
|
412
|
+
#
|
413
|
+
# @overload drop(path, ...)
|
414
|
+
# @param [String, #to_path] path Location of the file to drop on the element
|
415
|
+
#
|
416
|
+
# @overload drop(strings, ...)
|
417
|
+
# @param [Hash] strings A hash of type to data to be dropped - `{ "text/url" => "https://www.google.com" }`
|
418
|
+
#
|
419
|
+
# @return [Capybara::Node::Element] The element
|
420
|
+
def drop(*args)
|
421
|
+
options = args.map do |arg|
|
422
|
+
return arg.to_path if arg.respond_to?(:to_path)
|
423
|
+
|
424
|
+
arg
|
425
|
+
end
|
426
|
+
synchronize { base.drop(*options) }
|
427
|
+
self
|
428
|
+
end
|
429
|
+
|
430
|
+
##
|
431
|
+
#
|
432
|
+
# Scroll the page or element.
|
398
433
|
#
|
399
|
-
# Scroll the page or element to its top, bottom or middle
|
400
434
|
# @overload scroll_to(position, offset: [0,0])
|
435
|
+
# Scroll the page or element to its top, bottom or middle.
|
401
436
|
# @param [:top, :bottom, :center, :current] position
|
402
|
-
# @param
|
437
|
+
# @param [[Integer, Integer]] offset
|
403
438
|
#
|
404
|
-
# Scroll the page or current element until the given element is aligned at the top, bottom, or center of it
|
405
439
|
# @overload scroll_to(element, align: :top)
|
440
|
+
# Scroll the page or current element until the given element is aligned at the top, bottom, or center of it.
|
406
441
|
# @param [Capybara::Node::Element] element The element to be scrolled into view
|
407
|
-
# @param [:top, :bottom, :center]
|
442
|
+
# @param [:top, :bottom, :center] align Where to align the element being scrolled into view with relation to the current page/element if possible
|
408
443
|
#
|
409
444
|
# @overload scroll_to(x,y)
|
410
445
|
# @param [Integer] x Horizontal scroll offset
|
@@ -427,11 +462,11 @@ module Capybara
|
|
427
462
|
##
|
428
463
|
#
|
429
464
|
# Execute the given JS in the context of the element not returning a result. This is useful for scripts that return
|
430
|
-
# complex objects, such as jQuery statements.
|
431
|
-
#
|
465
|
+
# complex objects, such as jQuery statements. {#execute_script} should be used over
|
466
|
+
# {#evaluate_script} whenever a result is not expected or needed. `this` in the script will refer to the element this is called on.
|
432
467
|
#
|
433
468
|
# @param [String] script A string of JavaScript to execute
|
434
|
-
# @param args Optional arguments that will be passed to the script.
|
469
|
+
# @param args Optional arguments that will be passed to the script. Driver support for this is optional and types of objects supported may differ between drivers
|
435
470
|
#
|
436
471
|
def execute_script(script, *args)
|
437
472
|
session.execute_script(<<~JS, self, *args)
|
@@ -444,7 +479,7 @@ module Capybara
|
|
444
479
|
##
|
445
480
|
#
|
446
481
|
# Evaluate the given JS in the context of the element and return the result. Be careful when using this with
|
447
|
-
# scripts that return complex objects, such as jQuery statements.
|
482
|
+
# scripts that return complex objects, such as jQuery statements. {#execute_script} might
|
448
483
|
# be a better alternative. `this` in the script will refer to the element this is called on.
|
449
484
|
#
|
450
485
|
# @param [String] script A string of JavaScript to evaluate
|
@@ -462,7 +497,7 @@ module Capybara
|
|
462
497
|
#
|
463
498
|
# Evaluate the given JavaScript in the context of the element and obtain the result from a
|
464
499
|
# callback function which will be passed as the last argument to the script. `this` in the
|
465
|
-
# script will refer to the element this is called on
|
500
|
+
# script will refer to the element this is called on.
|
466
501
|
#
|
467
502
|
# @param [String] script A string of JavaScript to evaluate
|
468
503
|
# @return [Object] The result of the evaluated JavaScript (may be driver specific)
|
@@ -475,6 +510,7 @@ module Capybara
|
|
475
510
|
JS
|
476
511
|
end
|
477
512
|
|
513
|
+
# @api private
|
478
514
|
def reload
|
479
515
|
if @allow_reload
|
480
516
|
begin
|
@@ -487,6 +523,11 @@ module Capybara
|
|
487
523
|
self
|
488
524
|
end
|
489
525
|
|
526
|
+
##
|
527
|
+
#
|
528
|
+
# A human-readable representation of the element.
|
529
|
+
#
|
530
|
+
# @return [String] A string representation
|
490
531
|
def inspect
|
491
532
|
%(#<Capybara::Node::Element tag="#{base.tag_name}" path="#{base.path}">)
|
492
533
|
rescue NotSupportedByDriverError
|