capybara 3.29.0 → 3.31.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 +40 -1
- data/README.md +1 -1
- data/lib/capybara/config.rb +7 -3
- data/lib/capybara/dsl.rb +10 -2
- data/lib/capybara/helpers.rb +3 -1
- data/lib/capybara/minitest.rb +18 -4
- data/lib/capybara/node/actions.rb +23 -19
- data/lib/capybara/node/document.rb +2 -2
- data/lib/capybara/node/document_matchers.rb +3 -3
- data/lib/capybara/node/element.rb +21 -16
- data/lib/capybara/node/finders.rb +17 -11
- data/lib/capybara/node/matchers.rb +60 -45
- data/lib/capybara/node/simple.rb +4 -2
- data/lib/capybara/queries/ancestor_query.rb +1 -1
- data/lib/capybara/queries/base_query.rb +2 -1
- data/lib/capybara/queries/selector_query.rb +17 -4
- data/lib/capybara/queries/sibling_query.rb +1 -1
- data/lib/capybara/rack_test/browser.rb +4 -1
- data/lib/capybara/rack_test/driver.rb +1 -1
- data/lib/capybara/rack_test/form.rb +1 -1
- data/lib/capybara/rack_test/node.rb +34 -9
- data/lib/capybara/result.rb +24 -4
- data/lib/capybara/rspec/matchers.rb +27 -27
- data/lib/capybara/rspec/matchers/base.rb +12 -6
- data/lib/capybara/rspec/matchers/count_sugar.rb +2 -1
- data/lib/capybara/rspec/matchers/have_ancestor.rb +4 -3
- data/lib/capybara/rspec/matchers/have_current_path.rb +2 -2
- data/lib/capybara/rspec/matchers/have_selector.rb +15 -7
- data/lib/capybara/rspec/matchers/have_sibling.rb +3 -3
- data/lib/capybara/rspec/matchers/have_text.rb +2 -2
- data/lib/capybara/rspec/matchers/have_title.rb +2 -2
- data/lib/capybara/rspec/matchers/match_selector.rb +3 -3
- data/lib/capybara/rspec/matchers/match_style.rb +2 -2
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +2 -1
- data/lib/capybara/selector.rb +24 -16
- data/lib/capybara/selector/css.rb +1 -1
- data/lib/capybara/selector/definition.rb +2 -2
- data/lib/capybara/selector/definition/button.rb +7 -2
- data/lib/capybara/selector/definition/checkbox.rb +2 -2
- data/lib/capybara/selector/definition/css.rb +3 -1
- data/lib/capybara/selector/definition/datalist_input.rb +1 -1
- data/lib/capybara/selector/definition/datalist_option.rb +1 -1
- data/lib/capybara/selector/definition/element.rb +1 -1
- data/lib/capybara/selector/definition/field.rb +1 -1
- data/lib/capybara/selector/definition/file_field.rb +1 -1
- data/lib/capybara/selector/definition/fillable_field.rb +1 -1
- data/lib/capybara/selector/definition/label.rb +4 -2
- data/lib/capybara/selector/definition/radio_button.rb +2 -2
- data/lib/capybara/selector/definition/select.rb +32 -13
- data/lib/capybara/selector/definition/table.rb +5 -2
- data/lib/capybara/selector/filter_set.rb +11 -9
- data/lib/capybara/selector/filters/base.rb +6 -1
- data/lib/capybara/selector/filters/locator_filter.rb +1 -1
- data/lib/capybara/selector/selector.rb +4 -2
- data/lib/capybara/selenium/driver.rb +19 -11
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +1 -1
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +2 -2
- data/lib/capybara/selenium/extensions/html5_drag.rb +30 -13
- data/lib/capybara/selenium/node.rb +29 -10
- data/lib/capybara/selenium/nodes/chrome_node.rb +11 -5
- data/lib/capybara/selenium/nodes/edge_node.rb +4 -2
- data/lib/capybara/selenium/nodes/firefox_node.rb +2 -2
- data/lib/capybara/server.rb +15 -3
- data/lib/capybara/server/checker.rb +1 -1
- data/lib/capybara/server/middleware.rb +20 -10
- data/lib/capybara/session.rb +40 -23
- data/lib/capybara/session/config.rb +6 -2
- data/lib/capybara/session/matchers.rb +6 -6
- data/lib/capybara/spec/public/test.js +51 -6
- data/lib/capybara/spec/session/all_spec.rb +60 -5
- data/lib/capybara/spec/session/ancestor_spec.rb +5 -0
- data/lib/capybara/spec/session/assert_text_spec.rb +9 -5
- data/lib/capybara/spec/session/click_button_spec.rb +5 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +20 -0
- data/lib/capybara/spec/session/find_spec.rb +20 -0
- data/lib/capybara/spec/session/has_css_spec.rb +3 -3
- data/lib/capybara/spec/session/has_select_spec.rb +28 -0
- data/lib/capybara/spec/session/has_table_spec.rb +51 -5
- data/lib/capybara/spec/session/has_text_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +106 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/save_screenshot_spec.rb +4 -4
- data/lib/capybara/spec/session/selectors_spec.rb +15 -2
- data/lib/capybara/spec/views/form.erb +11 -1
- data/lib/capybara/version.rb +1 -1
- data/spec/dsl_spec.rb +2 -2
- data/spec/minitest_spec_spec.rb +46 -46
- data/spec/rack_test_spec.rb +0 -1
- data/spec/regexp_dissassembler_spec.rb +45 -37
- data/spec/result_spec.rb +7 -3
- data/spec/rspec/features_spec.rb +1 -0
- data/spec/rspec/shared_spec_matchers.rb +3 -3
- data/spec/rspec_spec.rb +4 -4
- data/spec/selenium_spec_chrome.rb +5 -4
- data/spec/selenium_spec_firefox.rb +7 -2
- data/spec/server_spec.rb +42 -0
- data/spec/session_spec.rb +1 -1
- data/spec/shared_selenium_node.rb +3 -3
- data/spec/shared_selenium_session.rb +8 -7
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd31d35629d475d7fdaba1d6e415599d995a08f27b28fa619a3a4449b61b91d8
|
4
|
+
data.tar.gz: 27c812629e2d99e8f4c62fa7961df9b499c5346b1c61092faf487f592356033d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 946e3f2de0137ddaa6e3a2febba2c87244997737c54a10024133de110ca41b8aeddcb66e0437bef5d826e9fe21d4c42701674c3864bd578d24c30c7b1f90e2a9
|
7
|
+
data.tar.gz: f9409de3e2e0ea44e0bb6b6f77cce7e0e8f5a4d95c43fb62af2eb63d11e755d6a8c00b9b9b4d2bbe2729538d0d1038e92468e0a7994d1578b50e05b5227b87f4
|
data/History.md
CHANGED
@@ -1,5 +1,44 @@
|
|
1
|
+
# Version 3.31.0
|
2
|
+
Release date: 2020-01-26
|
3
|
+
|
4
|
+
### Added
|
5
|
+
|
6
|
+
* Support setting range inputs with the selenium driver [Andrew White]
|
7
|
+
* Support setting range inputs with the rack driver
|
8
|
+
* Support drop modifier keys in drag & drop [Elliot Crosby-McCullough]
|
9
|
+
* `enabled_options` and `disabled options` filters for select selector
|
10
|
+
* Support beginless ranges
|
11
|
+
* Optionally allow `all` results to be reloaded when stable - Beta feature - may be removed in
|
12
|
+
future version if problems occur
|
13
|
+
|
14
|
+
### Fixed
|
15
|
+
|
16
|
+
* Fix Ruby 2.7 deprecation notices around keyword arguments. I have tried to do this without
|
17
|
+
any breaking changes, but due to the nature of the 2.7 changes and some selector types accepting
|
18
|
+
Hashes as locators there are a lot of edge cases. If you find any broken cases please report
|
19
|
+
them and I'll see if they're fixable.
|
20
|
+
* Clicking on details/summary element behavior in rack_test driver_
|
21
|
+
|
22
|
+
# Version 3.30.0
|
23
|
+
Release date: 2019-12-24
|
24
|
+
|
25
|
+
### Added
|
26
|
+
|
27
|
+
* Display pending requests when they don't complete in time [Juan Carlos Medina]
|
28
|
+
* :order option in selector queries - set to :reverse to for reverse document order results
|
29
|
+
* Support regexp for :name and :placeholder options in selectors that import filters from
|
30
|
+
_field filter set
|
31
|
+
|
32
|
+
### Fixed
|
33
|
+
|
34
|
+
* Issue around automatic port assignment - Issue #2245
|
35
|
+
* Label selector when label has no id - Issue #2260
|
36
|
+
* Preserve clientX/clientY in Selenium HTML5 drag emulation [Nicolò G.]
|
37
|
+
* table selector using :with_cols option if last specified column matched but others didn't - Issue #2287
|
38
|
+
* Some tests updated for Ruby 2.7 behavior change around keyword args
|
39
|
+
|
1
40
|
# Version 3.29.0
|
2
|
-
Release date:
|
41
|
+
Release date: 2019-09-02
|
3
42
|
|
4
43
|
### Added
|
5
44
|
|
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.31.x stable branch of Capybara.
|
11
11
|
|
12
12
|
Capybara helps you test web applications by simulating how a real user would
|
13
13
|
interact with your app. It is agnostic about the driver running your tests and
|
data/lib/capybara/config.rb
CHANGED
@@ -27,7 +27,9 @@ module Capybara
|
|
27
27
|
attr_writer :reuse_server
|
28
28
|
|
29
29
|
def threadsafe=(bool)
|
30
|
-
|
30
|
+
if (bool != threadsafe) && Session.instance_created?
|
31
|
+
raise 'Threadsafe setting cannot be changed once a session is created'
|
32
|
+
end
|
31
33
|
|
32
34
|
@threadsafe = bool
|
33
35
|
end
|
@@ -59,7 +61,7 @@ module Capybara
|
|
59
61
|
@server = if name.respond_to? :call
|
60
62
|
name
|
61
63
|
elsif options
|
62
|
-
proc { |app, port, host| Capybara.servers[name.to_sym].call(app, port, host, options) }
|
64
|
+
proc { |app, port, host| Capybara.servers[name.to_sym].call(app, port, host, **options) }
|
63
65
|
else
|
64
66
|
Capybara.servers[name.to_sym]
|
65
67
|
end
|
@@ -83,7 +85,9 @@ module Capybara
|
|
83
85
|
|
84
86
|
def deprecate(method, alternate_method, once = false)
|
85
87
|
@deprecation_notified ||= {}
|
86
|
-
|
88
|
+
unless once && @deprecation_notified[method]
|
89
|
+
warn "DEPRECATED: ##{method} is deprecated, please use ##{alternate_method} instead"
|
90
|
+
end
|
87
91
|
@deprecation_notified[method] = true
|
88
92
|
end
|
89
93
|
end
|
data/lib/capybara/dsl.rb
CHANGED
@@ -47,8 +47,16 @@ module Capybara
|
|
47
47
|
end
|
48
48
|
|
49
49
|
Session::DSL_METHODS.each do |method|
|
50
|
-
|
51
|
-
|
50
|
+
if RUBY_VERSION >= '2.7'
|
51
|
+
class_eval <<~METHOD, __FILE__, __LINE__ + 1
|
52
|
+
def #{method}(...)
|
53
|
+
page.method("#{method}").call(...)
|
54
|
+
end
|
55
|
+
METHOD
|
56
|
+
else
|
57
|
+
define_method method do |*args, &block|
|
58
|
+
page.send method, *args, &block
|
59
|
+
end
|
52
60
|
end
|
53
61
|
end
|
54
62
|
end
|
data/lib/capybara/helpers.rb
CHANGED
@@ -87,7 +87,9 @@ module Capybara
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def expired?
|
90
|
-
|
90
|
+
if stalled?
|
91
|
+
raise Capybara::FrozenInTime, 'Time appears to be frozen. Capybara does not work with libraries which freeze time, consider using time travelling instead'
|
92
|
+
end
|
91
93
|
|
92
94
|
current - @start >= @expire_in
|
93
95
|
end
|
data/lib/capybara/minitest.rb
CHANGED
@@ -52,6 +52,7 @@ module Capybara
|
|
52
52
|
raise ::Minitest::Assertion, e.message
|
53
53
|
end
|
54
54
|
ASSERTION
|
55
|
+
ruby2_keywords "assert_#{assertion_name}" if respond_to?(:ruby2_keywords)
|
55
56
|
end
|
56
57
|
|
57
58
|
alias_method :refute_title, :assert_no_title
|
@@ -109,6 +110,7 @@ module Capybara
|
|
109
110
|
raise ::Minitest::Assertion, e.message
|
110
111
|
end
|
111
112
|
ASSERTION
|
113
|
+
ruby2_keywords "assert_#{assertion_name}" if respond_to?(:ruby2_keywords)
|
112
114
|
end
|
113
115
|
|
114
116
|
alias_method :refute_selector, :assert_no_selector
|
@@ -120,14 +122,16 @@ module Capybara
|
|
120
122
|
define_method "assert_#{selector_type}" do |*args, &optional_filter_block|
|
121
123
|
subject, args = determine_subject(args)
|
122
124
|
locator, options = extract_locator(args)
|
123
|
-
assert_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
|
125
|
+
assert_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
|
124
126
|
end
|
127
|
+
ruby2_keywords "assert_#{selector_type}" if respond_to?(:ruby2_keywords)
|
125
128
|
|
126
129
|
define_method "assert_no_#{selector_type}" do |*args, &optional_filter_block|
|
127
130
|
subject, args = determine_subject(args)
|
128
131
|
locator, options = extract_locator(args)
|
129
|
-
assert_no_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
|
132
|
+
assert_no_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
|
130
133
|
end
|
134
|
+
ruby2_keywords "assert_no_#{selector_type}" if respond_to?(:ruby2_keywords)
|
131
135
|
alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
|
132
136
|
end
|
133
137
|
|
@@ -135,14 +139,22 @@ module Capybara
|
|
135
139
|
define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
|
136
140
|
subject, args = determine_subject(args)
|
137
141
|
locator, options = extract_locator(args)
|
138
|
-
assert_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
|
142
|
+
assert_selector(subject, :field, locator, **options.merge(field_type.to_sym => true), &optional_filter_block)
|
139
143
|
end
|
144
|
+
ruby2_keywords "assert_#{field_type}_field" if respond_to?(:ruby2_keywords)
|
140
145
|
|
141
146
|
define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
|
142
147
|
subject, args = determine_subject(args)
|
143
148
|
locator, options = extract_locator(args)
|
144
|
-
assert_no_selector(
|
149
|
+
assert_no_selector(
|
150
|
+
subject,
|
151
|
+
:field,
|
152
|
+
locator,
|
153
|
+
**options.merge(field_type.to_sym => true),
|
154
|
+
&optional_filter_block
|
155
|
+
)
|
145
156
|
end
|
157
|
+
ruby2_keywords "assert_no_#{field_type}_field" if respond_to?(:ruby2_keywords)
|
146
158
|
alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
|
147
159
|
end
|
148
160
|
|
@@ -151,11 +163,13 @@ module Capybara
|
|
151
163
|
subject, args = determine_subject(args)
|
152
164
|
assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
|
153
165
|
end
|
166
|
+
ruby2_keywords "assert_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
|
154
167
|
|
155
168
|
define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
|
156
169
|
subject, args = determine_subject(args)
|
157
170
|
assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
|
158
171
|
end
|
172
|
+
ruby2_keywords "assert_not_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
|
159
173
|
alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
|
160
174
|
end
|
161
175
|
|
@@ -23,7 +23,7 @@ module Capybara
|
|
23
23
|
# @return [Capybara::Node::Element] The element clicked
|
24
24
|
#
|
25
25
|
def click_link_or_button(locator = nil, **options)
|
26
|
-
find(:link_or_button, locator, options).click
|
26
|
+
find(:link_or_button, locator, **options).click
|
27
27
|
end
|
28
28
|
alias_method :click_on, :click_link_or_button
|
29
29
|
|
@@ -39,7 +39,7 @@ module Capybara
|
|
39
39
|
#
|
40
40
|
# @return [Capybara::Node::Element] The element clicked
|
41
41
|
def click_link(locator = nil, **options)
|
42
|
-
find(:link, locator, options).click
|
42
|
+
find(:link, locator, **options).click
|
43
43
|
end
|
44
44
|
|
45
45
|
##
|
@@ -55,7 +55,7 @@ module Capybara
|
|
55
55
|
# @param [Hash] options See {Capybara::Node::Finders#find_button}
|
56
56
|
# @return [Capybara::Node::Element] The element clicked
|
57
57
|
def click_button(locator = nil, **options)
|
58
|
-
find(:button, locator, options).click
|
58
|
+
find(:button, locator, **options).click
|
59
59
|
end
|
60
60
|
|
61
61
|
##
|
@@ -88,7 +88,7 @@ module Capybara
|
|
88
88
|
def fill_in(locator = nil, with:, currently_with: nil, fill_options: {}, **find_options)
|
89
89
|
find_options[:with] = currently_with if currently_with
|
90
90
|
find_options[:allow_self] = true if locator.nil?
|
91
|
-
find(:fillable_field, locator, find_options).set(with, fill_options)
|
91
|
+
find(:fillable_field, locator, **find_options).set(with, **fill_options)
|
92
92
|
end
|
93
93
|
|
94
94
|
# @!macro label_click
|
@@ -119,7 +119,7 @@ module Capybara
|
|
119
119
|
#
|
120
120
|
# @return [Capybara::Node::Element] The element chosen or the label clicked
|
121
121
|
def choose(locator = nil, **options)
|
122
|
-
_check_with_label(:radio_button, true, locator, options)
|
122
|
+
_check_with_label(:radio_button, true, locator, **options)
|
123
123
|
end
|
124
124
|
|
125
125
|
##
|
@@ -147,7 +147,7 @@ module Capybara
|
|
147
147
|
#
|
148
148
|
# @return [Capybara::Node::Element] The element checked or the label clicked
|
149
149
|
def check(locator = nil, **options)
|
150
|
-
_check_with_label(:checkbox, true, locator, options)
|
150
|
+
_check_with_label(:checkbox, true, locator, **options)
|
151
151
|
end
|
152
152
|
|
153
153
|
##
|
@@ -175,7 +175,7 @@ module Capybara
|
|
175
175
|
#
|
176
176
|
# @return [Capybara::Node::Element] The element unchecked or the label clicked
|
177
177
|
def uncheck(locator = nil, **options)
|
178
|
-
_check_with_label(:checkbox, false, locator, options)
|
178
|
+
_check_with_label(:checkbox, false, locator, **options)
|
179
179
|
end
|
180
180
|
|
181
181
|
##
|
@@ -205,7 +205,7 @@ module Capybara
|
|
205
205
|
if el.respond_to?(:tag_name) && (el.tag_name == 'input')
|
206
206
|
select_datalist_option(el, value)
|
207
207
|
else
|
208
|
-
el.find(:option, value, options).select_option
|
208
|
+
el.find(:option, value, **options).select_option
|
209
209
|
end
|
210
210
|
end
|
211
211
|
|
@@ -229,8 +229,8 @@ module Capybara
|
|
229
229
|
def unselect(value = nil, from: nil, **options)
|
230
230
|
raise ArgumentError, 'The :from option does not take an element' if from.is_a? Capybara::Node::Element
|
231
231
|
|
232
|
-
scope = from ? find(:select, from, options) : self
|
233
|
-
scope.find(:option, value, options).unselect_option
|
232
|
+
scope = from ? find(:select, from, **options) : self
|
233
|
+
scope.find(:option, value, **options).unselect_option
|
234
234
|
end
|
235
235
|
|
236
236
|
##
|
@@ -276,7 +276,9 @@ module Capybara
|
|
276
276
|
# @yield Block whose actions will trigger the system file chooser to be shown
|
277
277
|
# @return [Capybara::Node::Element] The file field element
|
278
278
|
def attach_file(locator = nil, paths, make_visible: nil, **options) # rubocop:disable Style/OptionalArguments
|
279
|
-
|
279
|
+
if locator && block_given?
|
280
|
+
raise ArgumentError, '``#attach_file` does not support passing both a locator and a block'
|
281
|
+
end
|
280
282
|
|
281
283
|
Array(paths).each do |path|
|
282
284
|
raise Capybara::FileNotFound, "cannot attach file, #{path} does not exist" unless File.exist?(path.to_s)
|
@@ -295,10 +297,10 @@ module Capybara
|
|
295
297
|
end
|
296
298
|
# Allow user to update the CSS style of the file input since they are so often hidden on a page
|
297
299
|
if make_visible
|
298
|
-
ff = file_field || find(:file_field, locator, options.merge(visible: :all))
|
300
|
+
ff = file_field || find(:file_field, locator, **options.merge(visible: :all))
|
299
301
|
while_visible(ff, make_visible) { |el| el.set(paths) }
|
300
302
|
else
|
301
|
-
(file_field || find(:file_field, locator, options)).set(paths)
|
303
|
+
(file_field || find(:file_field, locator, **options)).set(paths)
|
302
304
|
end
|
303
305
|
end
|
304
306
|
|
@@ -307,12 +309,12 @@ module Capybara
|
|
307
309
|
def find_select_or_datalist_input(from, options)
|
308
310
|
synchronize(Capybara::Queries::BaseQuery.wait(options, session_options.default_max_wait_time)) do
|
309
311
|
begin
|
310
|
-
find(:select, from, options)
|
312
|
+
find(:select, from, **options)
|
311
313
|
rescue Capybara::ElementNotFound => select_error # rubocop:disable Naming/RescuedExceptionsVariableName
|
312
314
|
raise if %i[selected with_selected multiple].any? { |option| options.key?(option) }
|
313
315
|
|
314
316
|
begin
|
315
|
-
find(:datalist_input, from, options)
|
317
|
+
find(:datalist_input, from, **options)
|
316
318
|
rescue Capybara::ElementNotFound => dlinput_error # rubocop:disable Naming/RescuedExceptionsVariableName
|
317
319
|
raise Capybara::ElementNotFound, "#{select_error.message} and #{dlinput_error.message}"
|
318
320
|
end
|
@@ -338,7 +340,9 @@ module Capybara
|
|
338
340
|
visible_css = { opacity: 1, display: 'block', visibility: 'visible', width: 'auto', height: 'auto' }
|
339
341
|
end
|
340
342
|
_update_style(element, visible_css)
|
341
|
-
|
343
|
+
unless element.visible?
|
344
|
+
raise ExpectationNotMet, 'The style changes in :make_visible did not make the file input visible'
|
345
|
+
end
|
342
346
|
|
343
347
|
begin
|
344
348
|
yield element
|
@@ -355,7 +359,7 @@ module Capybara
|
|
355
359
|
|
356
360
|
def _reset_style(element)
|
357
361
|
element.execute_script(RESET_STYLE_SCRIPT)
|
358
|
-
rescue StandardError # rubocop:disable Lint/
|
362
|
+
rescue StandardError # rubocop:disable Lint/SuppressedException swallow extra errors
|
359
363
|
end
|
360
364
|
|
361
365
|
def _check_with_label(selector, checked, locator,
|
@@ -364,13 +368,13 @@ module Capybara
|
|
364
368
|
|
365
369
|
synchronize(Capybara::Queries::BaseQuery.wait(options, session_options.default_max_wait_time)) do
|
366
370
|
begin
|
367
|
-
el = find(selector, locator, options)
|
371
|
+
el = find(selector, locator, **options)
|
368
372
|
el.set(checked)
|
369
373
|
rescue StandardError => e
|
370
374
|
raise unless allow_label_click && catch_error?(e)
|
371
375
|
|
372
376
|
begin
|
373
|
-
el ||= find(selector, locator, options.merge(visible: :all))
|
377
|
+
el ||= find(selector, locator, **options.merge(visible: :all))
|
374
378
|
el.session.find(:label, for: el, visible: true).click unless el.checked? == checked
|
375
379
|
rescue StandardError # swallow extra errors - raise original
|
376
380
|
raise e
|
@@ -42,7 +42,7 @@ module Capybara
|
|
42
42
|
# @return [Boolean]
|
43
43
|
#
|
44
44
|
def has_title?(title, **options)
|
45
|
-
make_predicate(options) { assert_title(title, options) }
|
45
|
+
make_predicate(options) { assert_title(title, **options) }
|
46
46
|
end
|
47
47
|
|
48
48
|
##
|
@@ -52,13 +52,13 @@ module Capybara
|
|
52
52
|
# @return [Boolean]
|
53
53
|
#
|
54
54
|
def has_no_title?(title, **options)
|
55
|
-
make_predicate(options) { assert_no_title(title, options) }
|
55
|
+
make_predicate(options) { assert_no_title(title, **options) }
|
56
56
|
end
|
57
57
|
|
58
58
|
private
|
59
59
|
|
60
60
|
def _verify_title(title, options)
|
61
|
-
query = Capybara::Queries::TitleQuery.new(title, options)
|
61
|
+
query = Capybara::Queries::TitleQuery.new(title, **options)
|
62
62
|
synchronize(query.wait) { yield(query) }
|
63
63
|
true
|
64
64
|
end
|
@@ -27,9 +27,11 @@ module Capybara
|
|
27
27
|
@query_scope = query_scope
|
28
28
|
@query = query
|
29
29
|
@allow_reload = false
|
30
|
+
@query_idx = nil
|
30
31
|
end
|
31
32
|
|
32
|
-
def allow_reload!
|
33
|
+
def allow_reload!(idx = nil)
|
34
|
+
@query_idx = idx
|
33
35
|
@allow_reload = true
|
34
36
|
end
|
35
37
|
|
@@ -113,10 +115,12 @@ module Capybara
|
|
113
115
|
#
|
114
116
|
# @return [Capybara::Node::Element] The element
|
115
117
|
def set(value, **options)
|
116
|
-
|
118
|
+
if ENV['CAPYBARA_THOROUGH'] && readonly?
|
119
|
+
raise Capybara::ReadOnlyElementError, "Attempt to set readonly element with value: #{value}"
|
120
|
+
end
|
117
121
|
|
118
122
|
options = session_options.default_set_options.to_h.merge(options)
|
119
|
-
synchronize { base.set(value, options) }
|
123
|
+
synchronize { base.set(value, **options) }
|
120
124
|
self
|
121
125
|
end
|
122
126
|
|
@@ -163,8 +167,8 @@ module Capybara
|
|
163
167
|
# offset will be from the element center, otherwise it will be from the top left corner of the element
|
164
168
|
# @return [Capybara::Node::Element] The element
|
165
169
|
def click(*keys, **options)
|
166
|
-
perform_click_action(keys, options) do |k, opts|
|
167
|
-
base.click(k, opts)
|
170
|
+
perform_click_action(keys, **options) do |k, opts|
|
171
|
+
base.click(k, **opts)
|
168
172
|
end
|
169
173
|
end
|
170
174
|
|
@@ -176,8 +180,8 @@ module Capybara
|
|
176
180
|
# @macro click_modifiers
|
177
181
|
# @return [Capybara::Node::Element] The element
|
178
182
|
def right_click(*keys, **options)
|
179
|
-
perform_click_action(keys, options) do |k, opts|
|
180
|
-
base.right_click(k, opts)
|
183
|
+
perform_click_action(keys, **options) do |k, opts|
|
184
|
+
base.right_click(k, **opts)
|
181
185
|
end
|
182
186
|
end
|
183
187
|
|
@@ -189,8 +193,8 @@ module Capybara
|
|
189
193
|
# @macro click_modifiers
|
190
194
|
# @return [Capybara::Node::Element] The element
|
191
195
|
def double_click(*keys, **options)
|
192
|
-
perform_click_action(keys, options) do |k, opts|
|
193
|
-
base.double_click(k, opts)
|
196
|
+
perform_click_action(keys, **options) do |k, opts|
|
197
|
+
base.double_click(k, **opts)
|
194
198
|
end
|
195
199
|
end
|
196
200
|
|
@@ -405,6 +409,8 @@ module Capybara
|
|
405
409
|
# @option options [Boolean] :html5 When using Chrome/Firefox with Selenium enables to force the use of HTML5
|
406
410
|
# (true) or legacy (false) dragging. If not specified the driver will attempt to
|
407
411
|
# detect the correct method to use.
|
412
|
+
# @option options [Array<Symbol>,Symbol] :drop_modifiers Modifier keys which should be held while the dragged element is dropped.
|
413
|
+
#
|
408
414
|
#
|
409
415
|
# @return [Capybara::Node::Element] The dragged element
|
410
416
|
def drag_to(node, **options)
|
@@ -543,14 +549,13 @@ module Capybara
|
|
543
549
|
|
544
550
|
# @api private
|
545
551
|
def reload
|
546
|
-
|
547
|
-
begin
|
548
|
-
reloaded = @query.resolve_for(query_scope.reload)&.first
|
552
|
+
return self unless @allow_reload
|
549
553
|
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
+
begin
|
555
|
+
reloaded = @query.resolve_for(query_scope.reload)[@query_idx.to_i]
|
556
|
+
@base = reloaded.base if reloaded
|
557
|
+
rescue StandardError => e
|
558
|
+
raise e unless catch_error?(e)
|
554
559
|
end
|
555
560
|
self
|
556
561
|
end
|