capybara 2.18.0 → 3.40.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 -1
- data/History.md +945 -12
- data/License.txt +1 -1
- data/README.md +264 -90
- data/lib/capybara/config.rb +29 -57
- data/lib/capybara/cucumber.rb +2 -3
- data/lib/capybara/driver/base.rb +35 -18
- data/lib/capybara/driver/node.rb +40 -10
- data/lib/capybara/dsl.rb +10 -7
- data/lib/capybara/helpers.rb +70 -31
- data/lib/capybara/minitest/spec.rb +185 -83
- data/lib/capybara/minitest.rb +232 -112
- data/lib/capybara/node/actions.rb +274 -171
- data/lib/capybara/node/base.rb +42 -34
- data/lib/capybara/node/document.rb +15 -3
- data/lib/capybara/node/document_matchers.rb +19 -21
- data/lib/capybara/node/element.rb +362 -135
- data/lib/capybara/node/finders.rb +151 -137
- data/lib/capybara/node/matchers.rb +394 -209
- data/lib/capybara/node/simple.rb +59 -26
- data/lib/capybara/node/whitespace_normalizer.rb +81 -0
- data/lib/capybara/queries/active_element_query.rb +18 -0
- data/lib/capybara/queries/ancestor_query.rb +12 -9
- data/lib/capybara/queries/base_query.rb +39 -28
- data/lib/capybara/queries/current_path_query.rb +21 -27
- data/lib/capybara/queries/match_query.rb +14 -7
- data/lib/capybara/queries/selector_query.rb +659 -149
- data/lib/capybara/queries/sibling_query.rb +11 -9
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +56 -38
- data/lib/capybara/queries/title_query.rb +8 -11
- data/lib/capybara/rack_test/browser.rb +114 -42
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +22 -17
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +93 -58
- data/lib/capybara/rack_test/node.rb +184 -81
- data/lib/capybara/rails.rb +3 -7
- data/lib/capybara/registration_container.rb +41 -0
- data/lib/capybara/registrations/drivers.rb +42 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
- data/lib/capybara/registrations/servers.rb +66 -0
- data/lib/capybara/result.rb +97 -63
- data/lib/capybara/rspec/features.rb +17 -50
- data/lib/capybara/rspec/matcher_proxies.rb +52 -15
- data/lib/capybara/rspec/matchers/base.rb +113 -0
- data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
- data/lib/capybara/rspec/matchers/compound.rb +88 -0
- data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
- data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
- data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
- data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
- data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/lib/capybara/rspec/matchers/have_text.rb +33 -0
- data/lib/capybara/rspec/matchers/have_title.rb +29 -0
- data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
- data/lib/capybara/rspec/matchers/match_style.rb +43 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/rspec/matchers.rb +146 -310
- data/lib/capybara/rspec.rb +7 -11
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
- data/lib/capybara/selector/css.rb +85 -13
- data/lib/capybara/selector/definition/button.rb +68 -0
- data/lib/capybara/selector/definition/checkbox.rb +26 -0
- data/lib/capybara/selector/definition/css.rb +10 -0
- data/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/lib/capybara/selector/definition/element.rb +28 -0
- data/lib/capybara/selector/definition/field.rb +40 -0
- data/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/lib/capybara/selector/definition/file_field.rb +13 -0
- data/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/lib/capybara/selector/definition/frame.rb +17 -0
- data/lib/capybara/selector/definition/id.rb +6 -0
- data/lib/capybara/selector/definition/label.rb +62 -0
- data/lib/capybara/selector/definition/link.rb +55 -0
- data/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/lib/capybara/selector/definition/option.rb +27 -0
- data/lib/capybara/selector/definition/radio_button.rb +27 -0
- data/lib/capybara/selector/definition/select.rb +81 -0
- data/lib/capybara/selector/definition/table.rb +109 -0
- data/lib/capybara/selector/definition/table_row.rb +21 -0
- data/lib/capybara/selector/definition/xpath.rb +5 -0
- data/lib/capybara/selector/definition.rb +280 -0
- data/lib/capybara/selector/filter.rb +2 -17
- data/lib/capybara/selector/filter_set.rb +80 -33
- data/lib/capybara/selector/filters/base.rb +50 -6
- data/lib/capybara/selector/filters/expression_filter.rb +8 -26
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +16 -12
- data/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/lib/capybara/selector/selector.rb +93 -210
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +475 -523
- data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
- data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
- data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
- data/lib/capybara/selenium/driver.rb +298 -267
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +110 -0
- data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +76 -0
- data/lib/capybara/selenium/node.rb +517 -145
- data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
- data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +45 -0
- data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
- data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/lib/capybara/server/animation_disabler.rb +80 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +71 -0
- data/lib/capybara/server.rb +59 -67
- data/lib/capybara/session/config.rb +81 -67
- data/lib/capybara/session/matchers.rb +28 -20
- data/lib/capybara/session.rb +337 -365
- data/lib/capybara/spec/public/jquery.js +5 -5
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +151 -12
- data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
- data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
- data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +161 -57
- data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
- data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
- data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
- data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
- data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
- data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +22 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
- data/lib/capybara/spec/session/body_spec.rb +12 -13
- data/lib/capybara/spec/session/check_spec.rb +117 -55
- data/lib/capybara/spec/session/choose_spec.rb +64 -31
- data/lib/capybara/spec/session/click_button_spec.rb +231 -173
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
- data/lib/capybara/spec/session/click_link_spec.rb +93 -58
- data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
- data/lib/capybara/spec/session/current_url_spec.rb +57 -39
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -2
- data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
- data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
- data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
- data/lib/capybara/spec/session/find_button_spec.rb +25 -24
- data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
- data/lib/capybara/spec/session/find_field_spec.rb +37 -41
- data/lib/capybara/spec/session/find_link_spec.rb +46 -17
- data/lib/capybara/spec/session/find_spec.rb +260 -145
- data/lib/capybara/spec/session/first_spec.rb +80 -52
- 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 +33 -20
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
- data/lib/capybara/spec/session/go_back_spec.rb +2 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
- data/lib/capybara/spec/session/has_button_spec.rb +100 -13
- data/lib/capybara/spec/session/has_css_spec.rb +272 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
- data/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/lib/capybara/spec/session/has_field_spec.rb +139 -59
- data/lib/capybara/spec/session/has_link_spec.rb +47 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
- data/lib/capybara/spec/session/has_select_spec.rb +107 -72
- data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +183 -5
- data/lib/capybara/spec/session/has_text_spec.rb +106 -62
- data/lib/capybara/spec/session/has_title_spec.rb +20 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
- data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
- data/lib/capybara/spec/session/html_spec.rb +14 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
- data/lib/capybara/spec/session/node_spec.rb +1024 -153
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +12 -6
- data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
- data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
- data/lib/capybara/spec/session/save_page_spec.rb +42 -55
- data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +119 -0
- data/lib/capybara/spec/session/select_spec.rb +107 -81
- data/lib/capybara/spec/session/selectors_spec.rb +52 -19
- data/lib/capybara/spec/session/sibling_spec.rb +10 -10
- data/lib/capybara/spec/session/text_spec.rb +37 -21
- data/lib/capybara/spec/session/title_spec.rb +17 -5
- data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
- data/lib/capybara/spec/session/unselect_spec.rb +39 -38
- data/lib/capybara/spec/session/visit_spec.rb +85 -53
- data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
- data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
- data/lib/capybara/spec/session/window/window_spec.rb +97 -63
- data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
- data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
- data/lib/capybara/spec/session/within_spec.rb +83 -44
- data/lib/capybara/spec/spec_helper.rb +54 -44
- data/lib/capybara/spec/test_app.rb +158 -43
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +163 -42
- data/lib/capybara/spec/views/frame_child.erb +4 -3
- data/lib/capybara/spec/views/frame_one.erb +2 -1
- data/lib/capybara/spec/views/frame_parent.erb +1 -1
- data/lib/capybara/spec/views/frame_two.erb +1 -1
- data/lib/capybara/spec/views/initial_alert.erb +2 -1
- data/lib/capybara/spec/views/layout.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +33 -0
- data/lib/capybara/spec/views/path.erb +2 -2
- data/lib/capybara/spec/views/popup_one.erb +1 -1
- data/lib/capybara/spec/views/popup_two.erb +1 -1
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +21 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +68 -1
- data/lib/capybara/spec/views/with_animation.erb +81 -0
- data/lib/capybara/spec/views/with_base_tag.erb +2 -2
- data/lib/capybara/spec/views/with_dragula.erb +24 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
- data/lib/capybara/spec/views/with_hover.erb +3 -2
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +69 -12
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +30 -5
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +21 -0
- data/lib/capybara/spec/views/with_scope.erb +2 -2
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_shadow.erb +31 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
- data/lib/capybara/spec/views/with_windows.erb +1 -1
- data/lib/capybara/spec/views/within_frames.erb +5 -2
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +36 -34
- data/lib/capybara.rb +134 -107
- data/spec/basic_node_spec.rb +60 -34
- data/spec/capybara_spec.rb +63 -88
- data/spec/counter_spec.rb +35 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +85 -64
- data/spec/filter_set_spec.rb +27 -9
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
- data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
- data/spec/minitest_spec.rb +52 -7
- data/spec/minitest_spec_spec.rb +94 -63
- data/spec/per_session_config_spec.rb +14 -13
- data/spec/rack_test_spec.rb +194 -125
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +111 -50
- data/spec/rspec/features_spec.rb +37 -31
- data/spec/rspec/scenarios_spec.rb +10 -8
- data/spec/rspec/shared_spec_matchers.rb +473 -422
- data/spec/rspec/views_spec.rb +5 -3
- data/spec/rspec_matchers_spec.rb +52 -11
- data/spec/rspec_spec.rb +109 -89
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +397 -68
- data/spec/selenium_spec_chrome.rb +187 -40
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +60 -0
- data/spec/selenium_spec_firefox.rb +201 -41
- data/spec/selenium_spec_firefox_remote.rb +94 -0
- data/spec/selenium_spec_ie.rb +149 -0
- data/spec/selenium_spec_safari.rb +162 -0
- data/spec/server_spec.rb +213 -102
- data/spec/session_spec.rb +53 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +473 -122
- data/spec/spec_helper.rb +126 -7
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +355 -73
- data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
- data/.yard/templates_custom/default/class/html/setup.rb +0 -17
- data/.yard/yard_extensions.rb +0 -78
- data/lib/capybara/query.rb +0 -7
- data/lib/capybara/rspec/compound.rb +0 -95
- data/lib/capybara/spec/session/assert_current_path.rb +0 -72
- data/lib/capybara/spec/session/assert_selector.rb +0 -148
- data/lib/capybara/spec/session/assert_text.rb +0 -234
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/views/with_title.erb +0 -5
- data/spec/selenium_spec_marionette.rb +0 -127
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Capybara
|
|
4
|
+
class Server
|
|
5
|
+
class AnimationDisabler
|
|
6
|
+
def self.selector_for(css_or_bool)
|
|
7
|
+
case css_or_bool
|
|
8
|
+
when String
|
|
9
|
+
css_or_bool
|
|
10
|
+
when true
|
|
11
|
+
'*'
|
|
12
|
+
else
|
|
13
|
+
raise CapybaraError, 'Capybara.disable_animation supports either a String (the css selector to disable) or a boolean'
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def initialize(app)
|
|
18
|
+
@app = app
|
|
19
|
+
@disable_css_markup = format(DISABLE_CSS_MARKUP_TEMPLATE,
|
|
20
|
+
selector: self.class.selector_for(Capybara.disable_animation))
|
|
21
|
+
@disable_js_markup = +DISABLE_JS_MARKUP_TEMPLATE
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def call(env)
|
|
25
|
+
status, headers, body = @app.call(env)
|
|
26
|
+
return [status, headers, body] unless html_content?(headers)
|
|
27
|
+
|
|
28
|
+
nonces = directive_nonces(headers).transform_values { |nonce| "nonce=\"#{nonce}\"" if nonce && !nonce.empty? }
|
|
29
|
+
response = Rack::Response.new([], status, headers)
|
|
30
|
+
|
|
31
|
+
body.each { |html| response.write insert_disable(html, nonces) }
|
|
32
|
+
body.close if body.respond_to?(:close)
|
|
33
|
+
|
|
34
|
+
response.finish
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
attr_reader :disable_css_markup, :disable_js_markup
|
|
40
|
+
|
|
41
|
+
def html_content?(headers)
|
|
42
|
+
/html/.match?(headers['Content-Type']) # rubocop:todo Performance/StringInclude
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def insert_disable(html, nonces)
|
|
46
|
+
html.sub(%r{(</head>)}, "<style #{nonces['style-src']}>#{disable_css_markup}</style>\\1")
|
|
47
|
+
.sub(%r{(</body>)}, "<script #{nonces['script-src']}>#{disable_js_markup}</script>\\1")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def directive_nonces(headers)
|
|
51
|
+
headers.fetch('Content-Security-Policy', '')
|
|
52
|
+
.split(';')
|
|
53
|
+
.map(&:split) # rubocop:disable Style/MapToHash
|
|
54
|
+
.to_h do |s|
|
|
55
|
+
[
|
|
56
|
+
s[0], s[1..].filter_map do |value|
|
|
57
|
+
/^'nonce-(?<nonce>.+)'/ =~ value
|
|
58
|
+
nonce
|
|
59
|
+
end[0]
|
|
60
|
+
]
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
DISABLE_CSS_MARKUP_TEMPLATE = <<~CSS
|
|
65
|
+
%<selector>s, %<selector>s::before, %<selector>s::after {
|
|
66
|
+
transition: none !important;
|
|
67
|
+
animation-duration: 0s !important;
|
|
68
|
+
animation-delay: 0s !important;
|
|
69
|
+
scroll-behavior: auto !important;
|
|
70
|
+
}
|
|
71
|
+
CSS
|
|
72
|
+
|
|
73
|
+
DISABLE_JS_MARKUP_TEMPLATE = <<~SCRIPT
|
|
74
|
+
//<![CDATA[
|
|
75
|
+
(typeof jQuery !== 'undefined') && (jQuery.fx.off = true);
|
|
76
|
+
//]]>
|
|
77
|
+
SCRIPT
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Capybara
|
|
4
|
+
class Server
|
|
5
|
+
class Checker
|
|
6
|
+
TRY_HTTPS_ERRORS = [EOFError, Net::ReadTimeout, Errno::ECONNRESET].freeze
|
|
7
|
+
|
|
8
|
+
def initialize(host, port)
|
|
9
|
+
@host, @port = host, port
|
|
10
|
+
@ssl = false
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def request(&block)
|
|
14
|
+
ssl? ? https_request(&block) : http_request(&block)
|
|
15
|
+
rescue *TRY_HTTPS_ERRORS
|
|
16
|
+
res = https_request(&block)
|
|
17
|
+
@ssl = true
|
|
18
|
+
res
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def ssl?
|
|
22
|
+
@ssl
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def http_request(&block)
|
|
28
|
+
make_request(read_timeout: 2, &block)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def https_request(&block)
|
|
32
|
+
make_request(**ssl_options, &block)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def make_request(**options, &block)
|
|
36
|
+
Net::HTTP.start(@host, @port, options.merge(max_retries: 0), &block)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def ssl_options
|
|
40
|
+
{ use_ssl: true, verify_mode: OpenSSL::SSL::VERIFY_NONE }
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Capybara
|
|
4
|
+
class Server
|
|
5
|
+
class Middleware
|
|
6
|
+
class Counter
|
|
7
|
+
def initialize
|
|
8
|
+
@value = []
|
|
9
|
+
@mutex = Mutex.new
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def increment(uri)
|
|
13
|
+
@mutex.synchronize { @value.push(uri) }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def decrement(uri)
|
|
17
|
+
@mutex.synchronize { @value.delete_at(@value.index(uri) || - 1) }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def positive?
|
|
21
|
+
@mutex.synchronize { @value.length.positive? }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def value
|
|
25
|
+
@mutex.synchronize { @value.dup }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
attr_reader :error
|
|
30
|
+
|
|
31
|
+
def initialize(app, server_errors, extra_middleware = [])
|
|
32
|
+
@app = app
|
|
33
|
+
@extended_app = extra_middleware.inject(@app) do |ex_app, klass|
|
|
34
|
+
klass.new(ex_app)
|
|
35
|
+
end
|
|
36
|
+
@counter = Counter.new
|
|
37
|
+
@server_errors = server_errors
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def pending_requests
|
|
41
|
+
@counter.value
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def pending_requests?
|
|
45
|
+
@counter.positive?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def clear_error
|
|
49
|
+
@error = nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def call(env)
|
|
53
|
+
if env['PATH_INFO'] == '/__identify__'
|
|
54
|
+
[200, {}, [@app.object_id.to_s]]
|
|
55
|
+
else
|
|
56
|
+
request_uri = env['REQUEST_URI']
|
|
57
|
+
@counter.increment(request_uri)
|
|
58
|
+
|
|
59
|
+
begin
|
|
60
|
+
@extended_app.call(env)
|
|
61
|
+
rescue *@server_errors => e
|
|
62
|
+
@error ||= e
|
|
63
|
+
raise e
|
|
64
|
+
ensure
|
|
65
|
+
@counter.decrement(request_uri)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
data/lib/capybara/server.rb
CHANGED
|
@@ -1,57 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'uri'
|
|
3
4
|
require 'net/http'
|
|
4
5
|
require 'rack'
|
|
6
|
+
require 'capybara/server/middleware'
|
|
7
|
+
require 'capybara/server/animation_disabler'
|
|
8
|
+
require 'capybara/server/checker'
|
|
5
9
|
|
|
6
10
|
module Capybara
|
|
11
|
+
# @api private
|
|
7
12
|
class Server
|
|
8
|
-
class Middleware
|
|
9
|
-
class Counter
|
|
10
|
-
attr_reader :value
|
|
11
|
-
|
|
12
|
-
def initialize
|
|
13
|
-
@value = 0
|
|
14
|
-
@mutex = Mutex.new
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def increment
|
|
18
|
-
@mutex.synchronize { @value += 1 }
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def decrement
|
|
22
|
-
@mutex.synchronize { @value -= 1 }
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
attr_accessor :error
|
|
27
|
-
|
|
28
|
-
def initialize(app, server_errors)
|
|
29
|
-
@app = app
|
|
30
|
-
@counter = Counter.new
|
|
31
|
-
@server_errors = server_errors
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def pending_requests?
|
|
35
|
-
@counter.value > 0
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def call(env)
|
|
39
|
-
if env["PATH_INFO"] == "/__identify__"
|
|
40
|
-
[200, {}, [@app.object_id.to_s]]
|
|
41
|
-
else
|
|
42
|
-
@counter.increment
|
|
43
|
-
begin
|
|
44
|
-
@app.call(env)
|
|
45
|
-
rescue *@server_errors => e
|
|
46
|
-
@error = e unless @error
|
|
47
|
-
raise e
|
|
48
|
-
ensure
|
|
49
|
-
@counter.decrement
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
13
|
class << self
|
|
56
14
|
def ports
|
|
57
15
|
@ports ||= {}
|
|
@@ -60,38 +18,55 @@ module Capybara
|
|
|
60
18
|
|
|
61
19
|
attr_reader :app, :port, :host
|
|
62
20
|
|
|
63
|
-
def initialize(app,
|
|
21
|
+
def initialize(app,
|
|
22
|
+
*deprecated_options,
|
|
23
|
+
port: Capybara.server_port,
|
|
24
|
+
host: Capybara.server_host,
|
|
25
|
+
reportable_errors: Capybara.server_errors,
|
|
26
|
+
extra_middleware: [])
|
|
27
|
+
unless deprecated_options.empty?
|
|
28
|
+
warn 'Positional arguments, other than the application, to Server#new are deprecated, please use keyword arguments'
|
|
29
|
+
end
|
|
64
30
|
@app = app
|
|
31
|
+
@extra_middleware = extra_middleware
|
|
65
32
|
@server_thread = nil # suppress warnings
|
|
66
|
-
@host
|
|
33
|
+
@host = deprecated_options[1] || host
|
|
34
|
+
@reportable_errors = deprecated_options[2] || reportable_errors
|
|
35
|
+
@port = deprecated_options[0] || port
|
|
67
36
|
@port ||= Capybara::Server.ports[port_key]
|
|
68
37
|
@port ||= find_available_port(host)
|
|
38
|
+
@checker = Checker.new(@host, @port)
|
|
69
39
|
end
|
|
70
40
|
|
|
71
41
|
def reset_error!
|
|
72
|
-
middleware.
|
|
42
|
+
middleware.clear_error
|
|
73
43
|
end
|
|
74
44
|
|
|
75
45
|
def error
|
|
76
46
|
middleware.error
|
|
77
47
|
end
|
|
78
48
|
|
|
49
|
+
def using_ssl?
|
|
50
|
+
@checker.ssl?
|
|
51
|
+
end
|
|
52
|
+
|
|
79
53
|
def responsive?
|
|
80
|
-
return false if @server_thread
|
|
54
|
+
return false if @server_thread&.join(0)
|
|
81
55
|
|
|
82
|
-
res =
|
|
56
|
+
res = @checker.request { |http| http.get('/__identify__') }
|
|
83
57
|
|
|
84
|
-
if res.is_a?(Net::HTTPSuccess)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
rescue SystemCallError
|
|
88
|
-
return false
|
|
58
|
+
res.body == app.object_id.to_s if res.is_a?(Net::HTTPSuccess) || res.is_a?(Net::HTTPRedirection)
|
|
59
|
+
rescue SystemCallError, Net::ReadTimeout, OpenSSL::SSL::SSLError
|
|
60
|
+
false
|
|
89
61
|
end
|
|
90
62
|
|
|
91
63
|
def wait_for_pending_requests
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
64
|
+
timer = Capybara::Helpers.timer(expire_in: 60)
|
|
65
|
+
while pending_requests?
|
|
66
|
+
raise "Requests did not finish in 60 seconds: #{middleware.pending_requests}" if timer.expired?
|
|
67
|
+
|
|
68
|
+
sleep 0.01
|
|
69
|
+
end
|
|
95
70
|
end
|
|
96
71
|
|
|
97
72
|
def boot
|
|
@@ -102,18 +77,25 @@ module Capybara
|
|
|
102
77
|
Capybara.server.call(middleware, port, host)
|
|
103
78
|
end
|
|
104
79
|
|
|
105
|
-
|
|
80
|
+
timer = Capybara::Helpers.timer(expire_in: 60)
|
|
81
|
+
until responsive?
|
|
82
|
+
raise 'Rack application timed out during boot' if timer.expired?
|
|
83
|
+
|
|
84
|
+
@server_thread.join(0.1)
|
|
85
|
+
end
|
|
106
86
|
end
|
|
107
|
-
|
|
108
|
-
raise "Rack application timed out during boot"
|
|
109
|
-
else
|
|
87
|
+
|
|
110
88
|
self
|
|
111
89
|
end
|
|
112
90
|
|
|
91
|
+
def base_url
|
|
92
|
+
"http#{'s' if using_ssl?}://#{host}:#{port}"
|
|
93
|
+
end
|
|
94
|
+
|
|
113
95
|
private
|
|
114
96
|
|
|
115
97
|
def middleware
|
|
116
|
-
@middleware ||= Middleware.new(app, @
|
|
98
|
+
@middleware ||= Middleware.new(app, @reportable_errors, @extra_middleware)
|
|
117
99
|
end
|
|
118
100
|
|
|
119
101
|
def port_key
|
|
@@ -126,9 +108,19 @@ module Capybara
|
|
|
126
108
|
|
|
127
109
|
def find_available_port(host)
|
|
128
110
|
server = TCPServer.new(host, 0)
|
|
129
|
-
server.addr[1]
|
|
111
|
+
port = server.addr[1]
|
|
112
|
+
server.close
|
|
113
|
+
|
|
114
|
+
# Workaround issue where some platforms (mac, ???) when passed a host
|
|
115
|
+
# of '0.0.0.0' will return a port that is only available on one of the
|
|
116
|
+
# ip addresses that resolves to, but the next binding to that port requires
|
|
117
|
+
# that port to be available on all ips
|
|
118
|
+
server = TCPServer.new(host, port)
|
|
119
|
+
port
|
|
120
|
+
rescue Errno::EADDRINUSE
|
|
121
|
+
retry
|
|
130
122
|
ensure
|
|
131
|
-
server
|
|
123
|
+
server&.close
|
|
132
124
|
end
|
|
133
125
|
end
|
|
134
126
|
end
|
|
@@ -1,61 +1,70 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'delegate'
|
|
3
4
|
|
|
4
5
|
module Capybara
|
|
5
6
|
class SessionConfig
|
|
6
|
-
OPTIONS = [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
OPTIONS = %i[always_include_port run_server default_selector default_max_wait_time ignore_hidden_elements
|
|
8
|
+
automatic_reload match exact exact_text raise_server_errors visible_text_only
|
|
9
|
+
automatic_label_click enable_aria_label save_path asset_host default_host app_host
|
|
10
|
+
server_host server_port server_errors default_set_options disable_animation test_id
|
|
11
|
+
predicates_wait default_normalize_ws w3c_click_offset enable_aria_role default_retry_interval].freeze
|
|
10
12
|
|
|
11
13
|
attr_accessor(*OPTIONS)
|
|
12
14
|
|
|
13
15
|
##
|
|
14
|
-
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
#
|
|
18
|
-
|
|
19
|
-
#
|
|
20
|
-
|
|
21
|
-
#
|
|
22
|
-
|
|
23
|
-
#
|
|
24
|
-
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
-
#
|
|
28
|
-
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
#
|
|
32
|
-
|
|
33
|
-
#
|
|
34
|
-
|
|
35
|
-
#
|
|
36
|
-
|
|
37
|
-
#
|
|
38
|
-
|
|
39
|
-
#
|
|
40
|
-
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
#
|
|
45
|
-
|
|
46
|
-
#
|
|
47
|
-
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
#
|
|
51
|
-
|
|
52
|
-
#
|
|
53
|
-
|
|
54
|
-
#
|
|
55
|
-
|
|
56
|
-
#
|
|
57
|
-
|
|
58
|
-
#
|
|
16
|
+
# @!method always_include_port
|
|
17
|
+
# See {Capybara.configure}
|
|
18
|
+
# @!method run_server
|
|
19
|
+
# See {Capybara.configure}
|
|
20
|
+
# @!method default_selector
|
|
21
|
+
# See {Capybara.configure}
|
|
22
|
+
# @!method default_max_wait_time
|
|
23
|
+
# See {Capybara.configure}
|
|
24
|
+
# @!method default_retry_interval
|
|
25
|
+
# See {Capybara.configure}
|
|
26
|
+
# @!method ignore_hidden_elements
|
|
27
|
+
# See {Capybara.configure}
|
|
28
|
+
# @!method automatic_reload
|
|
29
|
+
# See {Capybara.configure}
|
|
30
|
+
# @!method match
|
|
31
|
+
# See {Capybara.configure}
|
|
32
|
+
# @!method exact
|
|
33
|
+
# See {Capybara.configure}
|
|
34
|
+
# @!method raise_server_errors
|
|
35
|
+
# See {Capybara.configure}
|
|
36
|
+
# @!method visible_text_only
|
|
37
|
+
# See {Capybara.configure}
|
|
38
|
+
# @!method automatic_label_click
|
|
39
|
+
# See {Capybara.configure}
|
|
40
|
+
# @!method enable_aria_label
|
|
41
|
+
# See {Capybara.configure}
|
|
42
|
+
# @!method enable_aria_role
|
|
43
|
+
# See {Capybara.configure}
|
|
44
|
+
# @!method save_path
|
|
45
|
+
# See {Capybara.configure}
|
|
46
|
+
# @!method asset_host
|
|
47
|
+
# See {Capybara.configure}
|
|
48
|
+
# @!method default_host
|
|
49
|
+
# See {Capybara.configure}
|
|
50
|
+
# @!method app_host
|
|
51
|
+
# See {Capybara.configure}
|
|
52
|
+
# @!method server_host
|
|
53
|
+
# See {Capybara.configure}
|
|
54
|
+
# @!method server_port
|
|
55
|
+
# See {Capybara.configure}
|
|
56
|
+
# @!method server_errors
|
|
57
|
+
# See {Capybara.configure}
|
|
58
|
+
# @!method default_set_options
|
|
59
|
+
# See {Capybara.configure}
|
|
60
|
+
# @!method disable_animation
|
|
61
|
+
# See {Capybara.configure}
|
|
62
|
+
# @!method test_id
|
|
63
|
+
# See {Capybara.configure}
|
|
64
|
+
# @!method default_normalize_ws
|
|
65
|
+
# See {Capybara.configure}
|
|
66
|
+
# @!method w3c_click_offset
|
|
67
|
+
# See {Capybara.configure}
|
|
59
68
|
|
|
60
69
|
remove_method :server_host
|
|
61
70
|
|
|
@@ -74,28 +83,33 @@ module Capybara
|
|
|
74
83
|
|
|
75
84
|
remove_method :app_host=
|
|
76
85
|
def app_host=(url)
|
|
77
|
-
|
|
86
|
+
unless url.nil? || url.match?(URI::DEFAULT_PARSER.make_regexp)
|
|
87
|
+
raise ArgumentError, "Capybara.app_host should be set to a url (http://www.example.com). Attempted to set #{url.inspect}."
|
|
88
|
+
end
|
|
89
|
+
|
|
78
90
|
@app_host = url
|
|
79
91
|
end
|
|
80
92
|
|
|
81
93
|
remove_method :default_host=
|
|
82
94
|
def default_host=(url)
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
95
|
+
unless url.nil? || url.match?(URI::DEFAULT_PARSER.make_regexp)
|
|
96
|
+
raise ArgumentError, "Capybara.default_host should be set to a url (http://www.example.com). Attempted to set #{url.inspect}."
|
|
97
|
+
end
|
|
86
98
|
|
|
87
|
-
|
|
88
|
-
def save_and_open_page_path=(path)
|
|
89
|
-
warn "DEPRECATED: #save_and_open_page_path is deprecated, please use #save_path instead. \n"\
|
|
90
|
-
"Note: Behavior is slightly different with relative paths - see documentation" unless path.nil?
|
|
91
|
-
@save_and_open_page_path = path
|
|
99
|
+
@default_host = url
|
|
92
100
|
end
|
|
93
101
|
|
|
94
|
-
remove_method :
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
102
|
+
remove_method :test_id=
|
|
103
|
+
##
|
|
104
|
+
#
|
|
105
|
+
# Set an attribute to be optionally matched against the locator for builtin selector types.
|
|
106
|
+
# This attribute will be checked by builtin selector types whenever id would normally be checked.
|
|
107
|
+
# If `nil` then it will be ignored.
|
|
108
|
+
#
|
|
109
|
+
# @param [String, Symbol, nil] id Name of the attribute to use as the test id
|
|
110
|
+
#
|
|
111
|
+
def test_id=(id)
|
|
112
|
+
@test_id = id&.to_sym
|
|
99
113
|
end
|
|
100
114
|
|
|
101
115
|
def initialize_copy(other)
|
|
@@ -105,10 +119,10 @@ module Capybara
|
|
|
105
119
|
end
|
|
106
120
|
|
|
107
121
|
class ReadOnlySessionConfig < SimpleDelegator
|
|
108
|
-
SessionConfig::OPTIONS.each do |
|
|
109
|
-
define_method "#{
|
|
110
|
-
raise
|
|
122
|
+
SessionConfig::OPTIONS.each do |option|
|
|
123
|
+
define_method "#{option}=" do |_|
|
|
124
|
+
raise 'Per session settings are only supported when Capybara.threadsafe == true'
|
|
111
125
|
end
|
|
112
126
|
end
|
|
113
127
|
end
|
|
114
|
-
end
|
|
128
|
+
end
|
|
@@ -1,25 +1,28 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
module Capybara
|
|
3
4
|
module SessionMatchers
|
|
4
5
|
##
|
|
5
6
|
# Asserts that the page has the given path.
|
|
6
7
|
# By default, if passed a full url this will compare against the full url,
|
|
7
8
|
# if passed a path only the path+query portion will be compared, if passed a regexp
|
|
8
|
-
# the comparison will depend on the :url option
|
|
9
|
+
# the comparison will depend on the :url option (path+query by default)
|
|
9
10
|
#
|
|
10
11
|
# @!macro current_path_query_params
|
|
11
|
-
# @overload $0(string, options
|
|
12
|
+
# @overload $0(string, **options)
|
|
12
13
|
# @param string [String] The string that the current 'path' should equal
|
|
13
|
-
# @overload $0(regexp, options
|
|
14
|
+
# @overload $0(regexp, **options)
|
|
14
15
|
# @param regexp [Regexp] The regexp that the current 'path' should match to
|
|
15
|
-
# @option options [Boolean] :url (true if `string`
|
|
16
|
+
# @option options [Boolean] :url (true if `string` is a full url, otherwise false) Whether the comparison should be done against the full current url or just the path
|
|
16
17
|
# @option options [Boolean] :ignore_query (false) Whether the query portion of the current url/path should be ignored
|
|
17
18
|
# @option options [Numeric] :wait (Capybara.default_max_wait_time) Maximum time that Capybara will wait for the current url/path to eq/match given string/regexp argument
|
|
18
19
|
# @raise [Capybara::ExpectationNotMet] if the assertion hasn't succeeded during wait time
|
|
19
20
|
# @return [true]
|
|
20
21
|
#
|
|
21
|
-
def assert_current_path(path, options
|
|
22
|
-
_verify_current_path(path,options)
|
|
22
|
+
def assert_current_path(path, **options, &optional_filter_block)
|
|
23
|
+
_verify_current_path(path, optional_filter_block, **options) do |query|
|
|
24
|
+
raise Capybara::ExpectationNotMet, query.failure_message unless query.resolves_for?(self)
|
|
25
|
+
end
|
|
23
26
|
end
|
|
24
27
|
|
|
25
28
|
##
|
|
@@ -32,8 +35,10 @@ module Capybara
|
|
|
32
35
|
# @raise [Capybara::ExpectationNotMet] if the assertion hasn't succeeded during wait time
|
|
33
36
|
# @return [true]
|
|
34
37
|
#
|
|
35
|
-
def assert_no_current_path(path, options
|
|
36
|
-
_verify_current_path(path,options)
|
|
38
|
+
def assert_no_current_path(path, **options, &optional_filter_block)
|
|
39
|
+
_verify_current_path(path, optional_filter_block, **options) do |query|
|
|
40
|
+
raise Capybara::ExpectationNotMet, query.negative_failure_message if query.resolves_for?(self)
|
|
41
|
+
end
|
|
37
42
|
end
|
|
38
43
|
|
|
39
44
|
##
|
|
@@ -45,10 +50,8 @@ module Capybara
|
|
|
45
50
|
# @macro current_path_query_params
|
|
46
51
|
# @return [Boolean]
|
|
47
52
|
#
|
|
48
|
-
def has_current_path?(path, options
|
|
49
|
-
assert_current_path(path, options)
|
|
50
|
-
rescue Capybara::ExpectationNotMet
|
|
51
|
-
return false
|
|
53
|
+
def has_current_path?(path, **options, &optional_filter_block)
|
|
54
|
+
make_predicate(options) { assert_current_path(path, **options, &optional_filter_block) }
|
|
52
55
|
end
|
|
53
56
|
|
|
54
57
|
##
|
|
@@ -60,20 +63,25 @@ module Capybara
|
|
|
60
63
|
# @macro current_path_query_params
|
|
61
64
|
# @return [Boolean]
|
|
62
65
|
#
|
|
63
|
-
def has_no_current_path?(path, options
|
|
64
|
-
assert_no_current_path(path, options)
|
|
65
|
-
rescue Capybara::ExpectationNotMet
|
|
66
|
-
return false
|
|
66
|
+
def has_no_current_path?(path, **options, &optional_filter_block)
|
|
67
|
+
make_predicate(options) { assert_no_current_path(path, **options, &optional_filter_block) }
|
|
67
68
|
end
|
|
68
69
|
|
|
69
|
-
|
|
70
|
+
private
|
|
70
71
|
|
|
71
|
-
def _verify_current_path(path, options)
|
|
72
|
-
query = Capybara::Queries::CurrentPathQuery.new(path, options)
|
|
72
|
+
def _verify_current_path(path, filter_block, **options)
|
|
73
|
+
query = Capybara::Queries::CurrentPathQuery.new(path, **options, &filter_block)
|
|
73
74
|
document.synchronize(query.wait) do
|
|
74
75
|
yield(query)
|
|
75
76
|
end
|
|
76
|
-
|
|
77
|
+
true
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def make_predicate(options)
|
|
81
|
+
options[:wait] = 0 unless options.key?(:wait) || config.predicates_wait
|
|
82
|
+
yield
|
|
83
|
+
rescue Capybara::ExpectationNotMet
|
|
84
|
+
false
|
|
77
85
|
end
|
|
78
86
|
end
|
|
79
87
|
end
|