capybara 2.18.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|