capybara 3.21.0 → 3.22.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/.yardopts +1 -0
- data/History.md +14 -0
- data/README.md +13 -8
- data/lib/capybara.rb +38 -32
- data/lib/capybara/driver/node.rb +2 -2
- data/lib/capybara/minitest.rb +14 -1
- data/lib/capybara/minitest/spec.rb +20 -7
- data/lib/capybara/node/finders.rb +41 -47
- data/lib/capybara/node/matchers.rb +161 -72
- data/lib/capybara/queries/ancestor_query.rb +9 -7
- data/lib/capybara/queries/sibling_query.rb +11 -4
- data/lib/capybara/result.rb +2 -0
- data/lib/capybara/rspec/matchers.rb +16 -1
- data/lib/capybara/rspec/matchers/have_ancestor.rb +30 -0
- data/lib/capybara/rspec/matchers/have_sibling.rb +30 -0
- data/lib/capybara/selector.rb +153 -171
- data/lib/capybara/selector/definition/checkbox.rb +8 -5
- data/lib/capybara/selector/definition/radio_button.rb +8 -5
- data/lib/capybara/selector/filter_set.rb +4 -2
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +35 -1
- data/lib/capybara/session.rb +74 -71
- data/lib/capybara/session/config.rb +1 -1
- data/lib/capybara/spec/session/check_spec.rb +6 -0
- data/lib/capybara/spec/session/choose_spec.rb +6 -0
- data/lib/capybara/spec/session/has_ancestor_spec.rb +44 -0
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/select_spec.rb +5 -5
- data/lib/capybara/spec/views/form.erb +1 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +10 -10
- data/spec/minitest_spec.rb +11 -1
- data/spec/minitest_spec_spec.rb +11 -1
- data/spec/regexp_dissassembler_spec.rb +1 -1
- metadata +7 -2
@@ -19,21 +19,20 @@ module Capybara
|
|
19
19
|
# This will check if the expression occurs exactly 4 times.
|
20
20
|
#
|
21
21
|
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
22
|
-
# such as
|
22
|
+
# such as `:text` and `:visible`.
|
23
23
|
#
|
24
24
|
# page.has_selector?('li', text: 'Horse', visible: true)
|
25
25
|
#
|
26
|
-
# has_selector? can also accept XPath expressions generated by the
|
26
|
+
# {#has_selector?} can also accept XPath expressions generated by the
|
27
27
|
# XPath gem:
|
28
28
|
#
|
29
29
|
# page.has_selector?(:xpath, XPath.descendant(:p))
|
30
30
|
#
|
31
31
|
# @param (see Capybara::Node::Finders#all)
|
32
|
-
# @
|
33
|
-
# @option
|
34
|
-
# @option
|
35
|
-
# @option
|
36
|
-
# @option args [Range] :between (nil) Range of times that should contain number of times text occurs
|
32
|
+
# @option options [Integer] :count (nil) Number of matching elements that should exist
|
33
|
+
# @option options [Integer] :minimum (nil) Minimum number of matching elements that should exist
|
34
|
+
# @option options [Integer] :maximum (nil) Maximum number of matching elements that should exist
|
35
|
+
# @option options [Range] :between (nil) Range of number of matching elements that should exist
|
37
36
|
# @return [Boolean] If the expression exists
|
38
37
|
#
|
39
38
|
def has_selector?(*args, **options, &optional_filter_block)
|
@@ -43,9 +42,9 @@ module Capybara
|
|
43
42
|
##
|
44
43
|
#
|
45
44
|
# Checks if a given selector is not on the page or a descendant of the current node.
|
46
|
-
# Usage is identical to
|
45
|
+
# Usage is identical to {#has_selector?}.
|
47
46
|
#
|
48
|
-
# @param (see
|
47
|
+
# @param (see #has_selector?)
|
49
48
|
# @return [Boolean]
|
50
49
|
#
|
51
50
|
def has_no_selector?(*args, **options, &optional_filter_block)
|
@@ -54,7 +53,7 @@ module Capybara
|
|
54
53
|
|
55
54
|
##
|
56
55
|
#
|
57
|
-
# Checks if a an element has the specified CSS styles
|
56
|
+
# Checks if a an element has the specified CSS styles.
|
58
57
|
#
|
59
58
|
# element.matches_style?( 'color' => 'rgb(0,0,255)', 'font-size' => /px/ )
|
60
59
|
#
|
@@ -66,7 +65,7 @@ module Capybara
|
|
66
65
|
end
|
67
66
|
|
68
67
|
##
|
69
|
-
# @deprecated
|
68
|
+
# @deprecated Use {#matches_style?} instead.
|
70
69
|
#
|
71
70
|
def has_style?(styles, **options)
|
72
71
|
warn 'DEPRECATED: has_style? is deprecated, please use matches_style?'
|
@@ -89,15 +88,15 @@ module Capybara
|
|
89
88
|
# This will check if the expression occurs exactly 4 times. See
|
90
89
|
# {Capybara::Node::Finders#all} for other available result size options.
|
91
90
|
#
|
92
|
-
# If a
|
91
|
+
# If a `:count` of 0 is specified, it will behave like {#assert_no_selector};
|
93
92
|
# however, use of that method is preferred over this one.
|
94
93
|
#
|
95
94
|
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
96
|
-
# such as
|
95
|
+
# such as `:text` and `:visible`.
|
97
96
|
#
|
98
97
|
# page.assert_selector('li', text: 'Horse', visible: true)
|
99
98
|
#
|
100
|
-
#
|
99
|
+
# {#assert_selector} can also accept XPath expressions generated by the
|
101
100
|
# XPath gem:
|
102
101
|
#
|
103
102
|
# page.assert_selector(:xpath, XPath.descendant(:p))
|
@@ -114,7 +113,7 @@ module Capybara
|
|
114
113
|
|
115
114
|
##
|
116
115
|
#
|
117
|
-
# Asserts that an element has the specified CSS styles
|
116
|
+
# Asserts that an element has the specified CSS styles.
|
118
117
|
#
|
119
118
|
# element.assert_matches_style( 'color' => 'rgb(0,0,255)', 'font-size' => /px/ )
|
120
119
|
#
|
@@ -131,7 +130,8 @@ module Capybara
|
|
131
130
|
end
|
132
131
|
|
133
132
|
##
|
134
|
-
# @deprecated
|
133
|
+
# @deprecated Use {#assert_matches_style} instead.
|
134
|
+
#
|
135
135
|
def assert_style(styles, **options)
|
136
136
|
warn 'assert_style is deprecated, please use assert_matches_style instead'
|
137
137
|
assert_matches_style(styles, **options)
|
@@ -139,16 +139,16 @@ module Capybara
|
|
139
139
|
|
140
140
|
# Asserts that all of the provided selectors are present on the given page
|
141
141
|
# or descendants of the current node. If options are provided, the assertion
|
142
|
-
# will check that each locator is present with those options as well (other than
|
142
|
+
# will check that each locator is present with those options as well (other than `:wait`).
|
143
143
|
#
|
144
144
|
# page.assert_all_of_selectors(:custom, 'Tom', 'Joe', visible: all)
|
145
145
|
# page.assert_all_of_selectors(:css, '#my_div', 'a.not_clicked')
|
146
146
|
#
|
147
147
|
# It accepts all options that {Capybara::Node::Finders#all} accepts,
|
148
|
-
# such as
|
148
|
+
# such as `:text` and `:visible`.
|
149
149
|
#
|
150
|
-
# The
|
151
|
-
# within
|
150
|
+
# The `:wait` option applies to all of the selectors as a group, so all of the locators must be present
|
151
|
+
# within `:wait` (defaults to {Capybara.configure default_max_wait_time}) seconds.
|
152
152
|
#
|
153
153
|
# @overload assert_all_of_selectors([kind = Capybara.default_selector], *locators, **options)
|
154
154
|
#
|
@@ -160,16 +160,16 @@ module Capybara
|
|
160
160
|
|
161
161
|
# Asserts that none of the provided selectors are present on the given page
|
162
162
|
# or descendants of the current node. If options are provided, the assertion
|
163
|
-
# will check that each locator is present with those options as well (other than
|
163
|
+
# will check that each locator is not present with those options as well (other than `:wait`).
|
164
164
|
#
|
165
165
|
# page.assert_none_of_selectors(:custom, 'Tom', 'Joe', visible: all)
|
166
166
|
# page.assert_none_of_selectors(:css, '#my_div', 'a.not_clicked')
|
167
167
|
#
|
168
168
|
# It accepts all options that {Capybara::Node::Finders#all} accepts,
|
169
|
-
# such as
|
169
|
+
# such as `:text` and `:visible`.
|
170
170
|
#
|
171
|
-
# The
|
172
|
-
# within
|
171
|
+
# The `:wait` option applies to all of the selectors as a group, so none of the locators must be present
|
172
|
+
# within `:wait` (defaults to {Capybara.configure default_max_wait_time}) seconds.
|
173
173
|
#
|
174
174
|
# @overload assert_none_of_selectors([kind = Capybara.default_selector], *locators, **options)
|
175
175
|
#
|
@@ -180,17 +180,17 @@ module Capybara
|
|
180
180
|
end
|
181
181
|
|
182
182
|
# Asserts that any of the provided selectors are present on the given page
|
183
|
-
# or descendants of the current node.
|
184
|
-
# will check that each locator is present with those options as well (other than
|
183
|
+
# or descendants of the current node. If options are provided, the assertion
|
184
|
+
# will check that each locator is present with those options as well (other than `:wait`).
|
185
185
|
#
|
186
186
|
# page.assert_any_of_selectors(:custom, 'Tom', 'Joe', visible: all)
|
187
187
|
# page.assert_any_of_selectors(:css, '#my_div', 'a.not_clicked')
|
188
188
|
#
|
189
189
|
# It accepts all options that {Capybara::Node::Finders#all} accepts,
|
190
|
-
# such as
|
190
|
+
# such as `:text` and `:visible`.
|
191
191
|
#
|
192
|
-
# The
|
193
|
-
# within
|
192
|
+
# The `:wait` option applies to all of the selectors as a group, so any of the locators must be present
|
193
|
+
# within `:wait` (defaults to {Capybara.configure default_max_wait_time}) seconds.
|
194
194
|
#
|
195
195
|
# @overload assert_any_of_selectors([kind = Capybara.default_selector], *locators, **options)
|
196
196
|
#
|
@@ -215,17 +215,17 @@ module Capybara
|
|
215
215
|
##
|
216
216
|
#
|
217
217
|
# Asserts that a given selector is not on the page or a descendant of the current node.
|
218
|
-
# Usage is identical to
|
218
|
+
# Usage is identical to {#assert_selector}.
|
219
219
|
#
|
220
|
-
# Query options such as
|
220
|
+
# Query options such as `:count`, `:minimum`, `:maximum`, and `:between` are
|
221
221
|
# considered to be an integral part of the selector. This will return
|
222
|
-
# true
|
222
|
+
# `true`, for example, if a page contains 4 anchors but the query expects 5:
|
223
223
|
#
|
224
224
|
# page.assert_no_selector('a', minimum: 1) # Found, raises Capybara::ExpectationNotMet
|
225
225
|
# page.assert_no_selector('a', count: 4) # Found, raises Capybara::ExpectationNotMet
|
226
226
|
# page.assert_no_selector('a', count: 5) # Not Found, returns true
|
227
227
|
#
|
228
|
-
# @param (see
|
228
|
+
# @param (see #assert_selector)
|
229
229
|
# @raise [Capybara::ExpectationNotMet] If the selector exists
|
230
230
|
#
|
231
231
|
def assert_no_selector(*args, &optional_filter_block)
|
@@ -250,11 +250,11 @@ module Capybara
|
|
250
250
|
# This will check if the expression occurs exactly 4 times.
|
251
251
|
#
|
252
252
|
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
253
|
-
# such as
|
253
|
+
# such as `:text` and `:visible`.
|
254
254
|
#
|
255
255
|
# page.has_xpath?('.//li', text: 'Horse', visible: true)
|
256
256
|
#
|
257
|
-
# has_xpath? can also accept XPath expressions
|
257
|
+
# {#has_xpath?} can also accept XPath expressions generated by the
|
258
258
|
# XPath gem:
|
259
259
|
#
|
260
260
|
# xpath = XPath.generate { |x| x.descendant(:p) }
|
@@ -272,9 +272,9 @@ module Capybara
|
|
272
272
|
##
|
273
273
|
#
|
274
274
|
# Checks if a given XPath expression is not on the page or a descendant of the current node.
|
275
|
-
# Usage is identical to
|
275
|
+
# Usage is identical to {#has_xpath?}.
|
276
276
|
#
|
277
|
-
# @param (see
|
277
|
+
# @param (see #has_xpath?)
|
278
278
|
# @return [Boolean]
|
279
279
|
#
|
280
280
|
def has_no_xpath?(path, **options, &optional_filter_block)
|
@@ -295,7 +295,7 @@ module Capybara
|
|
295
295
|
# This will check if the selector occurs exactly 4 times.
|
296
296
|
#
|
297
297
|
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
298
|
-
# such as
|
298
|
+
# such as `:text` and `:visible`.
|
299
299
|
#
|
300
300
|
# page.has_css?('li', text: 'Horse', visible: true)
|
301
301
|
#
|
@@ -311,9 +311,9 @@ module Capybara
|
|
311
311
|
##
|
312
312
|
#
|
313
313
|
# Checks if a given CSS selector is not on the page or a descendant of the current node.
|
314
|
-
# Usage is identical to
|
314
|
+
# Usage is identical to {#has_css?}.
|
315
315
|
#
|
316
|
-
# @param (see
|
316
|
+
# @param (see #has_css?)
|
317
317
|
# @return [Boolean]
|
318
318
|
#
|
319
319
|
def has_no_css?(path, **options, &optional_filter_block)
|
@@ -326,7 +326,6 @@ module Capybara
|
|
326
326
|
# text or id.
|
327
327
|
#
|
328
328
|
# @param [String] locator The text or id of a link to check for
|
329
|
-
# @param options
|
330
329
|
# @option options [String, Regexp] :href The value the href attribute must be
|
331
330
|
# @return [Boolean] Whether it exists
|
332
331
|
#
|
@@ -339,7 +338,7 @@ module Capybara
|
|
339
338
|
# Checks if the page or current node has no link with the given
|
340
339
|
# text or id.
|
341
340
|
#
|
342
|
-
# @param (see
|
341
|
+
# @param (see #has_link?)
|
343
342
|
# @return [Boolean] Whether it doesn't exist
|
344
343
|
#
|
345
344
|
def has_no_link?(locator = nil, **options, &optional_filter_block)
|
@@ -376,7 +375,7 @@ module Capybara
|
|
376
375
|
# label, name or id.
|
377
376
|
#
|
378
377
|
# For text fields and other textual fields, such as textareas and
|
379
|
-
# HTML5 email/url/etc. fields, it's possible to specify a
|
378
|
+
# HTML5 email/url/etc. fields, it's possible to specify a `:with`
|
380
379
|
# option to specify the text the field should contain:
|
381
380
|
#
|
382
381
|
# page.has_field?('Name', with: 'Jonas')
|
@@ -399,7 +398,7 @@ module Capybara
|
|
399
398
|
##
|
400
399
|
#
|
401
400
|
# Checks if the page or current node has no form field with the given
|
402
|
-
# label, name or id. See {
|
401
|
+
# label, name or id. See {#has_field?}.
|
403
402
|
#
|
404
403
|
# @param [String] locator The label, name or id of a field to check for
|
405
404
|
# @option options [String, Regexp] :with The text content of the field or a Regexp to match
|
@@ -413,7 +412,7 @@ module Capybara
|
|
413
412
|
##
|
414
413
|
#
|
415
414
|
# Checks if the page or current node has a radio button or
|
416
|
-
# checkbox with the given label, value, id, or Capybara.test_id attribute that is currently
|
415
|
+
# checkbox with the given label, value, id, or {Capybara.configure test_id} attribute that is currently
|
417
416
|
# checked.
|
418
417
|
#
|
419
418
|
# @param [String] locator The label, name or id of a checked field
|
@@ -426,7 +425,7 @@ module Capybara
|
|
426
425
|
##
|
427
426
|
#
|
428
427
|
# Checks if the page or current node has no radio button or
|
429
|
-
# checkbox with the given label, value or id, or Capybara.test_id attribute that is currently
|
428
|
+
# checkbox with the given label, value or id, or {Capybara.configure test_id} attribute that is currently
|
430
429
|
# checked.
|
431
430
|
#
|
432
431
|
# @param [String] locator The label, name or id of a checked field
|
@@ -439,7 +438,7 @@ module Capybara
|
|
439
438
|
##
|
440
439
|
#
|
441
440
|
# Checks if the page or current node has a radio button or
|
442
|
-
# checkbox with the given label, value or id, or Capybara.test_id attribute that is currently
|
441
|
+
# checkbox with the given label, value or id, or {Capybara.configure test_id} attribute that is currently
|
443
442
|
# unchecked.
|
444
443
|
#
|
445
444
|
# @param [String] locator The label, name or id of an unchecked field
|
@@ -452,7 +451,7 @@ module Capybara
|
|
452
451
|
##
|
453
452
|
#
|
454
453
|
# Checks if the page or current node has no radio button or
|
455
|
-
# checkbox with the given label, value or id, or Capybara.test_id attribute that is currently
|
454
|
+
# checkbox with the given label, value or id, or {Capybara.configure test_id} attribute that is currently
|
456
455
|
# unchecked.
|
457
456
|
#
|
458
457
|
# @param [String] locator The label, name or id of an unchecked field
|
@@ -498,9 +497,9 @@ module Capybara
|
|
498
497
|
##
|
499
498
|
#
|
500
499
|
# Checks if the page or current node has no select field with the
|
501
|
-
# given label, name or id. See {
|
500
|
+
# given label, name or id. See {#has_select?}.
|
502
501
|
#
|
503
|
-
# @param (see
|
502
|
+
# @param (see #has_select?)
|
504
503
|
# @return [Boolean] Whether it doesn't exist
|
505
504
|
#
|
506
505
|
def has_no_select?(locator = nil, **options, &optional_filter_block)
|
@@ -532,9 +531,9 @@ module Capybara
|
|
532
531
|
##
|
533
532
|
#
|
534
533
|
# Checks if the page or current node has no table with the given id
|
535
|
-
# or caption. See {
|
534
|
+
# or caption. See {#has_table?}.
|
536
535
|
#
|
537
|
-
# @param (see
|
536
|
+
# @param (see #has_table?)
|
538
537
|
# @return [Boolean] Whether it doesn't exist
|
539
538
|
#
|
540
539
|
def has_no_table?(locator = nil, **options, &optional_filter_block)
|
@@ -543,14 +542,14 @@ module Capybara
|
|
543
542
|
|
544
543
|
##
|
545
544
|
#
|
546
|
-
# Asserts that the
|
545
|
+
# Asserts that the current node matches a given selector.
|
547
546
|
#
|
548
547
|
# node.assert_matches_selector('p#foo')
|
549
548
|
# node.assert_matches_selector(:xpath, '//p[@id="foo"]')
|
550
549
|
# node.assert_matches_selector(:foo)
|
551
550
|
#
|
552
551
|
# It also accepts all options that {Capybara::Node::Finders#all} accepts,
|
553
|
-
# such as
|
552
|
+
# such as `:text` and `:visible`.
|
554
553
|
#
|
555
554
|
# node.assert_matches_selector('li', text: 'Horse', visible: true)
|
556
555
|
#
|
@@ -563,6 +562,14 @@ module Capybara
|
|
563
562
|
end
|
564
563
|
end
|
565
564
|
|
565
|
+
##
|
566
|
+
#
|
567
|
+
# Asserts that the current node does not match a given selector.
|
568
|
+
# Usage is identical to {#assert_matches_selector}.
|
569
|
+
#
|
570
|
+
# @param (see #assert_matches_selector)
|
571
|
+
# @raise [Capybara::ExpectationNotMet] If the selector matches
|
572
|
+
#
|
566
573
|
def assert_not_matches_selector(*args, &optional_filter_block)
|
567
574
|
_verify_match_result(args, optional_filter_block) do |result|
|
568
575
|
raise Capybara::ExpectationNotMet, 'Item matched the provided selector' if result.include? self
|
@@ -571,9 +578,9 @@ module Capybara
|
|
571
578
|
|
572
579
|
##
|
573
580
|
#
|
574
|
-
# Checks if the current node matches given selector
|
581
|
+
# Checks if the current node matches given selector.
|
575
582
|
#
|
576
|
-
# @param (see
|
583
|
+
# @param (see #has_selector?)
|
577
584
|
# @return [Boolean]
|
578
585
|
#
|
579
586
|
def matches_selector?(*args, **options, &optional_filter_block)
|
@@ -582,7 +589,7 @@ module Capybara
|
|
582
589
|
|
583
590
|
##
|
584
591
|
#
|
585
|
-
# Checks if the current node matches given XPath expression
|
592
|
+
# Checks if the current node matches given XPath expression.
|
586
593
|
#
|
587
594
|
# @param [String, XPath::Expression] xpath The XPath expression to match against the current code
|
588
595
|
# @return [Boolean]
|
@@ -593,7 +600,7 @@ module Capybara
|
|
593
600
|
|
594
601
|
##
|
595
602
|
#
|
596
|
-
# Checks if the current node matches given CSS selector
|
603
|
+
# Checks if the current node matches given CSS selector.
|
597
604
|
#
|
598
605
|
# @param [String] css The CSS selector to match against the current code
|
599
606
|
# @return [Boolean]
|
@@ -604,10 +611,10 @@ module Capybara
|
|
604
611
|
|
605
612
|
##
|
606
613
|
#
|
607
|
-
# Checks if the current node does not match given selector
|
608
|
-
# Usage is identical to
|
614
|
+
# Checks if the current node does not match given selector.
|
615
|
+
# Usage is identical to {#has_selector?}.
|
609
616
|
#
|
610
|
-
# @param (see
|
617
|
+
# @param (see #has_selector?)
|
611
618
|
# @return [Boolean]
|
612
619
|
#
|
613
620
|
def not_matches_selector?(*args, **options, &optional_filter_block)
|
@@ -616,7 +623,7 @@ module Capybara
|
|
616
623
|
|
617
624
|
##
|
618
625
|
#
|
619
|
-
# Checks if the current node does not match given XPath expression
|
626
|
+
# Checks if the current node does not match given XPath expression.
|
620
627
|
#
|
621
628
|
# @param [String, XPath::Expression] xpath The XPath expression to match against the current code
|
622
629
|
# @return [Boolean]
|
@@ -627,7 +634,7 @@ module Capybara
|
|
627
634
|
|
628
635
|
##
|
629
636
|
#
|
630
|
-
# Checks if the current node does not match given CSS selector
|
637
|
+
# Checks if the current node does not match given CSS selector.
|
631
638
|
#
|
632
639
|
# @param [String] css The CSS selector to match against the current code
|
633
640
|
# @return [Boolean]
|
@@ -642,24 +649,24 @@ module Capybara
|
|
642
649
|
#
|
643
650
|
# @!macro text_query_params
|
644
651
|
# @overload $0(type, text, **options)
|
645
|
-
# @param [:all, :visible] type Whether to check for only visible or all text. If this parameter is missing or nil then we use the value of
|
652
|
+
# @param [:all, :visible] type Whether to check for only visible or all text. If this parameter is missing or nil then we use the value of {Capybara.configure ignore_hidden_elements}, which defaults to `true`, corresponding to `:visible`.
|
646
653
|
# @param [String, Regexp] text The string/regexp to check for. If it's a string, text is expected to include it. If it's a regexp, text is expected to match it.
|
647
654
|
# @option options [Integer] :count (nil) Number of times the text is expected to occur
|
648
655
|
# @option options [Integer] :minimum (nil) Minimum number of times the text is expected to occur
|
649
656
|
# @option options [Integer] :maximum (nil) Maximum number of times the text is expected to occur
|
650
657
|
# @option options [Range] :between (nil) Range of times that is expected to contain number of times text occurs
|
651
|
-
# @option options [Numeric] :wait
|
652
|
-
# @option options [Boolean] :exact
|
653
|
-
# @option options [Boolean] :normalize_ws (false) When true replace all whitespace with standard spaces and collapse consecutive whitespace to a single space
|
658
|
+
# @option options [Numeric] :wait Maximum time that Capybara will wait for text to eq/match given string/regexp argument. Defaults to {Capybara.configure default_max_wait_time}.
|
659
|
+
# @option options [Boolean] :exact Whether text must be an exact match or just substring. Defaults to {Capybara.configure exact_text}.
|
660
|
+
# @option options [Boolean] :normalize_ws (false) When `true` replace all whitespace with standard spaces and collapse consecutive whitespace to a single space
|
654
661
|
# @overload $0(text, **options)
|
655
662
|
# @param [String, Regexp] text The string/regexp to check for. If it's a string, text is expected to include it. If it's a regexp, text is expected to match it.
|
656
663
|
# @option options [Integer] :count (nil) Number of times the text is expected to occur
|
657
664
|
# @option options [Integer] :minimum (nil) Minimum number of times the text is expected to occur
|
658
665
|
# @option options [Integer] :maximum (nil) Maximum number of times the text is expected to occur
|
659
666
|
# @option options [Range] :between (nil) Range of times that is expected to contain number of times text occurs
|
660
|
-
# @option options [Numeric] :wait
|
661
|
-
# @option options [Boolean] :exact
|
662
|
-
# @option options [Boolean] :normalize_ws (false) When true replace all whitespace with standard spaces and collapse consecutive whitespace to a single space
|
667
|
+
# @option options [Numeric] :wait Maximum time that Capybara will wait for text to eq/match given string/regexp argument. Defaults to {Capybara.configure default_max_wait_time}.
|
668
|
+
# @option options [Boolean] :exact Whether text must be an exact match or just substring. Defaults to {Capybara.configure exact_text}.
|
669
|
+
# @option options [Boolean] :normalize_ws (false) When `true` replace all whitespace with standard spaces and collapse consecutive whitespace to a single space
|
663
670
|
# @raise [Capybara::ExpectationNotMet] if the assertion hasn't succeeded during wait time
|
664
671
|
# @return [true]
|
665
672
|
#
|
@@ -718,6 +725,88 @@ module Capybara
|
|
718
725
|
end
|
719
726
|
alias_method :has_no_content?, :has_no_text?
|
720
727
|
|
728
|
+
##
|
729
|
+
#
|
730
|
+
# Asserts that a given selector matches an ancestor of the current node.
|
731
|
+
#
|
732
|
+
# element.assert_ancestor('p#foo')
|
733
|
+
#
|
734
|
+
# Accepts the same options as {#assert_selector}
|
735
|
+
#
|
736
|
+
# @param (see Capybara::Node::Finders#find)
|
737
|
+
# @raise [Capybara::ExpectationNotMet] If the selector does not exist
|
738
|
+
#
|
739
|
+
def assert_ancestor(*args, &optional_filter_block)
|
740
|
+
_verify_selector_result(args, optional_filter_block, Capybara::Queries::AncestorQuery) do |result, query|
|
741
|
+
raise Capybara::ExpectationNotMet, result.failure_message unless result.matches_count? && (result.any? || query.expects_none?)
|
742
|
+
end
|
743
|
+
end
|
744
|
+
|
745
|
+
def assert_no_ancestor(*args, &optional_filter_block)
|
746
|
+
_verify_selector_result(args, optional_filter_block, Capybara::Queries::SiblingQuery) do |result, query|
|
747
|
+
if result.matches_count? && (!result.empty? || query.expects_none?)
|
748
|
+
raise Capybara::ExpectationNotMet, result.negative_failure_message
|
749
|
+
end
|
750
|
+
end
|
751
|
+
end
|
752
|
+
|
753
|
+
##
|
754
|
+
#
|
755
|
+
# Predicate version of {#assert_ancestor}
|
756
|
+
#
|
757
|
+
def has_ancestor?(*args, **options, &optional_filter_block)
|
758
|
+
make_predicate(options) { assert_ancestor(*args, options, &optional_filter_block) }
|
759
|
+
end
|
760
|
+
|
761
|
+
##
|
762
|
+
#
|
763
|
+
# Predicate version of {#assert_no_ancestor}
|
764
|
+
#
|
765
|
+
def has_no_ancestor?(*args, **options, &optional_filter_block)
|
766
|
+
make_predicate(options) { assert_no_ancestor(*args, options, &optional_filter_block) }
|
767
|
+
end
|
768
|
+
|
769
|
+
##
|
770
|
+
#
|
771
|
+
# Asserts that a given selector matches a sibling of the current node.
|
772
|
+
#
|
773
|
+
# element.assert_sibling('p#foo')
|
774
|
+
#
|
775
|
+
# Accepts the same options as {#assert_selector}
|
776
|
+
#
|
777
|
+
# @param (see Capybara::Node::Finders#find)
|
778
|
+
# @raise [Capybara::ExpectationNotMet] If the selector does not exist
|
779
|
+
#
|
780
|
+
def assert_sibling(*args, &optional_filter_block)
|
781
|
+
_verify_selector_result(args, optional_filter_block, Capybara::Queries::SiblingQuery) do |result, query|
|
782
|
+
raise Capybara::ExpectationNotMet, result.failure_message unless result.matches_count? && (result.any? || query.expects_none?)
|
783
|
+
end
|
784
|
+
end
|
785
|
+
|
786
|
+
def assert_no_sibling(*args, &optional_filter_block)
|
787
|
+
_verify_selector_result(args, optional_filter_block, Capybara::Queries::SiblingQuery) do |result, query|
|
788
|
+
if result.matches_count? && (!result.empty? || query.expects_none?)
|
789
|
+
raise Capybara::ExpectationNotMet, result.negative_failure_message
|
790
|
+
end
|
791
|
+
end
|
792
|
+
end
|
793
|
+
|
794
|
+
##
|
795
|
+
#
|
796
|
+
# Predicate version of {#assert_sibling}
|
797
|
+
#
|
798
|
+
def has_sibling?(*args, **options, &optional_filter_block)
|
799
|
+
make_predicate(options) { assert_sibling(*args, options, &optional_filter_block) }
|
800
|
+
end
|
801
|
+
|
802
|
+
##
|
803
|
+
#
|
804
|
+
# Predicate version of {#assert_no_sibling}
|
805
|
+
#
|
806
|
+
def has_no_sibling?(*args, **options, &optional_filter_block)
|
807
|
+
make_predicate(options) { assert_no_sibling(*args, options, &optional_filter_block) }
|
808
|
+
end
|
809
|
+
|
721
810
|
def ==(other)
|
722
811
|
eql?(other) || (other.respond_to?(:base) && base == other.base)
|
723
812
|
end
|
@@ -736,9 +825,9 @@ module Capybara
|
|
736
825
|
end
|
737
826
|
end
|
738
827
|
|
739
|
-
def _verify_selector_result(query_args, optional_filter_block)
|
828
|
+
def _verify_selector_result(query_args, optional_filter_block, query_type = Capybara::Queries::SelectorQuery)
|
740
829
|
query_args = _set_query_session_options(*query_args)
|
741
|
-
query =
|
830
|
+
query = query_type.new(*query_args, &optional_filter_block)
|
742
831
|
synchronize(query.wait) do
|
743
832
|
yield query.resolve_for(self), query
|
744
833
|
end
|