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
|
@@ -1,118 +1,138 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#click_link_or_button' do
|
|
3
|
-
it
|
|
4
|
+
it 'should click on a link' do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
@session.click_link_or_button('labore')
|
|
6
7
|
expect(@session).to have_content('Bar')
|
|
7
8
|
end
|
|
8
9
|
|
|
9
|
-
it
|
|
10
|
+
it 'should click on a button' do
|
|
10
11
|
@session.visit('/form')
|
|
11
12
|
@session.click_link_or_button('awe123')
|
|
12
13
|
expect(extract_results(@session)['first_name']).to eq('John')
|
|
13
14
|
end
|
|
14
15
|
|
|
15
|
-
it
|
|
16
|
+
it 'should click on a button with no type attribute' do
|
|
16
17
|
@session.visit('/form')
|
|
17
18
|
@session.click_link_or_button('no_type')
|
|
18
19
|
expect(extract_results(@session)['first_name']).to eq('John')
|
|
19
20
|
end
|
|
20
21
|
|
|
21
|
-
it
|
|
22
|
+
it 'should be aliased as click_on' do
|
|
22
23
|
@session.visit('/form')
|
|
23
24
|
@session.click_on('awe123')
|
|
24
25
|
expect(extract_results(@session)['first_name']).to eq('John')
|
|
25
26
|
end
|
|
26
27
|
|
|
27
|
-
it
|
|
28
|
+
it 'should wait for asynchronous load', requires: [:js] do
|
|
29
|
+
Capybara.default_max_wait_time = 2
|
|
28
30
|
@session.visit('/with_js')
|
|
29
31
|
@session.click_link('Click me')
|
|
30
32
|
@session.click_link_or_button('Has been clicked')
|
|
31
33
|
end
|
|
32
34
|
|
|
33
|
-
it
|
|
35
|
+
it 'casts to string' do
|
|
34
36
|
@session.visit('/form')
|
|
35
|
-
@session.click_link_or_button(:
|
|
37
|
+
@session.click_link_or_button(:awe123)
|
|
36
38
|
expect(extract_results(@session)['first_name']).to eq('John')
|
|
37
39
|
end
|
|
38
40
|
|
|
39
|
-
context
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
context 'with test_id' do
|
|
42
|
+
it 'should click on a button' do
|
|
43
|
+
Capybara.test_id = 'data-test-id'
|
|
44
|
+
@session.visit('/form')
|
|
45
|
+
@session.click_link_or_button('test_id_button')
|
|
46
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context 'with :exact option' do
|
|
51
|
+
context 'when `false`' do
|
|
52
|
+
it 'clicks on approximately matching link' do
|
|
42
53
|
@session.visit('/with_html')
|
|
43
|
-
@session.click_link_or_button('abore', exact:
|
|
54
|
+
@session.click_link_or_button('abore', exact: false)
|
|
44
55
|
expect(@session).to have_content('Bar')
|
|
45
56
|
end
|
|
46
57
|
|
|
47
|
-
it
|
|
58
|
+
it 'clicks on approximately matching button' do
|
|
48
59
|
@session.visit('/form')
|
|
49
|
-
@session.click_link_or_button('awe')
|
|
60
|
+
@session.click_link_or_button('awe', exact: false)
|
|
50
61
|
expect(extract_results(@session)['first_name']).to eq('John')
|
|
51
62
|
end
|
|
52
63
|
end
|
|
53
64
|
|
|
54
|
-
context
|
|
55
|
-
it
|
|
65
|
+
context 'when `true`' do
|
|
66
|
+
it 'does not click on link which matches approximately' do
|
|
56
67
|
@session.visit('/with_html')
|
|
57
|
-
msg =
|
|
68
|
+
msg = 'Unable to find link or button "abore"'
|
|
58
69
|
expect do
|
|
59
|
-
@session.click_link_or_button('abore', exact:
|
|
70
|
+
@session.click_link_or_button('abore', exact: true)
|
|
60
71
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
61
72
|
end
|
|
62
73
|
|
|
63
|
-
it
|
|
74
|
+
it 'does not click on approximately matching button' do
|
|
64
75
|
@session.visit('/form')
|
|
65
|
-
msg =
|
|
76
|
+
msg = 'Unable to find link or button "awe"'
|
|
66
77
|
|
|
67
78
|
expect do
|
|
68
|
-
@session.click_link_or_button('awe', exact:
|
|
79
|
+
@session.click_link_or_button('awe', exact: true)
|
|
69
80
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
70
81
|
end
|
|
71
82
|
end
|
|
72
83
|
end
|
|
73
84
|
|
|
74
85
|
context "with a locator that doesn't exist" do
|
|
75
|
-
it
|
|
86
|
+
it 'should raise an error' do
|
|
76
87
|
@session.visit('/with_html')
|
|
77
|
-
msg =
|
|
88
|
+
msg = 'Unable to find link or button "does not exist"'
|
|
78
89
|
expect do
|
|
79
90
|
@session.click_link_or_button('does not exist')
|
|
80
91
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
81
92
|
end
|
|
82
93
|
end
|
|
83
94
|
|
|
84
|
-
context
|
|
85
|
-
it
|
|
95
|
+
context 'with :disabled option' do
|
|
96
|
+
it 'ignores disabled buttons when false' do
|
|
86
97
|
@session.visit('/form')
|
|
87
98
|
expect do
|
|
88
99
|
@session.click_link_or_button('Disabled button', disabled: false)
|
|
89
100
|
end.to raise_error(Capybara::ElementNotFound)
|
|
90
101
|
end
|
|
91
102
|
|
|
92
|
-
it
|
|
103
|
+
it 'ignores disabled buttons by default' do
|
|
93
104
|
@session.visit('/form')
|
|
94
105
|
expect do
|
|
95
106
|
@session.click_link_or_button('Disabled button')
|
|
96
107
|
end.to raise_error(Capybara::ElementNotFound)
|
|
97
108
|
end
|
|
98
109
|
|
|
99
|
-
it
|
|
110
|
+
it 'happily clicks on links which incorrectly have the disabled attribute' do
|
|
100
111
|
@session.visit('/with_html')
|
|
101
112
|
@session.click_link_or_button('Disabled link')
|
|
102
|
-
expect(@session).to have_content(
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
it "does nothing when button is disabled" do
|
|
106
|
-
@session.visit('/form')
|
|
107
|
-
expect do
|
|
108
|
-
@session.click_link_or_button('Disabled button', disabled: false)
|
|
109
|
-
end.to raise_error(Capybara::ElementNotFound)
|
|
113
|
+
expect(@session).to have_content('Bar')
|
|
110
114
|
end
|
|
111
115
|
end
|
|
112
116
|
|
|
113
|
-
it
|
|
117
|
+
it 'should return the element clicked' do
|
|
114
118
|
@session.visit('/with_html')
|
|
115
119
|
link = @session.find(:link, 'Blank Anchor')
|
|
116
120
|
expect(@session.click_link_or_button('Blank Anchor')).to eq link
|
|
117
121
|
end
|
|
122
|
+
|
|
123
|
+
context 'with enable_aria_label' do
|
|
124
|
+
it 'should click on link' do
|
|
125
|
+
@session.visit('/with_html')
|
|
126
|
+
expect do
|
|
127
|
+
@session.click_link_or_button('Go to simple', enable_aria_label: true)
|
|
128
|
+
end.not_to raise_error
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it 'should click on button' do
|
|
132
|
+
@session.visit('/form')
|
|
133
|
+
expect do
|
|
134
|
+
@session.click_link_or_button('Aria button', enable_aria_label: true)
|
|
135
|
+
end.not_to raise_error
|
|
136
|
+
end
|
|
137
|
+
end
|
|
118
138
|
end
|
|
@@ -1,205 +1,240 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#click_link' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
+
it 'should wait for asynchronous load', requires: [:js] do
|
|
9
|
+
Capybara.default_max_wait_time = 2
|
|
8
10
|
@session.visit('/with_js')
|
|
9
11
|
@session.click_link('Click me')
|
|
10
12
|
@session.click_link('Has been clicked')
|
|
11
13
|
end
|
|
12
14
|
|
|
13
|
-
it
|
|
14
|
-
@session.click_link(:
|
|
15
|
+
it 'casts to string' do
|
|
16
|
+
@session.click_link(:foo)
|
|
15
17
|
expect(@session).to have_content('Another World')
|
|
16
18
|
end
|
|
17
19
|
|
|
18
|
-
it
|
|
19
|
-
quietly { @session.visit(
|
|
20
|
+
it 'raises any errors caught inside the server', requires: [:server] do
|
|
21
|
+
quietly { @session.visit('/error') }
|
|
20
22
|
expect do
|
|
21
23
|
@session.click_link('foo')
|
|
22
24
|
end.to raise_error(TestApp::TestAppError)
|
|
23
25
|
end
|
|
24
26
|
|
|
25
|
-
context
|
|
26
|
-
it
|
|
27
|
+
context 'with id given' do
|
|
28
|
+
it 'should take user to the linked page' do
|
|
27
29
|
@session.click_link('foo')
|
|
28
30
|
expect(@session).to have_content('Another World')
|
|
29
31
|
end
|
|
30
32
|
end
|
|
31
33
|
|
|
32
|
-
context
|
|
33
|
-
it
|
|
34
|
+
context 'with text given' do
|
|
35
|
+
it 'should take user to the linked page' do
|
|
34
36
|
@session.click_link('labore')
|
|
35
37
|
expect(@session).to have_content('Bar')
|
|
36
38
|
end
|
|
37
39
|
|
|
38
|
-
it
|
|
40
|
+
it 'should accept partial matches', :exact_false do
|
|
39
41
|
@session.click_link('abo')
|
|
40
42
|
expect(@session).to have_content('Bar')
|
|
41
43
|
end
|
|
42
44
|
end
|
|
43
45
|
|
|
44
|
-
context
|
|
45
|
-
it
|
|
46
|
+
context 'with title given' do
|
|
47
|
+
it 'should take user to the linked page' do
|
|
46
48
|
@session.click_link('awesome title')
|
|
47
49
|
expect(@session).to have_content('Bar')
|
|
48
50
|
end
|
|
49
51
|
|
|
50
|
-
it
|
|
52
|
+
it 'should accept partial matches', :exact_false do
|
|
51
53
|
@session.click_link('some titl')
|
|
52
54
|
expect(@session).to have_content('Bar')
|
|
53
55
|
end
|
|
54
56
|
end
|
|
55
57
|
|
|
56
|
-
context
|
|
57
|
-
it
|
|
58
|
+
context 'with alternative text given to a contained image' do
|
|
59
|
+
it 'should take user to the linked page' do
|
|
58
60
|
@session.click_link('awesome image')
|
|
59
61
|
expect(@session).to have_content('Bar')
|
|
60
62
|
end
|
|
61
63
|
|
|
62
|
-
it
|
|
64
|
+
it 'should accept partial matches', :exact_false do
|
|
63
65
|
@session.click_link('some imag')
|
|
64
66
|
expect(@session).to have_content('Bar')
|
|
65
67
|
end
|
|
66
68
|
end
|
|
67
69
|
|
|
68
70
|
context "with a locator that doesn't exist" do
|
|
69
|
-
it
|
|
70
|
-
msg =
|
|
71
|
+
it 'should raise an error' do
|
|
72
|
+
msg = 'Unable to find link "does not exist"'
|
|
71
73
|
expect do
|
|
72
74
|
@session.click_link('does not exist')
|
|
73
75
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
74
76
|
end
|
|
75
77
|
end
|
|
76
78
|
|
|
77
|
-
context
|
|
78
|
-
it
|
|
79
|
+
context 'with :href option given' do
|
|
80
|
+
it 'should find links with valid href' do
|
|
79
81
|
@session.click_link('labore', href: '/with_simple_html')
|
|
80
82
|
expect(@session).to have_content('Bar')
|
|
81
83
|
end
|
|
82
84
|
|
|
83
85
|
it "should raise error if link wasn't found" do
|
|
84
|
-
expect { @session.click_link('labore', href: 'invalid_href') }.to raise_error(Capybara::ElementNotFound)
|
|
86
|
+
expect { @session.click_link('labore', href: 'invalid_href') }.to raise_error(Capybara::ElementNotFound, /with href "invalid_href/)
|
|
85
87
|
end
|
|
86
88
|
end
|
|
87
89
|
|
|
88
|
-
context
|
|
89
|
-
it
|
|
90
|
+
context 'with a regex :href option given' do
|
|
91
|
+
it 'should find a link matching an all-matching regex pattern' do
|
|
90
92
|
@session.click_link('labore', href: /.+/)
|
|
91
93
|
expect(@session).to have_content('Bar')
|
|
92
94
|
end
|
|
93
95
|
|
|
94
|
-
it
|
|
95
|
-
@session.click_link('labore', href:
|
|
96
|
+
it 'should find a link matching an exact regex pattern' do
|
|
97
|
+
@session.click_link('labore', href: %r{/with_simple_html})
|
|
96
98
|
expect(@session).to have_content('Bar')
|
|
97
99
|
end
|
|
98
100
|
|
|
99
|
-
it
|
|
100
|
-
@session.click_link('labore', href:
|
|
101
|
+
it 'should find a link matching a partial regex pattern' do
|
|
102
|
+
@session.click_link('labore', href: %r{/with_simple})
|
|
101
103
|
expect(@session).to have_content('Bar')
|
|
102
104
|
end
|
|
103
105
|
|
|
104
106
|
it "should raise an error if no link's href matched the pattern" do
|
|
105
|
-
expect { @session.click_link('labore', href: /invalid_pattern/) }.to raise_error(Capybara::ElementNotFound)
|
|
106
|
-
expect { @session.click_link('labore', href: /.+d+/) }.to raise_error(Capybara::ElementNotFound)
|
|
107
|
+
expect { @session.click_link('labore', href: /invalid_pattern/) }.to raise_error(Capybara::ElementNotFound, %r{with href matching /invalid_pattern/})
|
|
108
|
+
expect { @session.click_link('labore', href: /.+d+/) }.to raise_error(Capybara::ElementNotFound, /#{Regexp.quote 'with href matching /.+d+/'}/)
|
|
107
109
|
end
|
|
108
110
|
|
|
109
111
|
context 'href: nil' do
|
|
110
|
-
it
|
|
112
|
+
it 'should not raise an error on links with no href attribute' do
|
|
111
113
|
expect { @session.click_link('No Href', href: nil) }.not_to raise_error
|
|
112
114
|
end
|
|
113
115
|
|
|
114
|
-
it
|
|
115
|
-
expect { @session.click_link('Blank Href', href: nil) }.to raise_error(Capybara::ElementNotFound)
|
|
116
|
-
expect { @session.click_link('Normal Anchor', href: nil) }.to raise_error(Capybara::ElementNotFound)
|
|
116
|
+
it 'should raise an error if href attribute exists' do
|
|
117
|
+
expect { @session.click_link('Blank Href', href: nil) }.to raise_error(Capybara::ElementNotFound, /with no href attribute/)
|
|
118
|
+
expect { @session.click_link('Normal Anchor', href: nil) }.to raise_error(Capybara::ElementNotFound, /with no href attribute/)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
context 'href: false' do
|
|
123
|
+
it 'should not raise an error on links with no href attribute' do
|
|
124
|
+
expect { @session.click_link('No Href', href: false) }.not_to raise_error
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it 'should not raise an error if href attribute exists' do
|
|
128
|
+
expect { @session.click_link('Blank Href', href: false) }.not_to raise_error
|
|
129
|
+
expect { @session.click_link('Normal Anchor', href: false) }.not_to raise_error
|
|
117
130
|
end
|
|
118
131
|
end
|
|
119
132
|
end
|
|
120
133
|
|
|
121
|
-
|
|
134
|
+
context 'with :target option given' do
|
|
135
|
+
it 'should find links with valid target' do
|
|
136
|
+
@session.click_link('labore', target: '_self')
|
|
137
|
+
expect(@session).to have_content('Bar')
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it "should raise error if link wasn't found" do
|
|
141
|
+
expect { @session.click_link('labore', target: '_blank') }.to raise_error(Capybara::ElementNotFound, /Unable to find link "labore"/)
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it 'should follow relative links' do
|
|
122
146
|
@session.visit('/')
|
|
123
147
|
@session.click_link('Relative')
|
|
124
148
|
expect(@session).to have_content('This is a test')
|
|
125
149
|
end
|
|
126
150
|
|
|
127
|
-
it
|
|
151
|
+
it 'should follow protocol relative links' do
|
|
128
152
|
@session.click_link('Protocol')
|
|
129
153
|
expect(@session).to have_content('Another World')
|
|
130
154
|
end
|
|
131
155
|
|
|
132
|
-
it
|
|
156
|
+
it 'should follow redirects' do
|
|
133
157
|
@session.click_link('Redirect')
|
|
134
158
|
expect(@session).to have_content('You landed')
|
|
135
159
|
end
|
|
136
160
|
|
|
137
|
-
it
|
|
161
|
+
it 'should follow redirects back to itself' do
|
|
138
162
|
@session.click_link('BackToMyself')
|
|
139
|
-
expect(@session).to have_css('#referrer', text:
|
|
163
|
+
expect(@session).to have_css('#referrer', text: %r{/with_html$})
|
|
140
164
|
expect(@session).to have_content('This is a test')
|
|
141
165
|
end
|
|
142
166
|
|
|
143
|
-
it
|
|
167
|
+
it 'should add query string to current URL with naked query string' do
|
|
144
168
|
@session.click_link('Naked Query String')
|
|
145
169
|
expect(@session).to have_content('Query String sent')
|
|
146
170
|
end
|
|
147
171
|
|
|
148
|
-
it
|
|
149
|
-
@session.fill_in(
|
|
172
|
+
it 'should do nothing on anchor links' do
|
|
173
|
+
@session.fill_in('test_field', with: 'blah')
|
|
150
174
|
@session.click_link('Normal Anchor')
|
|
151
|
-
expect(@session.find_field(
|
|
175
|
+
expect(@session.find_field('test_field').value).to eq('blah')
|
|
152
176
|
@session.click_link('Blank Anchor')
|
|
153
|
-
expect(@session.find_field(
|
|
177
|
+
expect(@session.find_field('test_field').value).to eq('blah')
|
|
154
178
|
@session.click_link('Blank JS Anchor')
|
|
155
|
-
expect(@session.find_field(
|
|
179
|
+
expect(@session.find_field('test_field').value).to eq('blah')
|
|
156
180
|
end
|
|
157
181
|
|
|
158
|
-
it
|
|
159
|
-
@session.fill_in(
|
|
182
|
+
it 'should do nothing on URL+anchor links for the same page' do
|
|
183
|
+
@session.fill_in('test_field', with: 'blah')
|
|
160
184
|
@session.click_link('Anchor on same page')
|
|
161
|
-
expect(@session.find_field(
|
|
185
|
+
expect(@session.find_field('test_field').value).to eq('blah')
|
|
162
186
|
end
|
|
163
187
|
|
|
164
|
-
it
|
|
188
|
+
it 'should follow link on URL+anchor links for a different page' do
|
|
165
189
|
@session.click_link('Anchor on different page')
|
|
166
190
|
expect(@session).to have_content('Bar')
|
|
167
191
|
end
|
|
168
192
|
|
|
169
|
-
it
|
|
193
|
+
it 'should follow link on anchor if the path has regex special characters' do
|
|
170
194
|
@session.visit('/with.*html')
|
|
171
195
|
@session.click_link('Anchor on different page')
|
|
172
196
|
expect(@session).to have_content('Bar')
|
|
173
197
|
end
|
|
174
198
|
|
|
175
|
-
it
|
|
199
|
+
it 'should raise an error with links with no href' do
|
|
176
200
|
expect do
|
|
177
201
|
@session.click_link('No Href')
|
|
178
202
|
end.to raise_error(Capybara::ElementNotFound)
|
|
179
203
|
end
|
|
180
204
|
|
|
181
|
-
context
|
|
182
|
-
it
|
|
183
|
-
@session.click_link('abo', exact:
|
|
205
|
+
context 'with :exact option' do
|
|
206
|
+
it 'should accept partial matches when false' do
|
|
207
|
+
@session.click_link('abo', exact: false)
|
|
184
208
|
expect(@session).to have_content('Bar')
|
|
185
209
|
end
|
|
186
210
|
|
|
187
|
-
it
|
|
211
|
+
it 'should not accept partial matches when true' do
|
|
188
212
|
expect do
|
|
189
|
-
@session.click_link('abo', exact:
|
|
213
|
+
@session.click_link('abo', exact: true)
|
|
190
214
|
end.to raise_error(Capybara::ElementNotFound)
|
|
191
215
|
end
|
|
192
216
|
end
|
|
193
217
|
|
|
194
|
-
context
|
|
195
|
-
it
|
|
218
|
+
context 'without locator' do
|
|
219
|
+
it 'uses options' do
|
|
196
220
|
@session.click_link(href: '/foo')
|
|
197
221
|
expect(@session).to have_content('Another World')
|
|
198
222
|
end
|
|
199
223
|
end
|
|
200
224
|
|
|
201
|
-
it
|
|
225
|
+
it 'should return element clicked' do
|
|
202
226
|
el = @session.find(:link, 'Normal Anchor')
|
|
203
227
|
expect(@session.click_link('Normal Anchor')).to eq el
|
|
204
228
|
end
|
|
229
|
+
|
|
230
|
+
it 'can download a file', requires: [:download] do
|
|
231
|
+
# This requires the driver used for the test to be configured
|
|
232
|
+
# to download documents with the mime type "text/csv"
|
|
233
|
+
download_file = File.join(Capybara.save_path, 'download.csv')
|
|
234
|
+
expect(File).not_to exist(download_file)
|
|
235
|
+
@session.click_link('Download Me')
|
|
236
|
+
sleep 2 # allow time for file to download
|
|
237
|
+
expect(File).to exist(download_file)
|
|
238
|
+
FileUtils.rm_rf download_file
|
|
239
|
+
end
|
|
205
240
|
end
|
|
@@ -1,25 +1,26 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#current_scope' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_scope')
|
|
5
6
|
end
|
|
6
|
-
|
|
7
|
-
context
|
|
8
|
-
it
|
|
9
|
-
expect(@session.current_scope).to
|
|
7
|
+
|
|
8
|
+
context 'when not in a #within block' do
|
|
9
|
+
it 'should return the document' do
|
|
10
|
+
expect(@session.current_scope).to be_a Capybara::Node::Document
|
|
10
11
|
end
|
|
11
12
|
end
|
|
12
|
-
|
|
13
|
-
context
|
|
14
|
-
it
|
|
15
|
-
@session.within(:css,
|
|
13
|
+
|
|
14
|
+
context 'when in a #within block' do
|
|
15
|
+
it 'should return the element in scope' do
|
|
16
|
+
@session.within(:css, '#simple_first_name') do
|
|
16
17
|
expect(@session.current_scope[:name]).to eq 'first_name'
|
|
17
18
|
end
|
|
18
19
|
end
|
|
19
20
|
end
|
|
20
|
-
|
|
21
|
-
context
|
|
22
|
-
it
|
|
21
|
+
|
|
22
|
+
context 'when in a nested #within block' do
|
|
23
|
+
it 'should return the element in scope' do
|
|
23
24
|
@session.within("//div[@id='for_bar']") do
|
|
24
25
|
@session.within(".//input[@value='Peter']") do
|
|
25
26
|
expect(@session.current_scope[:name]).to eq 'form[first_name]'
|