capybara 3.32.2
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 +7 -0
- data/.yardopts +1 -0
- data/History.md +1813 -0
- data/License.txt +22 -0
- data/README.md +1099 -0
- data/lib/capybara.rb +511 -0
- data/lib/capybara/config.rb +94 -0
- data/lib/capybara/cucumber.rb +27 -0
- data/lib/capybara/driver/base.rb +170 -0
- data/lib/capybara/driver/node.rb +139 -0
- data/lib/capybara/dsl.rb +65 -0
- data/lib/capybara/helpers.rb +108 -0
- data/lib/capybara/minitest.rb +386 -0
- data/lib/capybara/minitest/spec.rb +264 -0
- data/lib/capybara/node/actions.rb +420 -0
- data/lib/capybara/node/base.rb +143 -0
- data/lib/capybara/node/document.rb +48 -0
- data/lib/capybara/node/document_matchers.rb +67 -0
- data/lib/capybara/node/element.rb +606 -0
- data/lib/capybara/node/finders.rb +325 -0
- data/lib/capybara/node/matchers.rb +883 -0
- data/lib/capybara/node/simple.rb +208 -0
- data/lib/capybara/queries/ancestor_query.rb +27 -0
- data/lib/capybara/queries/base_query.rb +106 -0
- data/lib/capybara/queries/current_path_query.rb +51 -0
- data/lib/capybara/queries/match_query.rb +26 -0
- data/lib/capybara/queries/selector_query.rb +710 -0
- data/lib/capybara/queries/sibling_query.rb +26 -0
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +110 -0
- data/lib/capybara/queries/title_query.rb +39 -0
- data/lib/capybara/rack_test/browser.rb +140 -0
- data/lib/capybara/rack_test/css_handlers.rb +13 -0
- data/lib/capybara/rack_test/driver.rb +109 -0
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +127 -0
- data/lib/capybara/rack_test/node.rb +325 -0
- data/lib/capybara/rails.rb +16 -0
- data/lib/capybara/registrations/drivers.rb +36 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
- data/lib/capybara/registrations/servers.rb +44 -0
- data/lib/capybara/result.rb +190 -0
- data/lib/capybara/rspec.rb +29 -0
- data/lib/capybara/rspec/features.rb +23 -0
- data/lib/capybara/rspec/matcher_proxies.rb +82 -0
- data/lib/capybara/rspec/matchers.rb +201 -0
- data/lib/capybara/rspec/matchers/base.rb +111 -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 +77 -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 +38 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/selector.rb +233 -0
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
- data/lib/capybara/selector/css.rb +102 -0
- data/lib/capybara/selector/definition.rb +276 -0
- data/lib/capybara/selector/definition/button.rb +51 -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 +27 -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 +46 -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/filter.rb +5 -0
- data/lib/capybara/selector/filter_set.rb +124 -0
- data/lib/capybara/selector/filters/base.rb +77 -0
- data/lib/capybara/selector/filters/expression_filter.rb +22 -0
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +31 -0
- data/lib/capybara/selector/regexp_disassembler.rb +214 -0
- data/lib/capybara/selector/selector.rb +147 -0
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- 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 +496 -0
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -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 +228 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +78 -0
- data/lib/capybara/selenium/logger_suppressor.rb +34 -0
- data/lib/capybara/selenium/node.rb +610 -0
- data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +131 -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/action_pauser.rb +26 -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 +47 -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.rb +126 -0
- data/lib/capybara/server/animation_disabler.rb +58 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +69 -0
- data/lib/capybara/session.rb +942 -0
- data/lib/capybara/session/config.rb +124 -0
- data/lib/capybara/session/matchers.rb +87 -0
- data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
- data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- data/lib/capybara/spec/fixtures/test_file.txt +1 -0
- data/lib/capybara/spec/public/jquery-ui.js +13 -0
- data/lib/capybara/spec/public/jquery.js +5 -0
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +268 -0
- data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
- data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
- data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
- data/lib/capybara/spec/session/all_spec.rb +278 -0
- data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
- 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_spec.rb +93 -0
- data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
- data/lib/capybara/spec/session/body_spec.rb +23 -0
- data/lib/capybara/spec/session/check_spec.rb +235 -0
- data/lib/capybara/spec/session/choose_spec.rb +121 -0
- data/lib/capybara/spec/session/click_button_spec.rb +506 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
- data/lib/capybara/spec/session/click_link_spec.rb +229 -0
- data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
- data/lib/capybara/spec/session/current_url_spec.rb +115 -0
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
- data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
- data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
- data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
- data/lib/capybara/spec/session/find_button_spec.rb +74 -0
- data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
- data/lib/capybara/spec/session/find_field_spec.rb +113 -0
- data/lib/capybara/spec/session/find_link_spec.rb +70 -0
- data/lib/capybara/spec/session/find_spec.rb +531 -0
- data/lib/capybara/spec/session/first_spec.rb +156 -0
- 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 +116 -0
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
- data/lib/capybara/spec/session/go_back_spec.rb +12 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
- data/lib/capybara/spec/session/has_button_spec.rb +69 -0
- data/lib/capybara/spec/session/has_css_spec.rb +374 -0
- data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
- data/lib/capybara/spec/session/has_field_spec.rb +349 -0
- data/lib/capybara/spec/session/has_link_spec.rb +39 -0
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
- data/lib/capybara/spec/session/has_select_spec.rb +310 -0
- data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +198 -0
- data/lib/capybara/spec/session/has_text_spec.rb +394 -0
- data/lib/capybara/spec/session/has_title_spec.rb +71 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
- data/lib/capybara/spec/session/headers_spec.rb +8 -0
- data/lib/capybara/spec/session/html_spec.rb +47 -0
- data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +1292 -0
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +33 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
- data/lib/capybara/spec/session/response_code_spec.rb +8 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
- data/lib/capybara/spec/session/save_page_spec.rb +110 -0
- data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
- data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
- data/lib/capybara/spec/session/scroll_spec.rb +117 -0
- data/lib/capybara/spec/session/select_spec.rb +229 -0
- data/lib/capybara/spec/session/selectors_spec.rb +98 -0
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/session/text_spec.rb +74 -0
- data/lib/capybara/spec/session/title_spec.rb +29 -0
- data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
- data/lib/capybara/spec/session/unselect_spec.rb +116 -0
- data/lib/capybara/spec/session/visit_spec.rb +204 -0
- data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
- data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
- data/lib/capybara/spec/session/window/window_spec.rb +203 -0
- data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
- data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
- data/lib/capybara/spec/session/within_spec.rb +199 -0
- data/lib/capybara/spec/spec_helper.rb +134 -0
- data/lib/capybara/spec/test_app.rb +226 -0
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/buttons.erb +5 -0
- data/lib/capybara/spec/views/fieldsets.erb +30 -0
- data/lib/capybara/spec/views/form.erb +685 -0
- data/lib/capybara/spec/views/frame_child.erb +18 -0
- data/lib/capybara/spec/views/frame_one.erb +10 -0
- data/lib/capybara/spec/views/frame_parent.erb +9 -0
- data/lib/capybara/spec/views/frame_two.erb +9 -0
- data/lib/capybara/spec/views/header_links.erb +8 -0
- data/lib/capybara/spec/views/host_links.erb +13 -0
- data/lib/capybara/spec/views/initial_alert.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +32 -0
- data/lib/capybara/spec/views/path.erb +13 -0
- data/lib/capybara/spec/views/popup_one.erb +9 -0
- data/lib/capybara/spec/views/popup_two.erb +9 -0
- data/lib/capybara/spec/views/postback.erb +14 -0
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +20 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +130 -0
- data/lib/capybara/spec/views/with_animation.erb +74 -0
- data/lib/capybara/spec/views/with_base_tag.erb +11 -0
- data/lib/capybara/spec/views/with_count.erb +8 -0
- data/lib/capybara/spec/views/with_dragula.erb +22 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +24 -0
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +208 -0
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_html_entities.erb +2 -0
- data/lib/capybara/spec/views/with_js.erb +160 -0
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +20 -0
- data/lib/capybara/spec/views/with_scope.erb +42 -0
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_simple_html.erb +2 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_title.erb +5 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
- data/lib/capybara/spec/views/with_windows.erb +54 -0
- data/lib/capybara/spec/views/within_frames.erb +15 -0
- data/lib/capybara/version.rb +5 -0
- data/lib/capybara/window.rb +146 -0
- data/spec/basic_node_spec.rb +154 -0
- data/spec/capybara_spec.rb +112 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +276 -0
- data/spec/filter_set_spec.rb +46 -0
- data/spec/fixtures/capybara.csv +1 -0
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
- data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
- data/spec/minitest_spec.rb +163 -0
- data/spec/minitest_spec_spec.rb +162 -0
- data/spec/per_session_config_spec.rb +68 -0
- data/spec/rack_test_spec.rb +268 -0
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +196 -0
- data/spec/rspec/features_spec.rb +99 -0
- data/spec/rspec/scenarios_spec.rb +19 -0
- data/spec/rspec/shared_spec_matchers.rb +947 -0
- data/spec/rspec/views_spec.rb +14 -0
- data/spec/rspec_matchers_spec.rb +62 -0
- data/spec/rspec_spec.rb +145 -0
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +513 -0
- data/spec/selenium_spec_chrome.rb +188 -0
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +47 -0
- data/spec/selenium_spec_firefox.rb +208 -0
- data/spec/selenium_spec_firefox_remote.rb +80 -0
- data/spec/selenium_spec_ie.rb +150 -0
- data/spec/selenium_spec_safari.rb +148 -0
- data/spec/server_spec.rb +292 -0
- data/spec/session_spec.rb +91 -0
- data/spec/shared_selenium_node.rb +83 -0
- data/spec/shared_selenium_session.rb +476 -0
- data/spec/spec_helper.rb +100 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +753 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'capybara/dsl'
|
|
4
|
+
|
|
5
|
+
Capybara.app = Rack::Builder.new do
|
|
6
|
+
map '/' do
|
|
7
|
+
run Rails.application
|
|
8
|
+
end
|
|
9
|
+
end.to_app
|
|
10
|
+
|
|
11
|
+
Capybara.save_path = Rails.root.join('tmp/capybara')
|
|
12
|
+
|
|
13
|
+
# Override default rack_test driver to respect data-method attributes.
|
|
14
|
+
Capybara.register_driver :rack_test do |app|
|
|
15
|
+
Capybara::RackTest::Driver.new(app, respect_data_method: true)
|
|
16
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara.register_driver :rack_test do |app|
|
|
4
|
+
Capybara::RackTest::Driver.new(app)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Capybara.register_driver :selenium do |app|
|
|
8
|
+
Capybara::Selenium::Driver.new(app)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
Capybara.register_driver :selenium_headless do |app|
|
|
12
|
+
Capybara::Selenium::Driver.load_selenium
|
|
13
|
+
browser_options = ::Selenium::WebDriver::Firefox::Options.new
|
|
14
|
+
browser_options.args << '-headless'
|
|
15
|
+
Capybara::Selenium::Driver.new(app, browser: :firefox, options: browser_options)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
Capybara.register_driver :selenium_chrome do |app|
|
|
19
|
+
Capybara::Selenium::Driver.load_selenium
|
|
20
|
+
browser_options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
|
|
21
|
+
# Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
|
|
22
|
+
opts.args << '--disable-site-isolation-trials'
|
|
23
|
+
end
|
|
24
|
+
Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
Capybara.register_driver :selenium_chrome_headless do |app|
|
|
28
|
+
Capybara::Selenium::Driver.load_selenium
|
|
29
|
+
browser_options = ::Selenium::WebDriver::Chrome::Options.new.tap do |opts|
|
|
30
|
+
opts.args << '--headless'
|
|
31
|
+
opts.args << '--disable-gpu' if Gem.win_platform?
|
|
32
|
+
# Workaround https://bugs.chromium.org/p/chromedriver/issues/detail?id=2650&q=load&sort=-id&colspec=ID%20Status%20Pri%20Owner%20Summary
|
|
33
|
+
opts.args << '--disable-site-isolation-trials'
|
|
34
|
+
end
|
|
35
|
+
Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
|
|
36
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Puma
|
|
4
|
+
module MiniSSL
|
|
5
|
+
class Socket
|
|
6
|
+
def read_nonblock(size, *_)
|
|
7
|
+
loop do
|
|
8
|
+
output = engine_read_all
|
|
9
|
+
return output if output
|
|
10
|
+
|
|
11
|
+
data = @socket.read_nonblock(size, exception: false)
|
|
12
|
+
raise IO::EAGAINWaitReadable if %i[wait_readable wait_writable].include? data
|
|
13
|
+
return nil if data.nil?
|
|
14
|
+
|
|
15
|
+
@engine.inject(data)
|
|
16
|
+
output = engine_read_all
|
|
17
|
+
|
|
18
|
+
return output if output
|
|
19
|
+
|
|
20
|
+
while (neg_data = @engine.extract)
|
|
21
|
+
@socket.write neg_data
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara.register_server :default do |app, port, _host|
|
|
4
|
+
Capybara.run_default_server(app, port)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
Capybara.register_server :webrick do |app, port, host, **options|
|
|
8
|
+
require 'rack/handler/webrick'
|
|
9
|
+
options = { Host: host, Port: port, AccessLog: [], Logger: WEBrick::Log.new(nil, 0) }.merge(options)
|
|
10
|
+
Rack::Handler::WEBrick.run(app, **options)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
Capybara.register_server :puma do |app, port, host, **options|
|
|
14
|
+
begin
|
|
15
|
+
require 'rack/handler/puma'
|
|
16
|
+
rescue LoadError
|
|
17
|
+
raise LoadError, 'Capybara is unable to load `puma` for its server, please add `puma` to your project or specify a different server via something like `Capybara.server = :webrick`.'
|
|
18
|
+
else
|
|
19
|
+
unless Rack::Handler::Puma.respond_to?(:config)
|
|
20
|
+
raise LoadError, 'Capybara requires `puma` version 3.8.0 or higher, please upgrade `puma` or register and specify your own server block'
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# If we just run the Puma Rack handler it installs signal handlers which prevent us from being able to interrupt tests.
|
|
25
|
+
# Therefore construct and run the Server instance ourselves.
|
|
26
|
+
# Rack::Handler::Puma.run(app, { Host: host, Port: port, Threads: "0:4", workers: 0, daemon: false }.merge(options))
|
|
27
|
+
default_options = { Host: host, Port: port, Threads: '0:4', workers: 0, daemon: false }
|
|
28
|
+
options = default_options.merge(options)
|
|
29
|
+
|
|
30
|
+
conf = Rack::Handler::Puma.config(app, options)
|
|
31
|
+
events = conf.options[:Silent] ? ::Puma::Events.strings : ::Puma::Events.stdio
|
|
32
|
+
|
|
33
|
+
puma_ver = Gem::Version.new(Puma::Const::PUMA_VERSION)
|
|
34
|
+
require_relative 'patches/puma_ssl' if (Gem::Version.new('4.0.0')...Gem::Version.new('4.1.0')).cover? puma_ver
|
|
35
|
+
|
|
36
|
+
events.log 'Capybara starting Puma...'
|
|
37
|
+
events.log "* Version #{Puma::Const::PUMA_VERSION} , codename: #{Puma::Const::CODE_NAME}"
|
|
38
|
+
events.log "* Min threads: #{conf.options[:min_threads]}, max threads: #{conf.options[:max_threads]}"
|
|
39
|
+
|
|
40
|
+
Puma::Server.new(conf.app, events, conf.options).tap do |s|
|
|
41
|
+
s.binder.parse conf.options[:binds], s.events
|
|
42
|
+
s.min_threads, s.max_threads = conf.options[:min_threads], conf.options[:max_threads]
|
|
43
|
+
end.run.join
|
|
44
|
+
end
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'forwardable'
|
|
4
|
+
|
|
5
|
+
module Capybara
|
|
6
|
+
##
|
|
7
|
+
# A {Capybara::Result} represents a collection of {Capybara::Node::Element} on the page. It is possible to interact with this
|
|
8
|
+
# collection similar to an Array because it implements Enumerable and offers the following Array methods through delegation:
|
|
9
|
+
#
|
|
10
|
+
# * \[\]
|
|
11
|
+
# * each()
|
|
12
|
+
# * at()
|
|
13
|
+
# * size()
|
|
14
|
+
# * count()
|
|
15
|
+
# * length()
|
|
16
|
+
# * first()
|
|
17
|
+
# * last()
|
|
18
|
+
# * empty?()
|
|
19
|
+
# * values_at()
|
|
20
|
+
# * sample()
|
|
21
|
+
#
|
|
22
|
+
# @see Capybara::Node::Element
|
|
23
|
+
#
|
|
24
|
+
class Result
|
|
25
|
+
include Enumerable
|
|
26
|
+
extend Forwardable
|
|
27
|
+
|
|
28
|
+
def initialize(elements, query)
|
|
29
|
+
@elements = elements
|
|
30
|
+
@result_cache = []
|
|
31
|
+
@filter_errors = []
|
|
32
|
+
@results_enum = lazy_select_elements { |node| query.matches_filters?(node, @filter_errors) }
|
|
33
|
+
@query = query
|
|
34
|
+
@allow_reload = false
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def_delegators :full_results, :size, :length, :last, :values_at, :inspect, :sample
|
|
38
|
+
|
|
39
|
+
alias index find_index
|
|
40
|
+
|
|
41
|
+
def each(&block)
|
|
42
|
+
return enum_for(:each) unless block_given?
|
|
43
|
+
|
|
44
|
+
@result_cache.each(&block)
|
|
45
|
+
loop do
|
|
46
|
+
next_result = @results_enum.next
|
|
47
|
+
add_to_cache(next_result)
|
|
48
|
+
yield next_result
|
|
49
|
+
end
|
|
50
|
+
self
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def [](*args)
|
|
54
|
+
idx, length = args
|
|
55
|
+
max_idx = case idx
|
|
56
|
+
when Integer
|
|
57
|
+
if !idx.negative?
|
|
58
|
+
length.nil? ? idx : idx + length - 1
|
|
59
|
+
else
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
when Range
|
|
63
|
+
# idx.max is broken with beginless ranges
|
|
64
|
+
# idx.end && idx.max # endless range will have end == nil
|
|
65
|
+
max = idx.end
|
|
66
|
+
max = nil if max&.negative?
|
|
67
|
+
max -= 1 if max && idx.exclude_end?
|
|
68
|
+
max
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
if max_idx.nil?
|
|
72
|
+
full_results[*args]
|
|
73
|
+
else
|
|
74
|
+
load_up_to(max_idx + 1)
|
|
75
|
+
@result_cache[*args]
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
alias :at :[]
|
|
79
|
+
|
|
80
|
+
def empty?
|
|
81
|
+
!any?
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def compare_count
|
|
85
|
+
return 0 unless @query
|
|
86
|
+
|
|
87
|
+
count, min, max, between = @query.options.values_at(:count, :minimum, :maximum, :between)
|
|
88
|
+
|
|
89
|
+
# Only check filters for as many elements as necessary to determine result
|
|
90
|
+
if count && (count = Integer(count))
|
|
91
|
+
return load_up_to(count + 1) <=> count
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
if min && (min = Integer(min))
|
|
95
|
+
return -1 if load_up_to(min) < min
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
if max && (max = Integer(max))
|
|
99
|
+
return 1 if load_up_to(max + 1) > max
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
if between
|
|
103
|
+
min, max = (between.begin && between.min) || 1, between.end
|
|
104
|
+
max -= 1 if max && between.exclude_end?
|
|
105
|
+
|
|
106
|
+
size = load_up_to(max ? max + 1 : min)
|
|
107
|
+
return size <=> min unless between.include?(size)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
0
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def matches_count?
|
|
114
|
+
compare_count.zero?
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def failure_message
|
|
118
|
+
message = @query.failure_message
|
|
119
|
+
if count.zero?
|
|
120
|
+
message << ' but there were no matches'
|
|
121
|
+
else
|
|
122
|
+
message << ", found #{count} #{Capybara::Helpers.declension('match', 'matches', count)}: " \
|
|
123
|
+
<< full_results.map(&:text).map(&:inspect).join(', ')
|
|
124
|
+
end
|
|
125
|
+
unless rest.empty?
|
|
126
|
+
elements = rest.map { |el| el.text rescue '<<ERROR>>' }.map(&:inspect).join(', ') # rubocop:disable Style/RescueModifier
|
|
127
|
+
message << '. Also found ' << elements << ', which matched the selector but not all filters. '
|
|
128
|
+
message << @filter_errors.join('. ') if (rest.size == 1) && count.zero?
|
|
129
|
+
end
|
|
130
|
+
message
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def negative_failure_message
|
|
134
|
+
failure_message.sub(/(to find)/, 'not \1')
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def unfiltered_size
|
|
138
|
+
@elements.length
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
##
|
|
142
|
+
# @api private
|
|
143
|
+
#
|
|
144
|
+
def allow_reload!
|
|
145
|
+
@allow_reload = true
|
|
146
|
+
self
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
private
|
|
150
|
+
|
|
151
|
+
def add_to_cache(elem)
|
|
152
|
+
elem.allow_reload!(@result_cache.size) if @allow_reload
|
|
153
|
+
@result_cache << elem
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def load_up_to(num)
|
|
157
|
+
loop do
|
|
158
|
+
break if @result_cache.size >= num
|
|
159
|
+
|
|
160
|
+
add_to_cache(@results_enum.next)
|
|
161
|
+
end
|
|
162
|
+
@result_cache.size
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def full_results
|
|
166
|
+
loop { @result_cache << @results_enum.next }
|
|
167
|
+
@result_cache
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def rest
|
|
171
|
+
@rest ||= @elements - full_results
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
if RUBY_PLATFORM == 'java'
|
|
175
|
+
# JRuby < 9.2.8.0 has an issue with lazy enumerators which
|
|
176
|
+
# causes a concurrency issue with network requests here
|
|
177
|
+
# https://github.com/jruby/jruby/issues/4212
|
|
178
|
+
# while JRuby >= 9.2.8.0 leaks threads when using lazy enumerators
|
|
179
|
+
# https://github.com/teamcapybara/capybara/issues/2349
|
|
180
|
+
# so disable the use and JRuby users will need to pay a performance penalty
|
|
181
|
+
def lazy_select_elements(&block)
|
|
182
|
+
@elements.select(&block).to_enum # non-lazy evaluation
|
|
183
|
+
end
|
|
184
|
+
else
|
|
185
|
+
def lazy_select_elements(&block)
|
|
186
|
+
@elements.lazy.select(&block)
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rspec/core'
|
|
4
|
+
require 'capybara/dsl'
|
|
5
|
+
require 'capybara/rspec/matchers'
|
|
6
|
+
require 'capybara/rspec/features'
|
|
7
|
+
require 'capybara/rspec/matcher_proxies'
|
|
8
|
+
|
|
9
|
+
RSpec.configure do |config|
|
|
10
|
+
config.include Capybara::DSL, type: :feature
|
|
11
|
+
config.include Capybara::RSpecMatchers, type: :feature
|
|
12
|
+
config.include Capybara::RSpecMatchers, type: :view
|
|
13
|
+
|
|
14
|
+
# The before and after blocks must run instantaneously, because Capybara
|
|
15
|
+
# might not actually be used in all examples where it's included.
|
|
16
|
+
config.after do
|
|
17
|
+
if self.class.include?(Capybara::DSL)
|
|
18
|
+
Capybara.reset_sessions!
|
|
19
|
+
Capybara.use_default_driver
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
config.before do |example|
|
|
24
|
+
if self.class.include?(Capybara::DSL)
|
|
25
|
+
Capybara.current_driver = Capybara.javascript_driver if example.metadata[:js]
|
|
26
|
+
Capybara.current_driver = example.metadata[:driver] if example.metadata[:driver]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
RSpec.shared_context 'Capybara Features', capybara_feature: true do
|
|
4
|
+
instance_eval do
|
|
5
|
+
alias background before
|
|
6
|
+
alias given let
|
|
7
|
+
alias given! let!
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# ensure shared_context is included if default shared_context_metadata_behavior is changed
|
|
12
|
+
RSpec.configure do |config|
|
|
13
|
+
config.include_context 'Capybara Features', capybara_feature: true if config.respond_to?(:include_context)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
RSpec.configure do |config|
|
|
17
|
+
config.alias_example_group_to :feature, :capybara_feature, type: :feature
|
|
18
|
+
config.alias_example_group_to :xfeature, :capybara_feature, type: :feature, skip: 'Temporarily disabled with xfeature'
|
|
19
|
+
config.alias_example_group_to :ffeature, :capybara_feature, :focus, type: :feature
|
|
20
|
+
config.alias_example_to :scenario
|
|
21
|
+
config.alias_example_to :xscenario, skip: 'Temporarily disabled with xscenario'
|
|
22
|
+
config.alias_example_to :fscenario, :focus
|
|
23
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Capybara
|
|
4
|
+
module RSpecMatcherProxies
|
|
5
|
+
def all(*args, **kwargs, &block)
|
|
6
|
+
if defined?(::RSpec::Matchers::BuiltIn::All) && args.first.respond_to?(:matches?)
|
|
7
|
+
::RSpec::Matchers::BuiltIn::All.new(*args)
|
|
8
|
+
else
|
|
9
|
+
find_all(*args, **kwargs, &block)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def within(*args, **kwargs, &block)
|
|
14
|
+
if block_given?
|
|
15
|
+
within_element(*args, **kwargs, &block)
|
|
16
|
+
else
|
|
17
|
+
be_within(*args)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
if RUBY_ENGINE == 'jruby'
|
|
24
|
+
# :nocov:
|
|
25
|
+
module Capybara::DSL
|
|
26
|
+
class <<self
|
|
27
|
+
remove_method :included
|
|
28
|
+
|
|
29
|
+
def included(base)
|
|
30
|
+
warn 'including Capybara::DSL in the global scope is not recommended!' if base == Object
|
|
31
|
+
if defined?(::RSpec::Matchers) && base.include?(::RSpec::Matchers)
|
|
32
|
+
base.send(:include, ::Capybara::RSpecMatcherProxies)
|
|
33
|
+
end
|
|
34
|
+
super
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
if defined?(::RSpec::Matchers)
|
|
40
|
+
module ::RSpec::Matchers
|
|
41
|
+
def self.included(base)
|
|
42
|
+
base.send(:include, ::Capybara::RSpecMatcherProxies) if base.include?(::Capybara::DSL)
|
|
43
|
+
super
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
# :nocov:
|
|
48
|
+
else
|
|
49
|
+
module Capybara::DSLRSpecProxyInstaller
|
|
50
|
+
module ClassMethods
|
|
51
|
+
def included(base)
|
|
52
|
+
base.include(::Capybara::RSpecMatcherProxies) if defined?(::RSpec::Matchers) && base.include?(::RSpec::Matchers)
|
|
53
|
+
super
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def self.prepended(base)
|
|
58
|
+
class <<base
|
|
59
|
+
prepend ClassMethods
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
module Capybara::RSpecMatcherProxyInstaller
|
|
65
|
+
module ClassMethods
|
|
66
|
+
def included(base)
|
|
67
|
+
base.include(::Capybara::RSpecMatcherProxies) if base.include?(::Capybara::DSL)
|
|
68
|
+
super
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def self.prepended(base)
|
|
73
|
+
class <<base
|
|
74
|
+
prepend ClassMethods
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
Capybara::DSL.prepend ::Capybara::DSLRSpecProxyInstaller
|
|
80
|
+
|
|
81
|
+
::RSpec::Matchers.prepend ::Capybara::RSpecMatcherProxyInstaller if defined?(::RSpec::Matchers)
|
|
82
|
+
end
|