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,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_js')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should accept the alert' do
|
|
9
|
+
@session.accept_alert do
|
|
10
|
+
@session.click_link('Open alert')
|
|
11
|
+
end
|
|
12
|
+
expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'should accept the alert if the text matches' do
|
|
16
|
+
@session.accept_alert 'Alert opened' do
|
|
17
|
+
@session.click_link('Open alert')
|
|
18
|
+
end
|
|
19
|
+
expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'should accept the alert if text contains "special" Regex characters' do
|
|
23
|
+
@session.accept_alert 'opened [*Yay?*]' do
|
|
24
|
+
@session.click_link('Open alert')
|
|
25
|
+
end
|
|
26
|
+
expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'should accept the alert if the text matches a regexp' do
|
|
30
|
+
@session.accept_alert(/op.{2}ed/) do
|
|
31
|
+
@session.click_link('Open alert')
|
|
32
|
+
end
|
|
33
|
+
expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'should not accept the alert if the text doesnt match' do
|
|
37
|
+
expect do
|
|
38
|
+
@session.accept_alert 'Incorrect Text' do
|
|
39
|
+
@session.click_link('Open alert')
|
|
40
|
+
end
|
|
41
|
+
end.to raise_error(Capybara::ModalNotFound)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'should return the message presented' do
|
|
45
|
+
message = @session.accept_alert do
|
|
46
|
+
@session.click_link('Open alert')
|
|
47
|
+
end
|
|
48
|
+
expect(message).to eq('Alert opened [*Yay?*]')
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'should handle the alert if the page changes' do
|
|
52
|
+
@session.accept_alert do
|
|
53
|
+
@session.click_link('Alert page change')
|
|
54
|
+
sleep 1 # ensure page change occurs before the accept_alert block exits
|
|
55
|
+
end
|
|
56
|
+
expect(@session).to have_current_path('/with_html')
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context 'with an asynchronous alert' do
|
|
60
|
+
it 'should accept the alert' do
|
|
61
|
+
@session.accept_alert do
|
|
62
|
+
@session.click_link('Open delayed alert')
|
|
63
|
+
end
|
|
64
|
+
expect(@session).to have_xpath("//a[@id='open-delayed-alert' and @opened='true']")
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'should return the message presented' do
|
|
68
|
+
message = @session.accept_alert do
|
|
69
|
+
@session.click_link('Open delayed alert')
|
|
70
|
+
end
|
|
71
|
+
expect(message).to eq('Delayed alert opened')
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it 'should allow to adjust the delay' do
|
|
75
|
+
@session.accept_alert wait: 10 do
|
|
76
|
+
@session.click_link('Open slow alert')
|
|
77
|
+
end
|
|
78
|
+
expect(@session).to have_xpath("//a[@id='open-slow-alert' and @opened='true']")
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#accept_confirm', requires: [:modals] do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_js')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should accept the confirm' do
|
|
9
|
+
@session.accept_confirm do
|
|
10
|
+
@session.click_link('Open confirm')
|
|
11
|
+
end
|
|
12
|
+
expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='true']")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'should return the message presented' do
|
|
16
|
+
message = @session.accept_confirm do
|
|
17
|
+
@session.click_link('Open confirm')
|
|
18
|
+
end
|
|
19
|
+
expect(message).to eq('Confirm opened')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'should work with nested modals' do
|
|
23
|
+
expect do
|
|
24
|
+
@session.dismiss_confirm 'Are you really sure?' do
|
|
25
|
+
@session.accept_confirm 'Are you sure?' do
|
|
26
|
+
@session.click_link('Open check twice')
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end.not_to raise_error
|
|
30
|
+
expect(@session).to have_xpath("//a[@id='open-twice' and @confirmed='false']")
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_js')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should accept the prompt with no message' do
|
|
9
|
+
@session.accept_prompt do
|
|
10
|
+
@session.click_link('Open prompt')
|
|
11
|
+
end
|
|
12
|
+
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='']")
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'should accept the prompt with no message when there is a default' do
|
|
16
|
+
@session.accept_prompt do
|
|
17
|
+
@session.click_link('Open defaulted prompt')
|
|
18
|
+
end
|
|
19
|
+
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='Default value!']")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'should return the message presented' do
|
|
23
|
+
message = @session.accept_prompt do
|
|
24
|
+
@session.click_link('Open prompt')
|
|
25
|
+
end
|
|
26
|
+
expect(message).to eq('Prompt opened')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'should accept the prompt with a response' do
|
|
30
|
+
@session.accept_prompt with: 'the response' do
|
|
31
|
+
@session.click_link('Open prompt')
|
|
32
|
+
end
|
|
33
|
+
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='the response']")
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'should accept the prompt with a response when there is a default' do
|
|
37
|
+
@session.accept_prompt with: 'the response' do
|
|
38
|
+
@session.click_link('Open defaulted prompt')
|
|
39
|
+
end
|
|
40
|
+
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='the response']")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it 'should accept the prompt with a blank response when there is a default' do
|
|
44
|
+
@session.accept_prompt with: '' do
|
|
45
|
+
@session.click_link('Open defaulted prompt')
|
|
46
|
+
end
|
|
47
|
+
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='']")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'should allow special characters in the reponse' do
|
|
51
|
+
@session.accept_prompt with: '\'the\' \b "response"' do
|
|
52
|
+
@session.click_link('Open prompt')
|
|
53
|
+
end
|
|
54
|
+
expect(@session).to have_xpath(%{//a[@id='open-prompt' and @response=concat("'the' ", '\\b "response"')]})
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'should accept the prompt if the message matches' do
|
|
58
|
+
@session.accept_prompt 'Prompt opened', with: 'matched' do
|
|
59
|
+
@session.click_link('Open prompt')
|
|
60
|
+
end
|
|
61
|
+
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='matched']")
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it "should not accept the prompt if the message doesn't match" do
|
|
65
|
+
expect do
|
|
66
|
+
@session.accept_prompt 'Incorrect Text', with: 'not matched' do
|
|
67
|
+
@session.click_link('Open prompt')
|
|
68
|
+
end
|
|
69
|
+
end.to raise_error(Capybara::ModalNotFound)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'should return the message presented' do
|
|
73
|
+
message = @session.accept_prompt with: 'the response' do
|
|
74
|
+
@session.click_link('Open prompt')
|
|
75
|
+
end
|
|
76
|
+
expect(message).to eq('Prompt opened')
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#all' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_html')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should find all elements using the given locator' do
|
|
9
|
+
expect(@session.all('//p').size).to eq(3)
|
|
10
|
+
expect(@session.all('//h1').first.text).to eq('This is a test')
|
|
11
|
+
expect(@session.all("//input[@id='test_field']").first.value).to eq('monkey')
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'should return an empty array when nothing was found' do
|
|
15
|
+
expect(@session.all('//div[@id="nosuchthing"]')).to be_empty
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should wait for matching elements to appear', requires: [:js] do
|
|
19
|
+
Capybara.default_max_wait_time = 2
|
|
20
|
+
@session.visit('/with_js')
|
|
21
|
+
@session.click_link('Click me')
|
|
22
|
+
expect(@session.all(:css, 'a#has-been-clicked')).not_to be_empty
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'should not wait if `minimum: 0` option is specified', requires: [:js] do
|
|
26
|
+
@session.visit('/with_js')
|
|
27
|
+
@session.click_link('Click me')
|
|
28
|
+
expect(@session.all(:css, 'a#has-been-clicked', minimum: 0)).to be_empty
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'should accept an XPath instance', :exact_false do
|
|
32
|
+
@session.visit('/form')
|
|
33
|
+
@xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('Name')
|
|
34
|
+
expect(@xpath).to be_a(::XPath::Union)
|
|
35
|
+
@result = @session.all(@xpath).map(&:value)
|
|
36
|
+
expect(@result).to include('Smith', 'John', 'John Smith')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'should allow reversing the order' do
|
|
40
|
+
@session.visit('/form')
|
|
41
|
+
fields = @session.all(:fillable_field, 'Name', exact: false).to_a
|
|
42
|
+
reverse_fields = @session.all(:fillable_field, 'Name', order: :reverse, exact: false).to_a
|
|
43
|
+
expect(fields).to eq(reverse_fields.reverse)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'should raise an error when given invalid options' do
|
|
47
|
+
expect { @session.all('//p', schmoo: 'foo') }.to raise_error(ArgumentError)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'should not reload by default', requires: [:driver] do
|
|
51
|
+
paras = @session.all(:css, 'p', minimum: 3)
|
|
52
|
+
expect { paras[0].text }.not_to raise_error
|
|
53
|
+
@session.refresh
|
|
54
|
+
expect { paras[0].text }.to raise_error do |err|
|
|
55
|
+
expect(err).to be_an_invalid_element_error(@session)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context 'with allow_reload' do
|
|
60
|
+
it 'should reload if true' do
|
|
61
|
+
paras = @session.all(:css, 'p', allow_reload: true, minimum: 3)
|
|
62
|
+
expect { paras[0].text }.not_to raise_error
|
|
63
|
+
@session.refresh
|
|
64
|
+
sleep 1 # Ensure page has started to reload
|
|
65
|
+
expect(paras[0]).to have_text('Lorem ipsum dolor')
|
|
66
|
+
expect(paras[1]).to have_text('Duis aute irure dolor')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'should not reload if false', requires: [:driver] do
|
|
70
|
+
paras = @session.all(:css, 'p', allow_reload: false, minimum: 3)
|
|
71
|
+
expect { paras[0].text }.not_to raise_error
|
|
72
|
+
@session.refresh
|
|
73
|
+
sleep 1 # Ensure page has started to reload
|
|
74
|
+
expect { paras[0].text }.to raise_error do |err|
|
|
75
|
+
expect(err).to be_an_invalid_element_error(@session)
|
|
76
|
+
end
|
|
77
|
+
expect { paras[2].text }.to raise_error do |err|
|
|
78
|
+
expect(err).to be_an_invalid_element_error(@session)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context 'with css selectors' do
|
|
84
|
+
it 'should find all elements using the given selector' do
|
|
85
|
+
expect(@session.all(:css, 'h1').first.text).to eq('This is a test')
|
|
86
|
+
expect(@session.all(:css, "input[id='test_field']").first.value).to eq('monkey')
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'should find all elements when given a list of selectors' do
|
|
90
|
+
expect(@session.all(:css, 'h1, p').size).to eq(4)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
context 'with xpath selectors' do
|
|
95
|
+
it 'should find the first element using the given locator' do
|
|
96
|
+
expect(@session.all(:xpath, '//h1').first.text).to eq('This is a test')
|
|
97
|
+
expect(@session.all(:xpath, "//input[@id='test_field']").first.value).to eq('monkey')
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'should use alternated regex for :id' do
|
|
101
|
+
expect(@session.all(:xpath, './/h2', id: /h2/).unfiltered_size).to eq 3
|
|
102
|
+
expect(@session.all(:xpath, './/h2', id: /h2(one|two)/).unfiltered_size).to eq 2
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context 'with css as default selector' do
|
|
107
|
+
before { Capybara.default_selector = :css }
|
|
108
|
+
|
|
109
|
+
it 'should find the first element using the given locator' do
|
|
110
|
+
expect(@session.all('h1').first.text).to eq('This is a test')
|
|
111
|
+
expect(@session.all("input[id='test_field']").first.value).to eq('monkey')
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
context 'with visible filter' do
|
|
116
|
+
it 'should only find visible nodes when true' do
|
|
117
|
+
expect(@session.all(:css, 'a.simple', visible: true).size).to eq(1)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it 'should find nodes regardless of whether they are invisible when false' do
|
|
121
|
+
expect(@session.all(:css, 'a.simple', visible: false).size).to eq(2)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it 'should default to Capybara.ignore_hidden_elements' do
|
|
125
|
+
Capybara.ignore_hidden_elements = true
|
|
126
|
+
expect(@session.all(:css, 'a.simple').size).to eq(1)
|
|
127
|
+
Capybara.ignore_hidden_elements = false
|
|
128
|
+
expect(@session.all(:css, 'a.simple').size).to eq(2)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
context 'with per session config', requires: [:psc] do
|
|
132
|
+
it 'should use the sessions ignore_hidden_elements', psc: true do
|
|
133
|
+
Capybara.ignore_hidden_elements = true
|
|
134
|
+
@session.config.ignore_hidden_elements = false
|
|
135
|
+
expect(Capybara.ignore_hidden_elements).to eq(true)
|
|
136
|
+
expect(@session.all(:css, 'a.simple').size).to eq(2)
|
|
137
|
+
@session.config.ignore_hidden_elements = true
|
|
138
|
+
expect(@session.all(:css, 'a.simple').size).to eq(1)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
context 'with obscured filter', requires: [:css] do
|
|
144
|
+
it 'should only find nodes on top in the viewport when false' do
|
|
145
|
+
expect(@session.all(:css, 'a.simple', obscured: false).size).to eq(1)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it 'should not find nodes on top outside the viewport when false' do
|
|
149
|
+
expect(@session.all(:link, 'Download Me', obscured: false).size).to eq(0)
|
|
150
|
+
@session.scroll_to(@session.find_link('Download Me'))
|
|
151
|
+
expect(@session.all(:link, 'Download Me', obscured: false).size).to eq(1)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it 'should find top nodes outside the viewport when true' do
|
|
155
|
+
expect(@session.all(:link, 'Download Me', obscured: true).size).to eq(1)
|
|
156
|
+
@session.scroll_to(@session.find_link('Download Me'))
|
|
157
|
+
expect(@session.all(:link, 'Download Me', obscured: true).size).to eq(0)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it 'should only find non-top nodes when true' do
|
|
161
|
+
# Also need visible: false so visibility is ignored
|
|
162
|
+
expect(@session.all(:css, 'a.simple', visible: false, obscured: true).size).to eq(1)
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
context 'with element count filters' do
|
|
167
|
+
context ':count' do
|
|
168
|
+
it 'should succeed when the number of elements founds matches the expectation' do
|
|
169
|
+
expect { @session.all(:css, 'h1, p', count: 4) }.not_to raise_error
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
|
173
|
+
expect { @session.all(:css, 'h1, p', count: 5) }.to raise_error(Capybara::ExpectationNotMet)
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
context ':minimum' do
|
|
178
|
+
it 'should succeed when the number of elements founds matches the expectation' do
|
|
179
|
+
expect { @session.all(:css, 'h1, p', minimum: 0) }.not_to raise_error
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
|
183
|
+
expect { @session.all(:css, 'h1, p', minimum: 5) }.to raise_error(Capybara::ExpectationNotMet)
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
context ':maximum' do
|
|
188
|
+
it 'should succeed when the number of elements founds matches the expectation' do
|
|
189
|
+
expect { @session.all(:css, 'h1, p', maximum: 4) }.not_to raise_error
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
|
193
|
+
expect { @session.all(:css, 'h1, p', maximum: 0) }.to raise_error(Capybara::ExpectationNotMet)
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
context ':between' do
|
|
198
|
+
it 'should succeed when the number of elements founds matches the expectation' do
|
|
199
|
+
expect { @session.all(:css, 'h1, p', between: 2..7) }.not_to raise_error
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
|
203
|
+
expect { @session.all(:css, 'h1, p', between: 0..3) }.to raise_error(Capybara::ExpectationNotMet)
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
eval <<~TEST, binding, __FILE__, __LINE__ + 1 if RUBY_VERSION.to_f > 2.5
|
|
207
|
+
it'treats an endless range as minimum' do
|
|
208
|
+
expect { @session.all(:css, 'h1, p', between: 2..) }.not_to raise_error
|
|
209
|
+
expect { @session.all(:css, 'h1, p', between: 5..) }.to raise_error(Capybara::ExpectationNotMet)
|
|
210
|
+
end
|
|
211
|
+
TEST
|
|
212
|
+
|
|
213
|
+
eval <<~TEST, binding, __FILE__, __LINE__ + 1 if RUBY_VERSION.to_f > 2.6
|
|
214
|
+
it'treats a beginless range as maximum' do
|
|
215
|
+
expect { @session.all(:css, 'h1, p', between: ..7) }.not_to raise_error
|
|
216
|
+
expect { @session.all(:css, 'h1, p', between: ..3) }.to raise_error(Capybara::ExpectationNotMet)
|
|
217
|
+
end
|
|
218
|
+
TEST
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
context 'with multiple count filters' do
|
|
222
|
+
it 'ignores other filters when :count is specified' do
|
|
223
|
+
o = { count: 4,
|
|
224
|
+
minimum: 5,
|
|
225
|
+
maximum: 0,
|
|
226
|
+
between: 0..3 }
|
|
227
|
+
expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
context 'with no :count expectation' do
|
|
231
|
+
it 'fails if :minimum is not met' do
|
|
232
|
+
o = { minimum: 5,
|
|
233
|
+
maximum: 4,
|
|
234
|
+
between: 2..7 }
|
|
235
|
+
expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
it 'fails if :maximum is not met' do
|
|
239
|
+
o = { minimum: 0,
|
|
240
|
+
maximum: 0,
|
|
241
|
+
between: 2..7 }
|
|
242
|
+
expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
it 'fails if :between is not met' do
|
|
246
|
+
o = { minimum: 0,
|
|
247
|
+
maximum: 4,
|
|
248
|
+
between: 0..3 }
|
|
249
|
+
expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
it 'succeeds if all combineable expectations are met' do
|
|
253
|
+
o = { minimum: 0,
|
|
254
|
+
maximum: 4,
|
|
255
|
+
between: 2..7 }
|
|
256
|
+
expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
context 'within a scope' do
|
|
263
|
+
before do
|
|
264
|
+
@session.visit('/with_scope')
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
it 'should find any element using the given locator' do
|
|
268
|
+
@session.within(:xpath, "//div[@id='for_bar']") do
|
|
269
|
+
expect(@session.all('.//li').size).to eq(2)
|
|
270
|
+
end
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
it 'should have #find_all as an alias' do
|
|
275
|
+
expect(Capybara::Node::Finders.instance_method(:all)).to eq Capybara::Node::Finders.instance_method(:find_all)
|
|
276
|
+
expect(@session.find_all('//p').size).to eq(3)
|
|
277
|
+
end
|
|
278
|
+
end
|