capybara 3.25.0 → 3.28.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 +45 -0
- data/README.md +1 -1
- data/lib/capybara/minitest.rb +29 -29
- data/lib/capybara/node/element.rb +52 -18
- data/lib/capybara/node/matchers.rb +6 -6
- data/lib/capybara/node/simple.rb +2 -1
- data/lib/capybara/queries/ancestor_query.rb +5 -9
- data/lib/capybara/queries/selector_query.rb +2 -2
- data/lib/capybara/queries/sibling_query.rb +4 -10
- data/lib/capybara/queries/text_query.rb +7 -1
- data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
- data/lib/capybara/registrations/servers.rb +7 -1
- data/lib/capybara/rspec/matchers.rb +65 -43
- data/lib/capybara/selector.rb +6 -1
- data/lib/capybara/selector/definition/fillable_field.rb +1 -1
- data/lib/capybara/selector/definition/option.rb +1 -1
- data/lib/capybara/selector/regexp_disassembler.rb +7 -0
- data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -1
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +9 -9
- data/lib/capybara/selenium/driver.rb +11 -3
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +9 -8
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +14 -10
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +16 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +0 -4
- data/lib/capybara/selenium/extensions/html5_drag.rb +10 -5
- data/lib/capybara/selenium/node.rb +29 -2
- data/lib/capybara/selenium/nodes/chrome_node.rb +41 -9
- data/lib/capybara/selenium/nodes/edge_node.rb +28 -12
- data/lib/capybara/selenium/nodes/firefox_node.rb +16 -4
- data/lib/capybara/selenium/nodes/safari_node.rb +0 -4
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/server.rb +4 -0
- data/lib/capybara/session.rb +4 -4
- data/lib/capybara/spec/session/has_field_spec.rb +18 -0
- data/lib/capybara/spec/session/has_text_spec.rb +6 -0
- data/lib/capybara/spec/session/node_spec.rb +128 -23
- data/lib/capybara/spec/views/form.erb +6 -1
- data/lib/capybara/spec/views/with_html.erb +10 -0
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/version.rb +1 -1
- data/spec/basic_node_spec.rb +6 -6
- data/spec/capybara_spec.rb +28 -28
- data/spec/filter_set_spec.rb +5 -5
- data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +1 -1
- data/spec/rack_test_spec.rb +9 -9
- data/spec/regexp_dissassembler_spec.rb +12 -2
- data/spec/rspec/shared_spec_matchers.rb +2 -2
- data/spec/rspec_spec.rb +1 -1
- data/spec/selector_spec.rb +15 -15
- data/spec/selenium_spec_chrome.rb +38 -0
- data/spec/selenium_spec_chrome_remote.rb +0 -6
- data/spec/selenium_spec_edge.rb +14 -15
- data/spec/selenium_spec_firefox.rb +1 -1
- data/spec/selenium_spec_firefox_remote.rb +0 -6
- data/spec/selenium_spec_ie.rb +1 -6
- data/spec/server_spec.rb +26 -17
- data/spec/session_spec.rb +4 -4
- data/spec/shared_selenium_node.rb +36 -0
- data/spec/shared_selenium_session.rb +2 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59f170c7004d4936ffb0d136a4dd0755a9c1ec5870f6bf1114d693b99a8fed51
|
4
|
+
data.tar.gz: 955e163359d522952afdc7d776458667f97aa053e6eb704320733eae8340544a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13d33c4977455c5d2e9a5aa7532ffed98573795a1528685ded75574dfabd58512f5d3e71d3582d8155fe4325209ba3bbde3246a29b4436de573c5b492dffe1cc
|
7
|
+
data.tar.gz: 52b33d646ec5c86b61a04b7f2c354a1d1e77d1c363b0ba8d19e7ad1b48679a53078766c8f018f1d7f223b730d9b4d951f005a689a3f143999fdeead4c522242c
|
data/History.md
CHANGED
@@ -1,3 +1,48 @@
|
|
1
|
+
# Version 3.28.0
|
2
|
+
Release date: 2019-08-03
|
3
|
+
|
4
|
+
### Added
|
5
|
+
|
6
|
+
* Allow forcing HTML5 or legacy dragging via the `:html5` option to `drag_to` when using Selenium with Chrome or Firefox
|
7
|
+
* Autodetection of drag type interprets not seeing the mousedown event as legacy.
|
8
|
+
* HTML5 form validation `:valid` node filter added to `:field` and `:fillable_field` selectors
|
9
|
+
* When using Capybara registered :puma server - patches Puma 4.0.x to fix SSL connection behavior. Removes
|
10
|
+
default `queue_requests` setting - Issue #2227
|
11
|
+
|
12
|
+
# Version 3.27.0
|
13
|
+
Release date: 2019-07-28
|
14
|
+
|
15
|
+
### Added
|
16
|
+
|
17
|
+
* Allow to use chromedriver/geckodriver native `is_element_displayed` endpoint via Selenium
|
18
|
+
driver `native_displayed` option for performance reasons. Disabled by default due to endpoints
|
19
|
+
currently not handling <details> element descendants visibility correctly.
|
20
|
+
|
21
|
+
### Fixed
|
22
|
+
|
23
|
+
* Ignore negative lookahead/lookbehind regex when performing initial XPath text matching
|
24
|
+
* Reloading of elements found via `ancestor` and `sibling`
|
25
|
+
* Only default puma settings to `queue_requests: false` when using SSL
|
26
|
+
* Visibility of descendants of <details> elements is correctly determined when using rack_test
|
27
|
+
and the selenium driver with Capybara optimized atoms
|
28
|
+
* local/session storage clearance in Chrome when clearing only one of them - Issue #2233
|
29
|
+
|
30
|
+
# Version 3.26.0
|
31
|
+
Release date: 2019-07-15
|
32
|
+
|
33
|
+
### Added
|
34
|
+
|
35
|
+
* `w3c_click_offset` configuration option applies to `right_click` and `double_click` as well as `click`
|
36
|
+
* Warning when passing `nil` to the text/content assertions/expectations
|
37
|
+
* `Session#server_url` returns the base url the AUT is being run at (when controlled by Capybara)
|
38
|
+
* `option` selector type accepts an integer as locator
|
39
|
+
|
40
|
+
### Fixed
|
41
|
+
|
42
|
+
* Default puma server registration now specifies `queue_requests: false` - Issue #2227
|
43
|
+
* Workaround issue with FF 68 and hanging during reset if a system modal is visible
|
44
|
+
* Don't expand file path if it's already absolute - Issue #2228
|
45
|
+
|
1
46
|
# Version 3.25.0
|
2
47
|
Release date: 2019-06-27
|
3
48
|
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jnicklas/capybara?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
8
8
|
[![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=capybara&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=capybara&package-manager=bundler&version-scheme=semver)
|
9
9
|
|
10
|
-
**Note** You are viewing the README for the 3.
|
10
|
+
**Note** You are viewing the README for the 3.28.x version of Capybara.
|
11
11
|
|
12
12
|
Capybara helps you test web applications by simulating how a real user would
|
13
13
|
interact with your app. It is agnostic about the driver running your tests and
|
data/lib/capybara/minitest.rb
CHANGED
@@ -9,38 +9,38 @@ module Capybara
|
|
9
9
|
## Assert text exists
|
10
10
|
#
|
11
11
|
# @!method assert_text
|
12
|
-
#
|
12
|
+
# @see Capybara::Node::Matchers#assert_text
|
13
13
|
|
14
14
|
## Assert text does not exist
|
15
15
|
#
|
16
16
|
# @!method assert_no_text
|
17
|
-
#
|
17
|
+
# @see Capybara::Node::Matchers#assert_no_text
|
18
18
|
|
19
19
|
##
|
20
20
|
# Assertion that page title does match
|
21
21
|
#
|
22
22
|
# @!method assert_title
|
23
|
-
# see
|
23
|
+
# @see Capybara::Node::DocumentMatchers#assert_title
|
24
24
|
|
25
25
|
##
|
26
26
|
# Assertion that page title does not match
|
27
27
|
#
|
28
28
|
# @!method refute_title
|
29
29
|
# @!method assert_no_title
|
30
|
-
# see
|
30
|
+
# @see Capybara::Node::DocumentMatchers#assert_no_title
|
31
31
|
|
32
32
|
##
|
33
33
|
# Assertion that current path matches
|
34
34
|
#
|
35
35
|
# @!method assert_current_path
|
36
|
-
# see
|
36
|
+
# @see Capybara::SessionMatchers#assert_current_path
|
37
37
|
|
38
38
|
##
|
39
39
|
# Assertion that current page does not match
|
40
40
|
#
|
41
41
|
# @!method refute_current_path
|
42
42
|
# @!method assert_no_current_path
|
43
|
-
# see
|
43
|
+
# @see Capybara::SessionMatchers#assert_no_current_path
|
44
44
|
|
45
45
|
%w[text no_text title no_title current_path no_current_path].each do |assertion_name|
|
46
46
|
class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
|
@@ -64,37 +64,37 @@ module Capybara
|
|
64
64
|
## Assert selector exists on page
|
65
65
|
#
|
66
66
|
# @!method assert_selector
|
67
|
-
# see
|
67
|
+
# @see Capybara::Node::Matchers#assert_selector
|
68
68
|
|
69
69
|
## Assert selector does not exist on page
|
70
70
|
#
|
71
71
|
# @!method assert_no_selector
|
72
|
-
# see
|
72
|
+
# @see Capybara::Node::Matchers#assert_no_selector
|
73
73
|
|
74
74
|
## Assert element matches selector
|
75
75
|
#
|
76
76
|
# @!method assert_matches_selector
|
77
|
-
# see
|
77
|
+
# @see Capybara::Node::Matchers#assert_matches_selector
|
78
78
|
|
79
79
|
## Assert element does not match selector
|
80
80
|
#
|
81
81
|
# @!method assert_xpath
|
82
|
-
# see
|
82
|
+
# @see Capybara::Node::Matchers#assert_not_matches_selector
|
83
83
|
|
84
84
|
## Assert element has the provided CSS styles
|
85
85
|
#
|
86
86
|
# @!method assert_matches_style
|
87
|
-
# see
|
87
|
+
# @see Capybara::Node::Matchers#assert_matches_style
|
88
88
|
|
89
89
|
## Assert element has a matching sibling
|
90
90
|
#
|
91
91
|
# @!method assert_sibling
|
92
|
-
# see
|
92
|
+
# @see Capybara::Node::Matchers#assert_sibling
|
93
93
|
|
94
94
|
## Assert element has a matching ancestor
|
95
95
|
#
|
96
96
|
# @!method assert_ancestor
|
97
|
-
# see
|
97
|
+
# @see Capybara::Node::Matchers#assert_ancestor
|
98
98
|
|
99
99
|
%w[selector no_selector matches_style
|
100
100
|
all_of_selectors none_of_selectors any_of_selectors
|
@@ -163,72 +163,72 @@ module Capybara
|
|
163
163
|
# Assertion that there is xpath
|
164
164
|
#
|
165
165
|
# @!method assert_xpath
|
166
|
-
# see
|
166
|
+
# @see Capybara::Node::Matchers#has_xpath?
|
167
167
|
|
168
168
|
##
|
169
169
|
# Assertion that there is no xpath
|
170
170
|
#
|
171
171
|
# @!method refute_xpath
|
172
172
|
# @!method assert_no_xpath
|
173
|
-
# see
|
173
|
+
# @see Capybara::Node::Matchers#has_no_xpath?
|
174
174
|
|
175
175
|
##
|
176
176
|
# Assertion that there is css
|
177
177
|
#
|
178
178
|
# @!method assert_css
|
179
|
-
# see
|
179
|
+
# @see Capybara::Node::Matchers#has_css?
|
180
180
|
|
181
181
|
##
|
182
182
|
# Assertion that there is no css
|
183
183
|
#
|
184
184
|
# @!method refute_css
|
185
185
|
# @!method assert_no_css
|
186
|
-
# see
|
186
|
+
# @see Capybara::Node::Matchers#has_no_css?
|
187
187
|
|
188
188
|
##
|
189
189
|
# Assertion that there is link
|
190
190
|
#
|
191
191
|
# @!method assert_link
|
192
|
-
# see
|
192
|
+
# @see Capybara::Node::Matchers#has_link?
|
193
193
|
|
194
194
|
##
|
195
195
|
# Assertion that there is no link
|
196
196
|
#
|
197
197
|
# @!method assert_no_link
|
198
198
|
# @!method refute_link
|
199
|
-
#
|
199
|
+
# @see Capybara::Node::Matchers#has_no_link?
|
200
200
|
|
201
201
|
##
|
202
202
|
# Assertion that there is button
|
203
203
|
#
|
204
204
|
# @!method assert_button
|
205
|
-
# see
|
205
|
+
# @see Capybara::Node::Matchers#has_button?
|
206
206
|
|
207
207
|
##
|
208
208
|
# Assertion that there is no button
|
209
209
|
#
|
210
210
|
# @!method refute_button
|
211
211
|
# @!method assert_no_button
|
212
|
-
# see
|
212
|
+
# @see Capybara::Node::Matchers#has_no_button?
|
213
213
|
|
214
214
|
##
|
215
215
|
# Assertion that there is field
|
216
216
|
#
|
217
217
|
# @!method assert_field
|
218
|
-
# see
|
218
|
+
# @see Capybara::Node::Matchers#has_field?
|
219
219
|
|
220
220
|
##
|
221
221
|
# Assertion that there is no field
|
222
222
|
#
|
223
223
|
# @!method refute_field
|
224
224
|
# @!method assert_no_field
|
225
|
-
# see
|
225
|
+
# @see Capybara::Node::Matchers#has_no_field?
|
226
226
|
|
227
227
|
##
|
228
228
|
# Assertion that there is checked_field
|
229
229
|
#
|
230
230
|
# @!method assert_checked_field
|
231
|
-
# see
|
231
|
+
# @see Capybara::Node::Matchers#has_checked_field?
|
232
232
|
|
233
233
|
##
|
234
234
|
# Assertion that there is no checked_field
|
@@ -240,7 +240,7 @@ module Capybara
|
|
240
240
|
# Assertion that there is unchecked_field
|
241
241
|
#
|
242
242
|
# @!method assert_unchecked_field
|
243
|
-
# see
|
243
|
+
# @see Capybara::Node::Matchers#has_unchecked_field?
|
244
244
|
|
245
245
|
##
|
246
246
|
# Assertion that there is no unchecked_field
|
@@ -252,27 +252,27 @@ module Capybara
|
|
252
252
|
# Assertion that there is select
|
253
253
|
#
|
254
254
|
# @!method assert_select
|
255
|
-
# see
|
255
|
+
# @see Capybara::Node::Matchers#has_select?
|
256
256
|
|
257
257
|
##
|
258
258
|
# Assertion that there is no select
|
259
259
|
#
|
260
260
|
# @!method refute_select
|
261
261
|
# @!method assert_no_select
|
262
|
-
# see
|
262
|
+
# @see Capybara::Node::Matchers#has_no_select?
|
263
263
|
|
264
264
|
##
|
265
265
|
# Assertion that there is table
|
266
266
|
#
|
267
267
|
# @!method assert_table
|
268
|
-
# see
|
268
|
+
# @see Capybara::Node::Matchers#has_table?
|
269
269
|
|
270
270
|
##
|
271
271
|
# Assertion that there is no table
|
272
272
|
#
|
273
273
|
# @!method refute_table
|
274
274
|
# @!method assert_no_table
|
275
|
-
# see
|
275
|
+
# @see Capybara::Node::Matchers#has_no_table?
|
276
276
|
|
277
277
|
private
|
278
278
|
|
@@ -162,12 +162,10 @@ module Capybara
|
|
162
162
|
# @option options [Integer] y Y coordinate to offset the click location. If {Capybara.configure w3c_click_offset} is `true` the
|
163
163
|
# offset will be from the element center, otherwise it will be from the top left corner of the element
|
164
164
|
# @return [Capybara::Node::Element] The element
|
165
|
-
def click(*keys,
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
synchronize(wait) { base.click(Array(keys), options) }
|
170
|
-
self
|
165
|
+
def click(*keys, **options)
|
166
|
+
perform_click_action(keys, options) do |k, opts|
|
167
|
+
base.click(k, opts)
|
168
|
+
end
|
171
169
|
end
|
172
170
|
|
173
171
|
##
|
@@ -177,11 +175,10 @@ module Capybara
|
|
177
175
|
# @macro action_waiting_behavior
|
178
176
|
# @macro click_modifiers
|
179
177
|
# @return [Capybara::Node::Element] The element
|
180
|
-
def right_click(*keys,
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
self
|
178
|
+
def right_click(*keys, **options)
|
179
|
+
perform_click_action(keys, options) do |k, opts|
|
180
|
+
base.right_click(k, opts)
|
181
|
+
end
|
185
182
|
end
|
186
183
|
|
187
184
|
##
|
@@ -191,11 +188,10 @@ module Capybara
|
|
191
188
|
# @macro action_waiting_behavior
|
192
189
|
# @macro click_modifiers
|
193
190
|
# @return [Capybara::Node::Element] The element
|
194
|
-
def double_click(*keys,
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
self
|
191
|
+
def double_click(*keys, **options)
|
192
|
+
perform_click_action(keys, options) do |k, opts|
|
193
|
+
base.double_click(k, opts)
|
194
|
+
end
|
199
195
|
end
|
200
196
|
|
201
197
|
##
|
@@ -400,8 +396,13 @@ module Capybara
|
|
400
396
|
#
|
401
397
|
# @param [Capybara::Node::Element] node The element to drag to
|
402
398
|
# @param [Hash] options Driver specific options for dragging. May not be supported by all drivers.
|
399
|
+
# @option options [Numeric] :delay (0.05) When using Chrome/Firefox with Selenium and HTML5 dragging this is the number
|
400
|
+
# of seconds between each stage of the drag.
|
401
|
+
# @option options [Boolean] :html5 When using Chrome/Firefox with Selenium enables to force the use of HTML5
|
402
|
+
# (true) or legacy (false) dragging. If not specified the driver will attempt to
|
403
|
+
# detect the correct method to use.
|
403
404
|
#
|
404
|
-
# @return [Capybara::Node::Element] The element
|
405
|
+
# @return [Capybara::Node::Element] The dragged element
|
405
406
|
def drag_to(node, **options)
|
406
407
|
synchronize { base.drag_to(node.base, **options) }
|
407
408
|
self
|
@@ -514,11 +515,34 @@ module Capybara
|
|
514
515
|
JS
|
515
516
|
end
|
516
517
|
|
518
|
+
##
|
519
|
+
#
|
520
|
+
# Toggle the elements background color between white and black for a period of time.
|
521
|
+
#
|
522
|
+
# @return [Capybara::Node::Element] The element
|
523
|
+
def flash
|
524
|
+
execute_script(<<~JS, 100)
|
525
|
+
async function flash(el, delay){
|
526
|
+
var old_bg = el.style.backgroundColor;
|
527
|
+
var colors = ["black", "white"];
|
528
|
+
for(var i=0; i<20; i++){
|
529
|
+
el.style.backgroundColor = colors[i % colors.length];
|
530
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
531
|
+
}
|
532
|
+
el.style.backgroundColor = old_bg;
|
533
|
+
}
|
534
|
+
flash(this, arguments[0]);
|
535
|
+
JS
|
536
|
+
|
537
|
+
self
|
538
|
+
end
|
539
|
+
|
517
540
|
# @api private
|
518
541
|
def reload
|
519
542
|
if @allow_reload
|
520
543
|
begin
|
521
|
-
reloaded =
|
544
|
+
reloaded = @query.resolve_for(query_scope.reload)&.first
|
545
|
+
|
522
546
|
@base = reloaded.base if reloaded
|
523
547
|
rescue StandardError => e
|
524
548
|
raise e unless catch_error?(e)
|
@@ -556,6 +580,16 @@ module Capybara
|
|
556
580
|
return result;
|
557
581
|
}).apply(this, arguments)
|
558
582
|
JS
|
583
|
+
|
584
|
+
private
|
585
|
+
|
586
|
+
def perform_click_action(keys, wait: nil, **options)
|
587
|
+
raise ArgumentError, 'You must specify both x: and y: for a click offset' if nil ^ options[:x] ^ options[:y]
|
588
|
+
|
589
|
+
options[:offset] ||= :center if session_options.w3c_click_offset
|
590
|
+
synchronize(wait) { yield keys, options }
|
591
|
+
self
|
592
|
+
end
|
559
593
|
end
|
560
594
|
end
|
561
595
|
end
|
@@ -141,8 +141,8 @@ module Capybara
|
|
141
141
|
# or descendants of the current node. If options are provided, the assertion
|
142
142
|
# will check that each locator is present with those options as well (other than `:wait`).
|
143
143
|
#
|
144
|
-
#
|
145
|
-
#
|
144
|
+
# page.assert_all_of_selectors(:custom, 'Tom', 'Joe', visible: all)
|
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
148
|
# such as `:text` and `:visible`.
|
@@ -162,8 +162,8 @@ module Capybara
|
|
162
162
|
# or descendants of the current node. If options are provided, the assertion
|
163
163
|
# will check that each locator is not present with those options as well (other than `:wait`).
|
164
164
|
#
|
165
|
-
#
|
166
|
-
#
|
165
|
+
# page.assert_none_of_selectors(:custom, 'Tom', 'Joe', visible: all)
|
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
169
|
# such as `:text` and `:visible`.
|
@@ -183,8 +183,8 @@ module Capybara
|
|
183
183
|
# or descendants of the current node. If options are provided, the assertion
|
184
184
|
# will check that each locator is present with those options as well (other than `:wait`).
|
185
185
|
#
|
186
|
-
#
|
187
|
-
#
|
186
|
+
# page.assert_any_of_selectors(:custom, 'Tom', 'Joe', visible: all)
|
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
190
|
# such as `:text` and `:visible`.
|
data/lib/capybara/node/simple.rb
CHANGED
@@ -197,7 +197,8 @@ module Capybara
|
|
197
197
|
x.ancestor_or_self[
|
198
198
|
x.attr(:style)[x.contains('display:none') | x.contains('display: none')] |
|
199
199
|
x.attr(:hidden) |
|
200
|
-
x.qname.one_of('script', 'head')
|
200
|
+
x.qname.one_of('script', 'head') |
|
201
|
+
(~x.self(:summary) & XPath.parent(:details))
|
201
202
|
].boolean
|
202
203
|
end.to_s.freeze
|
203
204
|
end
|
@@ -3,20 +3,16 @@
|
|
3
3
|
module Capybara
|
4
4
|
module Queries
|
5
5
|
class AncestorQuery < Capybara::Queries::SelectorQuery
|
6
|
-
def initialize(*args)
|
7
|
-
super
|
8
|
-
@count_options = {}
|
9
|
-
COUNT_KEYS.each do |key|
|
10
|
-
@count_options[key] = @options.delete(key) if @options.key?(key)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
6
|
# @api private
|
15
7
|
def resolve_for(node, exact = nil)
|
16
8
|
@child_node = node
|
9
|
+
|
17
10
|
node.synchronize do
|
18
11
|
match_results = super(node.session.current_scope, exact)
|
19
|
-
node.
|
12
|
+
ancestors = node.find_xpath(XPath.ancestor.to_s)
|
13
|
+
.map(&method(:to_element))
|
14
|
+
.select { |el| match_results.include?(el) }
|
15
|
+
Capybara::Result.new(ancestors, self)
|
20
16
|
end
|
21
17
|
end
|
22
18
|
|