capybara 2.18.0 → 3.0.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 +55 -1
- data/README.md +18 -17
- data/lib/capybara/config.rb +11 -58
- data/lib/capybara/cucumber.rb +2 -3
- data/lib/capybara/driver/base.rb +15 -16
- data/lib/capybara/driver/node.rb +5 -4
- data/lib/capybara/dsl.rb +1 -0
- data/lib/capybara/helpers.rb +19 -29
- data/lib/capybara/minitest/spec.rb +15 -14
- data/lib/capybara/minitest.rb +139 -138
- data/lib/capybara/node/actions.rb +60 -81
- data/lib/capybara/node/base.rb +11 -18
- data/lib/capybara/node/document.rb +2 -2
- data/lib/capybara/node/document_matchers.rb +8 -8
- data/lib/capybara/node/element.rb +30 -40
- data/lib/capybara/node/finders.rb +62 -70
- data/lib/capybara/node/matchers.rb +50 -71
- data/lib/capybara/node/simple.rb +11 -17
- data/lib/capybara/queries/ancestor_query.rb +11 -7
- data/lib/capybara/queries/base_query.rb +22 -18
- data/lib/capybara/queries/current_path_query.rb +8 -24
- data/lib/capybara/queries/match_query.rb +3 -7
- data/lib/capybara/queries/selector_query.rb +92 -95
- data/lib/capybara/queries/sibling_query.rb +4 -4
- data/lib/capybara/queries/text_query.rb +35 -35
- data/lib/capybara/queries/title_query.rb +8 -11
- data/lib/capybara/rack_test/browser.rb +15 -18
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +6 -10
- data/lib/capybara/rack_test/form.rb +50 -40
- data/lib/capybara/rack_test/node.rb +93 -63
- data/lib/capybara/rails.rb +2 -6
- data/lib/capybara/result.rb +22 -22
- data/lib/capybara/rspec/compound.rb +5 -10
- data/lib/capybara/rspec/features.rb +17 -48
- data/lib/capybara/rspec/matcher_proxies.rb +31 -15
- data/lib/capybara/rspec/matchers.rb +70 -61
- data/lib/capybara/rspec.rb +5 -10
- data/lib/capybara/selector/css.rb +6 -11
- data/lib/capybara/selector/filter.rb +1 -17
- data/lib/capybara/selector/filter_set.rb +18 -15
- data/lib/capybara/selector/filters/base.rb +7 -6
- data/lib/capybara/selector/filters/expression_filter.rb +6 -23
- data/lib/capybara/selector/filters/node_filter.rb +2 -12
- data/lib/capybara/selector/selector.rb +28 -34
- data/lib/capybara/selector.rb +129 -117
- data/lib/capybara/selenium/driver.rb +131 -125
- data/lib/capybara/selenium/node.rb +197 -115
- data/lib/capybara/server.rb +3 -2
- data/lib/capybara/session/config.rb +47 -67
- data/lib/capybara/session/matchers.rb +8 -7
- data/lib/capybara/session.rb +138 -224
- data/lib/capybara/spec/public/test.js +25 -4
- data/lib/capybara/spec/session/accept_alert_spec.rb +1 -0
- data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -2
- data/lib/capybara/spec/session/accept_prompt_spec.rb +1 -0
- data/lib/capybara/spec/session/all_spec.rb +31 -18
- data/lib/capybara/spec/session/ancestor_spec.rb +6 -8
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +6 -5
- data/lib/capybara/spec/session/assert_current_path.rb +12 -11
- data/lib/capybara/spec/session/assert_selector.rb +1 -0
- data/lib/capybara/spec/session/assert_text.rb +23 -23
- data/lib/capybara/spec/session/assert_title.rb +13 -3
- data/lib/capybara/spec/session/attach_file_spec.rb +51 -30
- data/lib/capybara/spec/session/body_spec.rb +1 -0
- data/lib/capybara/spec/session/check_spec.rb +7 -6
- data/lib/capybara/spec/session/choose_spec.rb +5 -4
- data/lib/capybara/spec/session/click_button_spec.rb +24 -32
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +8 -7
- data/lib/capybara/spec/session/click_link_spec.rb +8 -7
- data/lib/capybara/spec/session/current_scope_spec.rb +4 -3
- data/lib/capybara/spec/session/current_url_spec.rb +17 -6
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -0
- data/lib/capybara/spec/session/element/assert_match_selector.rb +1 -1
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +1 -1
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +5 -5
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +3 -2
- data/lib/capybara/spec/session/evaluate_script_spec.rb +4 -3
- data/lib/capybara/spec/session/execute_script_spec.rb +4 -3
- data/lib/capybara/spec/session/fill_in_spec.rb +30 -5
- data/lib/capybara/spec/session/find_button_spec.rb +4 -3
- data/lib/capybara/spec/session/find_by_id_spec.rb +2 -1
- data/lib/capybara/spec/session/find_field_spec.rb +9 -15
- data/lib/capybara/spec/session/find_link_spec.rb +6 -5
- data/lib/capybara/spec/session/find_spec.rb +37 -31
- data/lib/capybara/spec/session/first_spec.rb +60 -33
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +2 -1
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +9 -16
- data/lib/capybara/spec/session/go_back_spec.rb +1 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +15 -15
- data/lib/capybara/spec/session/has_button_spec.rb +2 -1
- data/lib/capybara/spec/session/has_css_spec.rb +3 -2
- data/lib/capybara/spec/session/has_current_path_spec.rb +12 -28
- data/lib/capybara/spec/session/has_field_spec.rb +4 -3
- data/lib/capybara/spec/session/has_link_spec.rb +1 -0
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +17 -17
- data/lib/capybara/spec/session/has_select_spec.rb +30 -29
- data/lib/capybara/spec/session/has_selector_spec.rb +5 -4
- data/lib/capybara/spec/session/has_table_spec.rb +2 -1
- data/lib/capybara/spec/session/has_text_spec.rb +9 -13
- data/lib/capybara/spec/session/has_title_spec.rb +1 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
- data/lib/capybara/spec/session/headers.rb +2 -1
- data/lib/capybara/spec/session/html_spec.rb +1 -0
- data/lib/capybara/spec/session/node_spec.rb +91 -56
- data/lib/capybara/spec/session/node_wrapper_spec.rb +36 -0
- data/lib/capybara/spec/session/refresh_spec.rb +6 -2
- data/lib/capybara/spec/session/reset_session_spec.rb +19 -0
- data/lib/capybara/spec/session/response_code.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -11
- data/lib/capybara/spec/session/save_page_spec.rb +1 -17
- data/lib/capybara/spec/session/save_screenshot_spec.rb +3 -3
- data/lib/capybara/spec/session/select_spec.rb +20 -20
- data/lib/capybara/spec/session/selectors_spec.rb +2 -2
- data/lib/capybara/spec/session/sibling_spec.rb +1 -1
- data/lib/capybara/spec/session/text_spec.rb +17 -3
- data/lib/capybara/spec/session/title_spec.rb +11 -1
- data/lib/capybara/spec/session/uncheck_spec.rb +4 -3
- data/lib/capybara/spec/session/unselect_spec.rb +6 -5
- data/lib/capybara/spec/session/visit_spec.rb +9 -3
- data/lib/capybara/spec/session/window/become_closed_spec.rb +2 -1
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +2 -1
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
- data/lib/capybara/spec/session/window/window_spec.rb +12 -12
- data/lib/capybara/spec/session/window/windows_spec.rb +2 -3
- data/lib/capybara/spec/session/window/within_window_spec.rb +15 -71
- data/lib/capybara/spec/session/within_spec.rb +1 -0
- data/lib/capybara/spec/spec_helper.rb +34 -18
- data/lib/capybara/spec/test_app.rb +17 -9
- data/lib/capybara/spec/views/form.erb +7 -0
- data/lib/capybara/spec/views/with_html.erb +23 -1
- data/lib/capybara/spec/views/within_frames.erb +4 -1
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +6 -10
- data/lib/capybara.rb +28 -25
- data/spec/basic_node_spec.rb +1 -0
- data/spec/capybara_spec.rb +11 -50
- data/spec/dsl_spec.rb +5 -13
- data/spec/filter_set_spec.rb +5 -4
- data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +3 -2
- data/spec/minitest_spec.rb +4 -3
- data/spec/minitest_spec_spec.rb +3 -2
- data/spec/per_session_config_spec.rb +9 -8
- data/spec/rack_test_spec.rb +21 -20
- data/spec/result_spec.rb +17 -16
- data/spec/rspec/features_spec.rb +17 -14
- data/spec/rspec/scenarios_spec.rb +5 -7
- data/spec/rspec/shared_spec_matchers.rb +96 -99
- data/spec/rspec/views_spec.rb +2 -1
- data/spec/rspec_matchers_spec.rb +18 -2
- data/spec/rspec_spec.rb +11 -15
- data/spec/selector_spec.rb +5 -6
- data/spec/selenium_spec_chrome.rb +9 -4
- data/spec/selenium_spec_edge.rb +27 -0
- data/spec/selenium_spec_ie.rb +31 -0
- data/spec/selenium_spec_marionette.rb +28 -12
- data/spec/server_spec.rb +33 -33
- data/spec/session_spec.rb +2 -1
- data/spec/shared_selenium_session.rb +36 -22
- data/spec/spec_helper.rb +3 -6
- metadata +68 -85
- data/lib/capybara/query.rb +0 -7
- data/spec/selenium_spec_firefox.rb +0 -68
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Capybara
|
3
4
|
module Node
|
4
5
|
module Matchers
|
5
|
-
|
6
6
|
##
|
7
7
|
#
|
8
8
|
# Checks if a given selector is on the page or a descendant of the current node.
|
@@ -39,7 +39,7 @@ module Capybara
|
|
39
39
|
def has_selector?(*args, &optional_filter_block)
|
40
40
|
assert_selector(*args, &optional_filter_block)
|
41
41
|
rescue Capybara::ExpectationNotMet
|
42
|
-
|
42
|
+
false
|
43
43
|
end
|
44
44
|
|
45
45
|
##
|
@@ -53,7 +53,7 @@ module Capybara
|
|
53
53
|
def has_no_selector?(*args, &optional_filter_block)
|
54
54
|
assert_no_selector(*args, &optional_filter_block)
|
55
55
|
rescue Capybara::ExpectationNotMet
|
56
|
-
|
56
|
+
false
|
57
57
|
end
|
58
58
|
|
59
59
|
##
|
@@ -91,7 +91,7 @@ module Capybara
|
|
91
91
|
#
|
92
92
|
def assert_selector(*args, &optional_filter_block)
|
93
93
|
_verify_selector_result(args, optional_filter_block) do |result, query|
|
94
|
-
unless result.matches_count? && (
|
94
|
+
unless result.matches_count? && (!result.empty? || query.expects_none?)
|
95
95
|
raise Capybara::ExpectationNotMet, result.failure_message
|
96
96
|
end
|
97
97
|
end
|
@@ -112,10 +112,9 @@ module Capybara
|
|
112
112
|
#
|
113
113
|
# @overload assert_all_of_selectors([kind = Capybara.default_selector], *locators, options = {})
|
114
114
|
#
|
115
|
-
def assert_all_of_selectors(*args, &optional_filter_block)
|
116
|
-
|
117
|
-
selector =
|
118
|
-
wait = options.fetch(:wait, session_options.default_max_wait_time)
|
115
|
+
def assert_all_of_selectors(*args, wait: nil, **options, &optional_filter_block)
|
116
|
+
wait = session_options.default_max_wait_time if wait.nil?
|
117
|
+
selector = args.first.is_a?(Symbol) ? args.shift : session_options.default_selector
|
119
118
|
synchronize(wait) do
|
120
119
|
args.each do |locator|
|
121
120
|
assert_selector(selector, locator, options, &optional_filter_block)
|
@@ -138,10 +137,9 @@ module Capybara
|
|
138
137
|
#
|
139
138
|
# @overload assert_none_of_selectors([kind = Capybara.default_selector], *locators, options = {})
|
140
139
|
#
|
141
|
-
def assert_none_of_selectors(*args, &optional_filter_block)
|
142
|
-
|
143
|
-
selector =
|
144
|
-
wait = options.fetch(:wait, session_options.default_max_wait_time)
|
140
|
+
def assert_none_of_selectors(*args, wait: nil, **options, &optional_filter_block)
|
141
|
+
wait = session_options.default_max_wait_time if wait.nil?
|
142
|
+
selector = args.first.is_a?(Symbol) ? args.shift : session_options.default_selector
|
145
143
|
synchronize(wait) do
|
146
144
|
args.each do |locator|
|
147
145
|
assert_no_selector(selector, locator, options, &optional_filter_block)
|
@@ -167,7 +165,7 @@ module Capybara
|
|
167
165
|
#
|
168
166
|
def assert_no_selector(*args, &optional_filter_block)
|
169
167
|
_verify_selector_result(args, optional_filter_block) do |result, query|
|
170
|
-
if result.matches_count? && (
|
168
|
+
if result.matches_count? && (!result.empty? || query.expects_none?)
|
171
169
|
raise Capybara::ExpectationNotMet, result.negative_failure_message
|
172
170
|
end
|
173
171
|
end
|
@@ -203,7 +201,7 @@ module Capybara
|
|
203
201
|
# @option options [Integer] :count (nil) Number of times the expression should occur
|
204
202
|
# @return [Boolean] If the expression exists
|
205
203
|
#
|
206
|
-
def has_xpath?(path, options
|
204
|
+
def has_xpath?(path, **options, &optional_filter_block)
|
207
205
|
has_selector?(:xpath, path, options, &optional_filter_block)
|
208
206
|
end
|
209
207
|
|
@@ -215,7 +213,7 @@ module Capybara
|
|
215
213
|
# @param (see Capybara::Node::Finders#has_xpath?)
|
216
214
|
# @return [Boolean]
|
217
215
|
#
|
218
|
-
def has_no_xpath?(path, options
|
216
|
+
def has_no_xpath?(path, **options, &optional_filter_block)
|
219
217
|
has_no_selector?(:xpath, path, options, &optional_filter_block)
|
220
218
|
end
|
221
219
|
|
@@ -242,7 +240,7 @@ module Capybara
|
|
242
240
|
# @option options [Integer] :count (nil) Number of times the selector should occur
|
243
241
|
# @return [Boolean] If the selector exists
|
244
242
|
#
|
245
|
-
def has_css?(path, options
|
243
|
+
def has_css?(path, **options, &optional_filter_block)
|
246
244
|
has_selector?(:css, path, options, &optional_filter_block)
|
247
245
|
end
|
248
246
|
|
@@ -254,7 +252,7 @@ module Capybara
|
|
254
252
|
# @param (see Capybara::Node::Finders#has_css?)
|
255
253
|
# @return [Boolean]
|
256
254
|
#
|
257
|
-
def has_no_css?(path, options
|
255
|
+
def has_no_css?(path, **options, &optional_filter_block)
|
258
256
|
has_no_selector?(:css, path, options, &optional_filter_block)
|
259
257
|
end
|
260
258
|
|
@@ -268,8 +266,7 @@ module Capybara
|
|
268
266
|
# @option options [String, Regexp] :href The value the href attribute must be
|
269
267
|
# @return [Boolean] Whether it exists
|
270
268
|
#
|
271
|
-
def has_link?(locator=nil, options
|
272
|
-
locator, options = nil, locator if locator.is_a? Hash
|
269
|
+
def has_link?(locator = nil, **options, &optional_filter_block)
|
273
270
|
has_selector?(:link, locator, options, &optional_filter_block)
|
274
271
|
end
|
275
272
|
|
@@ -281,8 +278,7 @@ module Capybara
|
|
281
278
|
# @param (see Capybara::Node::Finders#has_link?)
|
282
279
|
# @return [Boolean] Whether it doesn't exist
|
283
280
|
#
|
284
|
-
def has_no_link?(locator=nil, options
|
285
|
-
locator, options = nil, locator if locator.is_a? Hash
|
281
|
+
def has_no_link?(locator = nil, **options, &optional_filter_block)
|
286
282
|
has_no_selector?(:link, locator, options, &optional_filter_block)
|
287
283
|
end
|
288
284
|
|
@@ -294,8 +290,7 @@ module Capybara
|
|
294
290
|
# @param [String] locator The text, value or id of a button to check for
|
295
291
|
# @return [Boolean] Whether it exists
|
296
292
|
#
|
297
|
-
def has_button?(locator=nil, options
|
298
|
-
locator, options = nil, locator if locator.is_a? Hash
|
293
|
+
def has_button?(locator = nil, **options, &optional_filter_block)
|
299
294
|
has_selector?(:button, locator, options, &optional_filter_block)
|
300
295
|
end
|
301
296
|
|
@@ -307,8 +302,7 @@ module Capybara
|
|
307
302
|
# @param [String] locator The text, value or id of a button to check for
|
308
303
|
# @return [Boolean] Whether it doesn't exist
|
309
304
|
#
|
310
|
-
def has_no_button?(locator=nil, options
|
311
|
-
locator, options = nil, locator if locator.is_a? Hash
|
305
|
+
def has_no_button?(locator = nil, **options, &optional_filter_block)
|
312
306
|
has_no_selector?(:button, locator, options, &optional_filter_block)
|
313
307
|
end
|
314
308
|
|
@@ -334,8 +328,7 @@ module Capybara
|
|
334
328
|
# @option options [String] :type The type attribute of the field
|
335
329
|
# @return [Boolean] Whether it exists
|
336
330
|
#
|
337
|
-
def has_field?(locator=nil, options
|
338
|
-
locator, options = nil, locator if locator.is_a? Hash
|
331
|
+
def has_field?(locator = nil, **options, &optional_filter_block)
|
339
332
|
has_selector?(:field, locator, options, &optional_filter_block)
|
340
333
|
end
|
341
334
|
|
@@ -349,8 +342,7 @@ module Capybara
|
|
349
342
|
# @option options [String] :type The type attribute of the field
|
350
343
|
# @return [Boolean] Whether it doesn't exist
|
351
344
|
#
|
352
|
-
def has_no_field?(locator=nil, options
|
353
|
-
locator, options = nil, locator if locator.is_a? Hash
|
345
|
+
def has_no_field?(locator = nil, **options, &optional_filter_block)
|
354
346
|
has_no_selector?(:field, locator, options, &optional_filter_block)
|
355
347
|
end
|
356
348
|
|
@@ -363,8 +355,7 @@ module Capybara
|
|
363
355
|
# @param [String] locator The label, name or id of a checked field
|
364
356
|
# @return [Boolean] Whether it exists
|
365
357
|
#
|
366
|
-
def has_checked_field?(locator=nil, options
|
367
|
-
locator, options = nil, locator if locator.is_a? Hash
|
358
|
+
def has_checked_field?(locator = nil, **options, &optional_filter_block)
|
368
359
|
has_selector?(:field, locator, options.merge(checked: true), &optional_filter_block)
|
369
360
|
end
|
370
361
|
|
@@ -377,8 +368,7 @@ module Capybara
|
|
377
368
|
# @param [String] locator The label, name or id of a checked field
|
378
369
|
# @return [Boolean] Whether it doesn't exist
|
379
370
|
#
|
380
|
-
def has_no_checked_field?(locator=nil, options
|
381
|
-
locator, options = nil, locator if locator.is_a? Hash
|
371
|
+
def has_no_checked_field?(locator = nil, **options, &optional_filter_block)
|
382
372
|
has_no_selector?(:field, locator, options.merge(checked: true), &optional_filter_block)
|
383
373
|
end
|
384
374
|
|
@@ -391,8 +381,7 @@ module Capybara
|
|
391
381
|
# @param [String] locator The label, name or id of an unchecked field
|
392
382
|
# @return [Boolean] Whether it exists
|
393
383
|
#
|
394
|
-
def has_unchecked_field?(locator=nil, options
|
395
|
-
locator, options = nil, locator if locator.is_a? Hash
|
384
|
+
def has_unchecked_field?(locator = nil, **options, &optional_filter_block)
|
396
385
|
has_selector?(:field, locator, options.merge(unchecked: true), &optional_filter_block)
|
397
386
|
end
|
398
387
|
|
@@ -405,8 +394,7 @@ module Capybara
|
|
405
394
|
# @param [String] locator The label, name or id of an unchecked field
|
406
395
|
# @return [Boolean] Whether it doesn't exist
|
407
396
|
#
|
408
|
-
def has_no_unchecked_field?(locator=nil, options
|
409
|
-
locator, options = nil, locator if locator.is_a? Hash
|
397
|
+
def has_no_unchecked_field?(locator = nil, **options, &optional_filter_block)
|
410
398
|
has_no_selector?(:field, locator, options.merge(unchecked: true), &optional_filter_block)
|
411
399
|
end
|
412
400
|
|
@@ -439,8 +427,7 @@ module Capybara
|
|
439
427
|
# @option options [String, Array] :with_selected Partial set of options which should minimally be selected
|
440
428
|
# @return [Boolean] Whether it exists
|
441
429
|
#
|
442
|
-
def has_select?(locator=nil, options
|
443
|
-
locator, options = nil, locator if locator.is_a? Hash
|
430
|
+
def has_select?(locator = nil, **options, &optional_filter_block)
|
444
431
|
has_selector?(:select, locator, options, &optional_filter_block)
|
445
432
|
end
|
446
433
|
|
@@ -452,8 +439,7 @@ module Capybara
|
|
452
439
|
# @param (see Capybara::Node::Matchers#has_select?)
|
453
440
|
# @return [Boolean] Whether it doesn't exist
|
454
441
|
#
|
455
|
-
def has_no_select?(locator=nil, options
|
456
|
-
locator, options = nil, locator if locator.is_a? Hash
|
442
|
+
def has_no_select?(locator = nil, **options, &optional_filter_block)
|
457
443
|
has_no_selector?(:select, locator, options, &optional_filter_block)
|
458
444
|
end
|
459
445
|
|
@@ -467,8 +453,7 @@ module Capybara
|
|
467
453
|
# @param [String] locator The id or caption of a table
|
468
454
|
# @return [Boolean] Whether it exist
|
469
455
|
#
|
470
|
-
def has_table?(locator=nil, options
|
471
|
-
locator, options = nil, locator if locator.is_a? Hash
|
456
|
+
def has_table?(locator = nil, **options, &optional_filter_block)
|
472
457
|
has_selector?(:table, locator, options, &optional_filter_block)
|
473
458
|
end
|
474
459
|
|
@@ -480,8 +465,7 @@ module Capybara
|
|
480
465
|
# @param (see Capybara::Node::Matchers#has_table?)
|
481
466
|
# @return [Boolean] Whether it doesn't exist
|
482
467
|
#
|
483
|
-
def has_no_table?(locator=nil, options
|
484
|
-
locator, options = nil, locator if locator.is_a? Hash
|
468
|
+
def has_no_table?(locator = nil, **options, &optional_filter_block)
|
485
469
|
has_no_selector?(:table, locator, options, &optional_filter_block)
|
486
470
|
end
|
487
471
|
|
@@ -534,7 +518,7 @@ module Capybara
|
|
534
518
|
# @param [String, XPath::Expression] xpath The XPath expression to match against the current code
|
535
519
|
# @return [Boolean]
|
536
520
|
#
|
537
|
-
def matches_xpath?(xpath, options
|
521
|
+
def matches_xpath?(xpath, **options, &optional_filter_block)
|
538
522
|
matches_selector?(:xpath, xpath, options, &optional_filter_block)
|
539
523
|
end
|
540
524
|
|
@@ -545,7 +529,7 @@ module Capybara
|
|
545
529
|
# @param [String] css The CSS selector to match against the current code
|
546
530
|
# @return [Boolean]
|
547
531
|
#
|
548
|
-
def matches_css?(css, options
|
532
|
+
def matches_css?(css, **options, &optional_filter_block)
|
549
533
|
matches_selector?(:css, css, options, &optional_filter_block)
|
550
534
|
end
|
551
535
|
|
@@ -570,7 +554,7 @@ module Capybara
|
|
570
554
|
# @param [String, XPath::Expression] xpath The XPath expression to match against the current code
|
571
555
|
# @return [Boolean]
|
572
556
|
#
|
573
|
-
def not_matches_xpath?(xpath, options
|
557
|
+
def not_matches_xpath?(xpath, **options, &optional_filter_block)
|
574
558
|
not_matches_selector?(:xpath, xpath, options, &optional_filter_block)
|
575
559
|
end
|
576
560
|
|
@@ -581,11 +565,10 @@ module Capybara
|
|
581
565
|
# @param [String] css The CSS selector to match against the current code
|
582
566
|
# @return [Boolean]
|
583
567
|
#
|
584
|
-
def not_matches_css?(css, options
|
568
|
+
def not_matches_css?(css, **options, &optional_filter_block)
|
585
569
|
not_matches_selector?(:css, css, options, &optional_filter_block)
|
586
570
|
end
|
587
571
|
|
588
|
-
|
589
572
|
##
|
590
573
|
# Asserts that the page or current node has the given text content,
|
591
574
|
# ignoring any HTML tags.
|
@@ -656,7 +639,7 @@ module Capybara
|
|
656
639
|
def has_text?(*args)
|
657
640
|
assert_text(*args)
|
658
641
|
rescue Capybara::ExpectationNotMet
|
659
|
-
|
642
|
+
false
|
660
643
|
end
|
661
644
|
alias_method :has_content?, :has_text?
|
662
645
|
|
@@ -670,53 +653,49 @@ module Capybara
|
|
670
653
|
def has_no_text?(*args)
|
671
654
|
assert_no_text(*args)
|
672
655
|
rescue Capybara::ExpectationNotMet
|
673
|
-
|
656
|
+
false
|
674
657
|
end
|
675
658
|
alias_method :has_no_content?, :has_no_text?
|
676
659
|
|
677
660
|
def ==(other)
|
678
|
-
|
661
|
+
eql?(other) || (other.respond_to?(:base) && base == other.base)
|
679
662
|
end
|
680
663
|
|
681
664
|
private
|
682
665
|
|
683
|
-
def _verify_selector_result(query_args, optional_filter_block
|
684
|
-
_set_query_session_options(query_args)
|
666
|
+
def _verify_selector_result(query_args, optional_filter_block)
|
667
|
+
query_args = _set_query_session_options(*query_args)
|
685
668
|
query = Capybara::Queries::SelectorQuery.new(*query_args, &optional_filter_block)
|
686
669
|
synchronize(query.wait) do
|
687
670
|
result = query.resolve_for(self)
|
688
|
-
|
671
|
+
yield result, query
|
689
672
|
end
|
690
|
-
|
673
|
+
true
|
691
674
|
end
|
692
675
|
|
693
|
-
def _verify_match_result(query_args, optional_filter_block
|
694
|
-
_set_query_session_options(query_args)
|
676
|
+
def _verify_match_result(query_args, optional_filter_block)
|
677
|
+
query_args = _set_query_session_options(*query_args)
|
695
678
|
query = Capybara::Queries::MatchQuery.new(*query_args, &optional_filter_block)
|
696
679
|
synchronize(query.wait) do
|
697
|
-
result = query.resolve_for(
|
698
|
-
|
680
|
+
result = query.resolve_for(query_scope)
|
681
|
+
yield result
|
699
682
|
end
|
700
|
-
|
683
|
+
true
|
701
684
|
end
|
702
685
|
|
703
686
|
def _verify_text(query_args)
|
704
|
-
_set_query_session_options(query_args)
|
687
|
+
query_args = _set_query_session_options(*query_args)
|
705
688
|
query = Capybara::Queries::TextQuery.new(*query_args)
|
706
689
|
synchronize(query.wait) do
|
707
690
|
count = query.resolve_for(self)
|
708
691
|
yield(count, query)
|
709
692
|
end
|
710
|
-
|
693
|
+
true
|
711
694
|
end
|
712
695
|
|
713
|
-
def _set_query_session_options(query_args)
|
714
|
-
|
715
|
-
|
716
|
-
else
|
717
|
-
query_args.push(session_options: session_options)
|
718
|
-
end
|
719
|
-
query_args
|
696
|
+
def _set_query_session_options(*query_args, **query_options)
|
697
|
+
query_options[:session_options] = session_options
|
698
|
+
query_args.push(query_options)
|
720
699
|
end
|
721
700
|
end
|
722
701
|
end
|
data/lib/capybara/node/simple.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Capybara
|
3
4
|
module Node
|
4
|
-
|
5
5
|
##
|
6
6
|
#
|
7
7
|
# A {Capybara::Node::Simple} is a simpler version of {Capybara::Node::Base} which
|
@@ -28,7 +28,7 @@ module Capybara
|
|
28
28
|
#
|
29
29
|
# @return [String] The text of the element
|
30
30
|
#
|
31
|
-
def text(
|
31
|
+
def text(_type = nil)
|
32
32
|
native.text
|
33
33
|
end
|
34
34
|
|
@@ -45,7 +45,7 @@ module Capybara
|
|
45
45
|
attr_name = name.to_s
|
46
46
|
if attr_name == 'value'
|
47
47
|
value
|
48
|
-
elsif
|
48
|
+
elsif tag_name == 'input' and native[:type] == 'checkbox' and attr_name == 'checked'
|
49
49
|
native['checked'] == 'checked'
|
50
50
|
else
|
51
51
|
native[attr_name]
|
@@ -79,12 +79,12 @@ module Capybara
|
|
79
79
|
native['_capybara_raw_value']
|
80
80
|
elsif tag_name == 'select'
|
81
81
|
if native['multiple'] == 'multiple'
|
82
|
-
native.xpath(".//option[@selected='selected']").map { |option| option[:value] || option.content
|
82
|
+
native.xpath(".//option[@selected='selected']").map { |option| option[:value] || option.content }
|
83
83
|
else
|
84
84
|
option = native.xpath(".//option[@selected='selected']").first || native.xpath(".//option").first
|
85
85
|
option[:value] || option.content if option
|
86
86
|
end
|
87
|
-
elsif tag_name == 'input' && %w
|
87
|
+
elsif tag_name == 'input' && %w[radio checkbox].include?(native[:type])
|
88
88
|
native[:value] || 'on'
|
89
89
|
else
|
90
90
|
native[:value]
|
@@ -100,14 +100,13 @@ module Capybara
|
|
100
100
|
# @return [Boolean] Whether the element is visible
|
101
101
|
#
|
102
102
|
def visible?(check_ancestors = true)
|
103
|
-
return false if (tag_name == 'input') && (native[:type]=="hidden")
|
103
|
+
return false if (tag_name == 'input') && (native[:type] == "hidden")
|
104
104
|
|
105
105
|
if check_ancestors
|
106
|
-
|
107
|
-
native.xpath("./ancestor-or-self::*[contains(@style, 'display:none') or contains(@style, 'display: none') or @hidden or name()='script' or name()='head']").size() == 0
|
106
|
+
!native.xpath("boolean(./ancestor-or-self::*[contains(@style, 'display:none') or contains(@style, 'display: none') or @hidden or name()='script' or name()='head'])")
|
108
107
|
else
|
109
|
-
#
|
110
|
-
!(native.has_attribute?('hidden') || (native[:style] =~ /display:\s?none/) || %w
|
108
|
+
# No need for an xpath if only checking the current element
|
109
|
+
!(native.has_attribute?('hidden') || (native[:style] =~ /display:\s?none/) || %w[script head].include?(tag_name))
|
111
110
|
end
|
112
111
|
end
|
113
112
|
|
@@ -140,7 +139,7 @@ module Capybara
|
|
140
139
|
native.has_attribute?('selected')
|
141
140
|
end
|
142
141
|
|
143
|
-
def synchronize(
|
142
|
+
def synchronize(_seconds = nil)
|
144
143
|
yield # simple nodes don't need to wait
|
145
144
|
end
|
146
145
|
|
@@ -152,12 +151,7 @@ module Capybara
|
|
152
151
|
#
|
153
152
|
# @return [String] The title of the document
|
154
153
|
def title
|
155
|
-
|
156
|
-
native.title
|
157
|
-
else
|
158
|
-
#old versions of nokogiri don't have #title - remove in 3.0
|
159
|
-
native.xpath('/html/head/title | /html/title').first.text
|
160
|
-
end
|
154
|
+
native.title
|
161
155
|
end
|
162
156
|
|
163
157
|
def inspect
|
@@ -1,25 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Capybara
|
3
4
|
module Queries
|
4
|
-
class AncestorQuery <
|
5
|
+
class AncestorQuery < Capybara::Queries::SelectorQuery
|
5
6
|
# @api private
|
6
7
|
def resolve_for(node, exact = nil)
|
7
8
|
@child_node = node
|
8
9
|
node.synchronize do
|
9
10
|
match_results = super(node.session.current_scope, exact)
|
10
|
-
node.all(:xpath, XPath.ancestor)
|
11
|
-
match_results.include?(el)
|
12
|
-
end
|
11
|
+
node.all(:xpath, XPath.ancestor) { |el| match_results.include?(el) }
|
13
12
|
end
|
14
13
|
end
|
15
14
|
|
16
15
|
def description
|
16
|
+
child_query = @child_node && @child_node.instance_variable_get(:@query)
|
17
17
|
desc = super
|
18
|
-
|
19
|
-
desc += " that is an ancestor of #{child_query.description}"
|
20
|
-
end
|
18
|
+
desc += " that is an ancestor of #{child_query.description}" if child_query
|
21
19
|
desc
|
22
20
|
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def valid_keys
|
25
|
+
super - COUNT_KEYS
|
26
|
+
end
|
23
27
|
end
|
24
28
|
end
|
25
29
|
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Capybara
|
3
4
|
# @api private
|
4
5
|
module Queries
|
5
6
|
class BaseQuery
|
6
|
-
COUNT_KEYS = [
|
7
|
+
COUNT_KEYS = %i[count minimum maximum between].freeze
|
7
8
|
|
8
9
|
attr_reader :options
|
9
10
|
attr_writer :session_options
|
@@ -20,8 +21,11 @@ module Capybara
|
|
20
21
|
self.class.wait(options, session_options.default_max_wait_time)
|
21
22
|
end
|
22
23
|
|
23
|
-
def self.wait(options, default=Capybara.default_max_wait_time)
|
24
|
-
|
24
|
+
def self.wait(options, default = Capybara.default_max_wait_time)
|
25
|
+
# if no value or nil for the :wait option is passed it should default to the default
|
26
|
+
w = options.fetch(:wait, nil)
|
27
|
+
w = default if w.nil?
|
28
|
+
w || 0
|
25
29
|
end
|
26
30
|
|
27
31
|
##
|
@@ -30,11 +34,7 @@ module Capybara
|
|
30
34
|
# Returns false if query does not have any count options specified.
|
31
35
|
#
|
32
36
|
def expects_none?
|
33
|
-
|
34
|
-
matches_count?(0)
|
35
|
-
else
|
36
|
-
false
|
37
|
-
end
|
37
|
+
count_specified? ? matches_count?(0) : false
|
38
38
|
end
|
39
39
|
|
40
40
|
##
|
@@ -47,11 +47,11 @@ module Capybara
|
|
47
47
|
# @param [Integer] count The actual number. Should be coercible via Integer()
|
48
48
|
#
|
49
49
|
def matches_count?(count)
|
50
|
-
return (Integer(options[:count]) == count)
|
50
|
+
return (Integer(options[:count]) == count) if options[:count]
|
51
51
|
return false if options[:maximum] && (Integer(options[:maximum]) < count)
|
52
52
|
return false if options[:minimum] && (Integer(options[:minimum]) > count)
|
53
|
-
return false if options[:between] && !
|
54
|
-
|
53
|
+
return false if options[:between] && !options[:between].include?(count)
|
54
|
+
true
|
55
55
|
end
|
56
56
|
|
57
57
|
##
|
@@ -66,10 +66,14 @@ module Capybara
|
|
66
66
|
String.new("expected not to find #{description}") << count_message
|
67
67
|
end
|
68
68
|
|
69
|
-
|
69
|
+
private
|
70
|
+
|
71
|
+
def count_specified?
|
72
|
+
COUNT_KEYS.any? { |k| options.key? k }
|
73
|
+
end
|
70
74
|
|
71
75
|
def count_message
|
72
|
-
message =
|
76
|
+
message = "".dup
|
73
77
|
if options[:count]
|
74
78
|
message << " #{options[:count]} #{Capybara::Helpers.declension('time', 'times', options[:count])}"
|
75
79
|
elsif options[:between]
|
@@ -84,11 +88,11 @@ module Capybara
|
|
84
88
|
|
85
89
|
def assert_valid_keys
|
86
90
|
invalid_keys = @options.keys - valid_keys
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
91
|
+
return if invalid_keys.empty?
|
92
|
+
|
93
|
+
invalid_names = invalid_keys.map(&:inspect).join(", ")
|
94
|
+
valid_names = valid_keys.map(&:inspect).join(", ")
|
95
|
+
raise ArgumentError, "invalid keys #{invalid_names}, should be one of #{valid_names}"
|
92
96
|
end
|
93
97
|
end
|
94
98
|
end
|
@@ -1,34 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'addressable/uri'
|
3
4
|
|
4
5
|
module Capybara
|
5
6
|
# @api private
|
6
7
|
module Queries
|
7
8
|
class CurrentPathQuery < BaseQuery
|
8
|
-
def initialize(expected_path, options
|
9
|
+
def initialize(expected_path, **options)
|
9
10
|
super(options)
|
10
11
|
@expected_path = expected_path
|
11
|
-
warn "DEPRECATED: The :only_path option is deprecated in favor of the :ignore_query option" if options.has_key?(:only_path)
|
12
|
-
|
13
12
|
@options = {
|
14
13
|
url: !@expected_path.is_a?(Regexp) && !::Addressable::URI.parse(@expected_path || "").hostname.nil?,
|
15
|
-
|
16
|
-
|
14
|
+
ignore_query: false
|
15
|
+
}.merge(options)
|
17
16
|
assert_valid_keys
|
18
17
|
end
|
19
18
|
|
20
19
|
def resolves_for?(session)
|
21
20
|
uri = ::Addressable::URI.parse(session.current_url)
|
22
21
|
uri.query = nil if uri && options[:ignore_query]
|
23
|
-
@actual_path =
|
24
|
-
uri.to_s
|
25
|
-
else
|
26
|
-
if options[:only_path]
|
27
|
-
uri && uri.path
|
28
|
-
else
|
29
|
-
uri && uri.request_uri
|
30
|
-
end
|
31
|
-
end
|
22
|
+
@actual_path = options[:url] ? uri.to_s : uri && uri.request_uri
|
32
23
|
|
33
24
|
if @expected_path.is_a? Regexp
|
34
25
|
@actual_path.to_s.match(@expected_path)
|
@@ -45,22 +36,15 @@ module Capybara
|
|
45
36
|
failure_message_helper(' not')
|
46
37
|
end
|
47
38
|
|
48
|
-
|
39
|
+
private
|
49
40
|
|
50
41
|
def failure_message_helper(negated = '')
|
51
|
-
verb =
|
42
|
+
verb = @expected_path.is_a?(Regexp) ? 'match' : 'equal'
|
52
43
|
"expected #{@actual_path.inspect}#{negated} to #{verb} #{@expected_path.inspect}"
|
53
44
|
end
|
54
45
|
|
55
46
|
def valid_keys
|
56
|
-
[
|
57
|
-
end
|
58
|
-
|
59
|
-
def assert_valid_keys
|
60
|
-
super
|
61
|
-
if options[:url] && options[:only_path]
|
62
|
-
raise ArgumentError, "the :url and :only_path options cannot both be true"
|
63
|
-
end
|
47
|
+
%i[wait url ignore_query]
|
64
48
|
end
|
65
49
|
end
|
66
50
|
end
|
@@ -2,18 +2,14 @@ module Capybara
|
|
2
2
|
module Queries
|
3
3
|
class MatchQuery < Capybara::Queries::SelectorQuery
|
4
4
|
def visible
|
5
|
-
|
6
|
-
super
|
7
|
-
else
|
8
|
-
:all
|
9
|
-
end
|
5
|
+
options.key?(:visible) ? super : :all
|
10
6
|
end
|
11
7
|
|
12
|
-
|
8
|
+
private
|
13
9
|
|
14
10
|
def valid_keys
|
15
11
|
super - COUNT_KEYS
|
16
12
|
end
|
17
13
|
end
|
18
14
|
end
|
19
|
-
end
|
15
|
+
end
|