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,20 +1,21 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#has_field' do
|
|
3
4
|
before { @session.visit('/form') }
|
|
4
5
|
|
|
5
|
-
it
|
|
6
|
+
it 'should be true if the field is on the page' do
|
|
6
7
|
expect(@session).to have_field('Dog')
|
|
7
8
|
expect(@session).to have_field('form_description')
|
|
8
9
|
expect(@session).to have_field('Region')
|
|
9
|
-
expect(@session).to have_field(:
|
|
10
|
+
expect(@session).to have_field(:Region)
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
it
|
|
13
|
+
it 'should be false if the field is not on the page' do
|
|
13
14
|
expect(@session).not_to have_field('Monkey')
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
context 'with value' do
|
|
17
|
-
it
|
|
18
|
+
it 'should be true if a field with the given value is on the page' do
|
|
18
19
|
expect(@session).to have_field('First Name', with: 'John')
|
|
19
20
|
expect(@session).to have_field('First Name', with: /^Joh/)
|
|
20
21
|
expect(@session).to have_field('Phone', with: '+1 555 7021')
|
|
@@ -22,28 +23,61 @@ Capybara::SpecHelper.spec '#has_field' do
|
|
|
22
23
|
expect(@session).to have_field('Description', with: 'Descriptive text goes here')
|
|
23
24
|
end
|
|
24
25
|
|
|
25
|
-
it
|
|
26
|
+
it 'should be false if the given field is not on the page' do
|
|
26
27
|
expect(@session).not_to have_field('First Name', with: 'Peter')
|
|
27
28
|
expect(@session).not_to have_field('First Name', with: /eter$/)
|
|
28
29
|
expect(@session).not_to have_field('Wrong Name', with: 'John')
|
|
29
30
|
expect(@session).not_to have_field('Description', with: 'Monkey')
|
|
30
31
|
end
|
|
31
32
|
|
|
32
|
-
it
|
|
33
|
+
it 'should be true after the field has been filled in with the given value' do
|
|
33
34
|
@session.fill_in('First Name', with: 'Jonas')
|
|
34
35
|
expect(@session).to have_field('First Name', with: 'Jonas')
|
|
35
36
|
expect(@session).to have_field('First Name', with: /ona/)
|
|
36
37
|
end
|
|
37
38
|
|
|
38
|
-
it
|
|
39
|
+
it 'should be false after the field has been filled in with a different value' do
|
|
39
40
|
@session.fill_in('First Name', with: 'Jonas')
|
|
40
41
|
expect(@session).not_to have_field('First Name', with: 'John')
|
|
41
42
|
expect(@session).not_to have_field('First Name', with: /John|Paul|George|Ringo/)
|
|
42
43
|
end
|
|
44
|
+
|
|
45
|
+
it 'should output filter errors if only one element matched the selector but failed the filters' do
|
|
46
|
+
@session.fill_in('First Name', with: 'Thomas')
|
|
47
|
+
expect do
|
|
48
|
+
expect(@session).to have_field('First Name', with: 'Jonas')
|
|
49
|
+
end.to raise_exception(RSpec::Expectations::ExpectationNotMetError, /Expected value to be "Jonas" but was "Thomas"/)
|
|
50
|
+
|
|
51
|
+
# native boolean node filter
|
|
52
|
+
expect do
|
|
53
|
+
expect(@session).to have_field('First Name', readonly: true)
|
|
54
|
+
end.to raise_exception(RSpec::Expectations::ExpectationNotMetError, /Expected readonly true but it wasn't/)
|
|
55
|
+
|
|
56
|
+
# inherited boolean node filter
|
|
57
|
+
expect do
|
|
58
|
+
expect(@session).to have_field('form_pets_cat', checked: true)
|
|
59
|
+
end.to raise_exception(RSpec::Expectations::ExpectationNotMetError, /Expected checked true but it wasn't/)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context 'with validation message', requires: [:html_validation] do
|
|
64
|
+
it 'should accept a regexp' do
|
|
65
|
+
@session.fill_in('form_zipcode', with: '1234')
|
|
66
|
+
expect(@session).to have_field('form_zipcode', validation_message: /match the requested format/)
|
|
67
|
+
expect(@session).not_to have_field('form_zipcode', validation_message: /random/)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it 'should accept a string' do
|
|
71
|
+
@session.fill_in('form_zipcode', with: '1234')
|
|
72
|
+
expect(@session).to have_field('form_zipcode', validation_message: 'Please match the requested format.')
|
|
73
|
+
expect(@session).not_to have_field('form_zipcode', validation_message: 'match the requested format.')
|
|
74
|
+
@session.fill_in('form_zipcode', with: '12345')
|
|
75
|
+
expect(@session).to have_field('form_zipcode', validation_message: '')
|
|
76
|
+
end
|
|
43
77
|
end
|
|
44
78
|
|
|
45
79
|
context 'with type' do
|
|
46
|
-
it
|
|
80
|
+
it 'should be true if a field with the given type is on the page' do
|
|
47
81
|
expect(@session).to have_field('First Name', type: 'text')
|
|
48
82
|
expect(@session).to have_field('Html5 Email', type: 'email')
|
|
49
83
|
expect(@session).to have_field('Html5 Multiple Email', type: 'email')
|
|
@@ -52,7 +86,7 @@ Capybara::SpecHelper.spec '#has_field' do
|
|
|
52
86
|
expect(@session).to have_field('Languages', type: 'select')
|
|
53
87
|
end
|
|
54
88
|
|
|
55
|
-
it
|
|
89
|
+
it 'should be false if the given field is not on the page' do
|
|
56
90
|
expect(@session).not_to have_field('First Name', type: 'textarea')
|
|
57
91
|
expect(@session).not_to have_field('Html5 Email', type: 'tel')
|
|
58
92
|
expect(@session).not_to have_field('Html5 Multiple Email', type: 'tel')
|
|
@@ -60,59 +94,93 @@ Capybara::SpecHelper.spec '#has_field' do
|
|
|
60
94
|
expect(@session).not_to have_field('Description', type: 'email')
|
|
61
95
|
expect(@session).not_to have_field('Languages', type: 'textarea')
|
|
62
96
|
end
|
|
97
|
+
|
|
98
|
+
it 'it can find type="hidden" elements if explicity specified' do
|
|
99
|
+
expect(@session).to have_field('form[data]', with: 'TWTW', type: 'hidden')
|
|
100
|
+
end
|
|
63
101
|
end
|
|
64
102
|
|
|
65
103
|
context 'with multiple' do
|
|
66
|
-
it
|
|
104
|
+
it 'should be true if a field with the multiple attribute is on the page' do
|
|
67
105
|
expect(@session).to have_field('Html5 Multiple Email', multiple: true)
|
|
68
106
|
end
|
|
69
107
|
|
|
70
|
-
it
|
|
108
|
+
it 'should be false if a field without the multiple attribute is not on the page' do
|
|
71
109
|
expect(@session).not_to have_field('Html5 Multiple Email', multiple: false)
|
|
72
110
|
end
|
|
73
111
|
end
|
|
112
|
+
|
|
113
|
+
context 'with focused:', requires: [:active_element] do
|
|
114
|
+
it 'should be true if a field has focus' do
|
|
115
|
+
2.times { @session.send_keys(:tab) }
|
|
116
|
+
|
|
117
|
+
expect(@session).to have_field('An Input', focused: true)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it 'should be false if a field does not have focus' do
|
|
121
|
+
expect(@session).to have_field('An Input', focused: false)
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
context 'with valid', requires: [:js] do
|
|
126
|
+
it 'should be true if field is valid' do
|
|
127
|
+
@session.fill_in 'required', with: 'something'
|
|
128
|
+
@session.fill_in 'length', with: 'abcd'
|
|
129
|
+
|
|
130
|
+
expect(@session).to have_field('required', valid: true)
|
|
131
|
+
expect(@session).to have_field('length', valid: true)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'should be false if field is invalid' do
|
|
135
|
+
expect(@session).not_to have_field('required', valid: true)
|
|
136
|
+
expect(@session).to have_field('required', valid: false)
|
|
137
|
+
|
|
138
|
+
@session.fill_in 'length', with: 'abc'
|
|
139
|
+
expect(@session).not_to have_field('length', valid: true)
|
|
140
|
+
end
|
|
141
|
+
end
|
|
74
142
|
end
|
|
75
143
|
|
|
76
144
|
Capybara::SpecHelper.spec '#has_no_field' do
|
|
77
145
|
before { @session.visit('/form') }
|
|
78
146
|
|
|
79
|
-
it
|
|
147
|
+
it 'should be false if the field is on the page' do
|
|
80
148
|
expect(@session).not_to have_no_field('Dog')
|
|
81
149
|
expect(@session).not_to have_no_field('form_description')
|
|
82
150
|
expect(@session).not_to have_no_field('Region')
|
|
83
151
|
end
|
|
84
152
|
|
|
85
|
-
it
|
|
153
|
+
it 'should be true if the field is not on the page' do
|
|
86
154
|
expect(@session).to have_no_field('Monkey')
|
|
87
155
|
end
|
|
88
156
|
|
|
89
157
|
context 'with value' do
|
|
90
|
-
it
|
|
158
|
+
it 'should be false if a field with the given value is on the page' do
|
|
91
159
|
expect(@session).not_to have_no_field('First Name', with: 'John')
|
|
92
160
|
expect(@session).not_to have_no_field('Phone', with: '+1 555 7021')
|
|
93
161
|
expect(@session).not_to have_no_field('Street', with: 'Sesame street 66')
|
|
94
162
|
expect(@session).not_to have_no_field('Description', with: 'Descriptive text goes here')
|
|
95
163
|
end
|
|
96
164
|
|
|
97
|
-
it
|
|
165
|
+
it 'should be true if the given field is not on the page' do
|
|
98
166
|
expect(@session).to have_no_field('First Name', with: 'Peter')
|
|
99
167
|
expect(@session).to have_no_field('Wrong Name', with: 'John')
|
|
100
168
|
expect(@session).to have_no_field('Description', with: 'Monkey')
|
|
101
169
|
end
|
|
102
170
|
|
|
103
|
-
it
|
|
171
|
+
it 'should be false after the field has been filled in with the given value' do
|
|
104
172
|
@session.fill_in('First Name', with: 'Jonas')
|
|
105
173
|
expect(@session).not_to have_no_field('First Name', with: 'Jonas')
|
|
106
174
|
end
|
|
107
175
|
|
|
108
|
-
it
|
|
176
|
+
it 'should be true after the field has been filled in with a different value' do
|
|
109
177
|
@session.fill_in('First Name', with: 'Jonas')
|
|
110
178
|
expect(@session).to have_no_field('First Name', with: 'John')
|
|
111
179
|
end
|
|
112
180
|
end
|
|
113
181
|
|
|
114
182
|
context 'with type' do
|
|
115
|
-
it
|
|
183
|
+
it 'should be false if a field with the given type is on the page' do
|
|
116
184
|
expect(@session).not_to have_no_field('First Name', type: 'text')
|
|
117
185
|
expect(@session).not_to have_no_field('Html5 Email', type: 'email')
|
|
118
186
|
expect(@session).not_to have_no_field('Html5 Tel', type: 'tel')
|
|
@@ -120,7 +188,7 @@ Capybara::SpecHelper.spec '#has_no_field' do
|
|
|
120
188
|
expect(@session).not_to have_no_field('Languages', type: 'select')
|
|
121
189
|
end
|
|
122
190
|
|
|
123
|
-
it
|
|
191
|
+
it 'should be true if the given field is not on the page' do
|
|
124
192
|
expect(@session).to have_no_field('First Name', type: 'textarea')
|
|
125
193
|
expect(@session).to have_no_field('Html5 Email', type: 'tel')
|
|
126
194
|
expect(@session).to have_no_field('Description', type: '')
|
|
@@ -128,61 +196,73 @@ Capybara::SpecHelper.spec '#has_no_field' do
|
|
|
128
196
|
expect(@session).to have_no_field('Languages', type: 'textarea')
|
|
129
197
|
end
|
|
130
198
|
end
|
|
199
|
+
|
|
200
|
+
context 'with focused:', requires: [:active_element] do
|
|
201
|
+
it 'should be true if a field does not have focus when focused: true' do
|
|
202
|
+
expect(@session).to have_no_field('An Input', focused: true)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
it 'should be false if a field has focus when focused: true' do
|
|
206
|
+
2.times { @session.send_keys(:tab) }
|
|
207
|
+
|
|
208
|
+
expect(@session).not_to have_no_field('An Input', focused: true)
|
|
209
|
+
end
|
|
210
|
+
end
|
|
131
211
|
end
|
|
132
212
|
|
|
133
213
|
Capybara::SpecHelper.spec '#has_checked_field?' do
|
|
134
214
|
before { @session.visit('/form') }
|
|
135
215
|
|
|
136
|
-
it
|
|
216
|
+
it 'should be true if a checked field is on the page' do
|
|
137
217
|
expect(@session).to have_checked_field('gender_female')
|
|
138
218
|
expect(@session).to have_checked_field('Hamster')
|
|
139
219
|
end
|
|
140
220
|
|
|
141
|
-
it
|
|
221
|
+
it 'should be true for disabled checkboxes if disabled: true' do
|
|
142
222
|
expect(@session).to have_checked_field('Disabled Checkbox', disabled: true)
|
|
143
223
|
end
|
|
144
224
|
|
|
145
|
-
it
|
|
225
|
+
it 'should be false if an unchecked field is on the page' do
|
|
146
226
|
expect(@session).not_to have_checked_field('form_pets_cat')
|
|
147
227
|
expect(@session).not_to have_checked_field('Male')
|
|
148
228
|
end
|
|
149
229
|
|
|
150
|
-
it
|
|
230
|
+
it 'should be false if no field is on the page' do
|
|
151
231
|
expect(@session).not_to have_checked_field('Does Not Exist')
|
|
152
232
|
end
|
|
153
233
|
|
|
154
|
-
it
|
|
234
|
+
it 'should be false for disabled checkboxes by default' do
|
|
155
235
|
expect(@session).not_to have_checked_field('Disabled Checkbox')
|
|
156
236
|
end
|
|
157
237
|
|
|
158
|
-
it
|
|
238
|
+
it 'should be false for disabled checkboxes if disabled: false' do
|
|
159
239
|
expect(@session).not_to have_checked_field('Disabled Checkbox', disabled: false)
|
|
160
240
|
end
|
|
161
241
|
|
|
162
|
-
it
|
|
242
|
+
it 'should be true for disabled checkboxes if disabled: :all' do
|
|
163
243
|
expect(@session).to have_checked_field('Disabled Checkbox', disabled: :all)
|
|
164
244
|
end
|
|
165
245
|
|
|
166
|
-
it
|
|
246
|
+
it 'should be true for enabled checkboxes if disabled: :all' do
|
|
167
247
|
expect(@session).to have_checked_field('gender_female', disabled: :all)
|
|
168
248
|
end
|
|
169
249
|
|
|
170
|
-
it
|
|
250
|
+
it 'should be true after an unchecked checkbox is checked' do
|
|
171
251
|
@session.check('form_pets_cat')
|
|
172
252
|
expect(@session).to have_checked_field('form_pets_cat')
|
|
173
253
|
end
|
|
174
254
|
|
|
175
|
-
it
|
|
255
|
+
it 'should be false after a checked checkbox is unchecked' do
|
|
176
256
|
@session.uncheck('form_pets_dog')
|
|
177
257
|
expect(@session).not_to have_checked_field('form_pets_dog')
|
|
178
258
|
end
|
|
179
259
|
|
|
180
|
-
it
|
|
260
|
+
it 'should be true after an unchecked radio button is chosen' do
|
|
181
261
|
@session.choose('gender_male')
|
|
182
262
|
expect(@session).to have_checked_field('gender_male')
|
|
183
263
|
end
|
|
184
264
|
|
|
185
|
-
it
|
|
265
|
+
it 'should be false after another radio button in the group is chosen' do
|
|
186
266
|
@session.choose('gender_male')
|
|
187
267
|
expect(@session).not_to have_checked_field('gender_female')
|
|
188
268
|
end
|
|
@@ -191,29 +271,29 @@ end
|
|
|
191
271
|
Capybara::SpecHelper.spec '#has_no_checked_field?' do
|
|
192
272
|
before { @session.visit('/form') }
|
|
193
273
|
|
|
194
|
-
it
|
|
274
|
+
it 'should be false if a checked field is on the page' do
|
|
195
275
|
expect(@session).not_to have_no_checked_field('gender_female')
|
|
196
276
|
expect(@session).not_to have_no_checked_field('Hamster')
|
|
197
277
|
end
|
|
198
278
|
|
|
199
|
-
it
|
|
279
|
+
it 'should be false for disabled checkboxes if disabled: true' do
|
|
200
280
|
expect(@session).not_to have_no_checked_field('Disabled Checkbox', disabled: true)
|
|
201
281
|
end
|
|
202
282
|
|
|
203
|
-
it
|
|
283
|
+
it 'should be true if an unchecked field is on the page' do
|
|
204
284
|
expect(@session).to have_no_checked_field('form_pets_cat')
|
|
205
285
|
expect(@session).to have_no_checked_field('Male')
|
|
206
286
|
end
|
|
207
287
|
|
|
208
|
-
it
|
|
288
|
+
it 'should be true if no field is on the page' do
|
|
209
289
|
expect(@session).to have_no_checked_field('Does Not Exist')
|
|
210
290
|
end
|
|
211
291
|
|
|
212
|
-
it
|
|
292
|
+
it 'should be true for disabled checkboxes by default' do
|
|
213
293
|
expect(@session).to have_no_checked_field('Disabled Checkbox')
|
|
214
294
|
end
|
|
215
295
|
|
|
216
|
-
it
|
|
296
|
+
it 'should be true for disabled checkboxes if disabled: false' do
|
|
217
297
|
expect(@session).to have_no_checked_field('Disabled Checkbox', disabled: false)
|
|
218
298
|
end
|
|
219
299
|
end
|
|
@@ -221,89 +301,89 @@ end
|
|
|
221
301
|
Capybara::SpecHelper.spec '#has_unchecked_field?' do
|
|
222
302
|
before { @session.visit('/form') }
|
|
223
303
|
|
|
224
|
-
it
|
|
304
|
+
it 'should be false if a checked field is on the page' do
|
|
225
305
|
expect(@session).not_to have_unchecked_field('gender_female')
|
|
226
306
|
expect(@session).not_to have_unchecked_field('Hamster')
|
|
227
307
|
end
|
|
228
308
|
|
|
229
|
-
it
|
|
309
|
+
it 'should be true if an unchecked field is on the page' do
|
|
230
310
|
expect(@session).to have_unchecked_field('form_pets_cat')
|
|
231
311
|
expect(@session).to have_unchecked_field('Male')
|
|
232
312
|
end
|
|
233
313
|
|
|
234
|
-
it
|
|
314
|
+
it 'should be true for disabled unchecked fields if disabled: true' do
|
|
235
315
|
expect(@session).to have_unchecked_field('Disabled Unchecked Checkbox', disabled: true)
|
|
236
316
|
end
|
|
237
317
|
|
|
238
|
-
it
|
|
318
|
+
it 'should be false if no field is on the page' do
|
|
239
319
|
expect(@session).not_to have_unchecked_field('Does Not Exist')
|
|
240
320
|
end
|
|
241
321
|
|
|
242
|
-
it
|
|
322
|
+
it 'should be false for disabled unchecked fields by default' do
|
|
243
323
|
expect(@session).not_to have_unchecked_field('Disabled Unchecked Checkbox')
|
|
244
324
|
end
|
|
245
325
|
|
|
246
|
-
it
|
|
326
|
+
it 'should be false for disabled unchecked fields if disabled: false' do
|
|
247
327
|
expect(@session).not_to have_unchecked_field('Disabled Unchecked Checkbox', disabled: false)
|
|
248
328
|
end
|
|
249
329
|
|
|
250
|
-
it
|
|
330
|
+
it 'should be false after an unchecked checkbox is checked' do
|
|
251
331
|
@session.check('form_pets_cat')
|
|
252
332
|
expect(@session).not_to have_unchecked_field('form_pets_cat')
|
|
253
333
|
end
|
|
254
334
|
|
|
255
|
-
it
|
|
335
|
+
it 'should be true after a checked checkbox is unchecked' do
|
|
256
336
|
@session.uncheck('form_pets_dog')
|
|
257
337
|
expect(@session).to have_unchecked_field('form_pets_dog')
|
|
258
338
|
end
|
|
259
339
|
|
|
260
|
-
it
|
|
340
|
+
it 'should be false after an unchecked radio button is chosen' do
|
|
261
341
|
@session.choose('gender_male')
|
|
262
342
|
expect(@session).not_to have_unchecked_field('gender_male')
|
|
263
343
|
end
|
|
264
344
|
|
|
265
|
-
it
|
|
345
|
+
it 'should be true after another radio button in the group is chosen' do
|
|
266
346
|
@session.choose('gender_male')
|
|
267
347
|
expect(@session).to have_unchecked_field('gender_female')
|
|
268
348
|
end
|
|
269
349
|
|
|
270
|
-
it
|
|
271
|
-
expect(@session.has_unchecked_field?(disabled: true, id:
|
|
272
|
-
expect(@session).to have_unchecked_field(disabled: true, id:
|
|
350
|
+
it 'should support locator-less usage' do
|
|
351
|
+
expect(@session.has_unchecked_field?(disabled: true, id: 'form_disabled_unchecked_checkbox')).to be true
|
|
352
|
+
expect(@session).to have_unchecked_field(disabled: true, id: 'form_disabled_unchecked_checkbox')
|
|
273
353
|
end
|
|
274
354
|
end
|
|
275
355
|
|
|
276
356
|
Capybara::SpecHelper.spec '#has_no_unchecked_field?' do
|
|
277
357
|
before { @session.visit('/form') }
|
|
278
358
|
|
|
279
|
-
it
|
|
359
|
+
it 'should be true if a checked field is on the page' do
|
|
280
360
|
expect(@session).to have_no_unchecked_field('gender_female')
|
|
281
361
|
expect(@session).to have_no_unchecked_field('Hamster')
|
|
282
362
|
end
|
|
283
363
|
|
|
284
|
-
it
|
|
364
|
+
it 'should be false if an unchecked field is on the page' do
|
|
285
365
|
expect(@session).not_to have_no_unchecked_field('form_pets_cat')
|
|
286
366
|
expect(@session).not_to have_no_unchecked_field('Male')
|
|
287
367
|
end
|
|
288
368
|
|
|
289
|
-
it
|
|
369
|
+
it 'should be false for disabled unchecked fields if disabled: true' do
|
|
290
370
|
expect(@session).not_to have_no_unchecked_field('Disabled Unchecked Checkbox', disabled: true)
|
|
291
371
|
end
|
|
292
372
|
|
|
293
|
-
it
|
|
373
|
+
it 'should be true if no field is on the page' do
|
|
294
374
|
expect(@session).to have_no_unchecked_field('Does Not Exist')
|
|
295
375
|
end
|
|
296
376
|
|
|
297
|
-
it
|
|
377
|
+
it 'should be true for disabled unchecked fields by default' do
|
|
298
378
|
expect(@session).to have_no_unchecked_field('Disabled Unchecked Checkbox')
|
|
299
379
|
end
|
|
300
380
|
|
|
301
|
-
it
|
|
381
|
+
it 'should be true for disabled unchecked fields if disabled: false' do
|
|
302
382
|
expect(@session).to have_no_unchecked_field('Disabled Unchecked Checkbox', disabled: false)
|
|
303
383
|
end
|
|
304
384
|
|
|
305
|
-
it
|
|
306
|
-
expect(@session.has_no_unchecked_field?(disabled: false, id:
|
|
307
|
-
expect(@session).to have_no_unchecked_field(disabled: false, id:
|
|
385
|
+
it 'should support locator-less usage' do
|
|
386
|
+
expect(@session.has_no_unchecked_field?(disabled: false, id: 'form_disabled_unchecked_checkbox')).to be true
|
|
387
|
+
expect(@session).to have_no_unchecked_field(disabled: false, id: 'form_disabled_unchecked_checkbox')
|
|
308
388
|
end
|
|
309
389
|
end
|
|
@@ -1,21 +1,48 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#has_link?' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
+
it 'should be true if the given link is on the page' do
|
|
8
9
|
expect(@session).to have_link('foo')
|
|
9
10
|
expect(@session).to have_link('awesome title')
|
|
10
11
|
expect(@session).to have_link('A link', href: '/with_simple_html')
|
|
11
12
|
expect(@session).to have_link(:'A link', href: :'/with_simple_html')
|
|
12
|
-
expect(@session).to have_link('A link', href:
|
|
13
|
+
expect(@session).to have_link('A link', href: %r{/with_simple_html})
|
|
14
|
+
expect(@session).to have_link('labore', target: '_self')
|
|
13
15
|
end
|
|
14
16
|
|
|
15
|
-
it
|
|
17
|
+
it 'should be false if the given link is not on the page' do
|
|
16
18
|
expect(@session).not_to have_link('monkey')
|
|
17
19
|
expect(@session).not_to have_link('A link', href: '/nonexistent-href')
|
|
18
20
|
expect(@session).not_to have_link('A link', href: /nonexistent/)
|
|
21
|
+
expect(@session).not_to have_link('labore', target: '_blank')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it 'should notify if an invalid locator is specified' do
|
|
25
|
+
allow(Capybara::Helpers).to receive(:warn).and_return(nil)
|
|
26
|
+
@session.has_link?(@session)
|
|
27
|
+
expect(Capybara::Helpers).to have_received(:warn).with(/Called from: .+/)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'with focused:', requires: [:active_element] do
|
|
31
|
+
it 'should be true if the given link is on the page and has focus' do
|
|
32
|
+
@session.send_keys(:tab)
|
|
33
|
+
|
|
34
|
+
expect(@session).to have_link('labore', focused: true)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it 'should be false if the given link is on the page and does not have focus' do
|
|
38
|
+
expect(@session).to have_link('labore', focused: false)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'should raise an error if an invalid option is passed' do
|
|
43
|
+
expect do
|
|
44
|
+
expect(@session).to have_link('labore', invalid: true)
|
|
45
|
+
end.to raise_error(ArgumentError, 'Invalid option(s) :invalid, should be one of :above, :below, :left_of, :right_of, :near, :count, :minimum, :maximum, :between, :text, :id, :class, :style, :visible, :obscured, :exact, :exact_text, :normalize_ws, :match, :wait, :filter_set, :focused, :href, :alt, :title, :target, :download')
|
|
19
46
|
end
|
|
20
47
|
end
|
|
21
48
|
|
|
@@ -24,15 +51,29 @@ Capybara::SpecHelper.spec '#has_no_link?' do
|
|
|
24
51
|
@session.visit('/with_html')
|
|
25
52
|
end
|
|
26
53
|
|
|
27
|
-
it
|
|
54
|
+
it 'should be false if the given link is on the page' do
|
|
28
55
|
expect(@session).not_to have_no_link('foo')
|
|
29
56
|
expect(@session).not_to have_no_link('awesome title')
|
|
30
57
|
expect(@session).not_to have_no_link('A link', href: '/with_simple_html')
|
|
58
|
+
expect(@session).not_to have_no_link('labore', target: '_self')
|
|
31
59
|
end
|
|
32
60
|
|
|
33
|
-
it
|
|
61
|
+
it 'should be true if the given link is not on the page' do
|
|
34
62
|
expect(@session).to have_no_link('monkey')
|
|
35
63
|
expect(@session).to have_no_link('A link', href: '/nonexistent-href')
|
|
36
|
-
expect(@session).to have_no_link('A link', href:
|
|
64
|
+
expect(@session).to have_no_link('A link', href: %r{/nonexistent-href})
|
|
65
|
+
expect(@session).to have_no_link('labore', target: '_blank')
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
context 'with focused:', requires: [:active_element] do
|
|
69
|
+
it 'should be true if the given link is on the page and has focus' do
|
|
70
|
+
expect(@session).to have_no_link('labore', focused: true)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'should be false if the given link is on the page and does not have focus' do
|
|
74
|
+
@session.send_keys(:tab)
|
|
75
|
+
|
|
76
|
+
expect(@session).to have_no_link('labore', focused: false)
|
|
77
|
+
end
|
|
37
78
|
end
|
|
38
79
|
end
|
|
@@ -1,76 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
Capybara::SpecHelper.spec '#have_none_of_selectors' do
|
|
2
4
|
before do
|
|
3
5
|
@session.visit('/with_html')
|
|
4
6
|
end
|
|
5
7
|
|
|
6
|
-
it
|
|
7
|
-
expect
|
|
8
|
-
expect(@session).to have_none_of_selectors(:xpath,
|
|
9
|
-
|
|
10
|
-
expect
|
|
11
|
-
expect(@session).to have_none_of_selectors(:css,
|
|
12
|
-
|
|
8
|
+
it 'should be false if any of the given locators are on the page' do
|
|
9
|
+
expect do
|
|
10
|
+
expect(@session).to have_none_of_selectors(:xpath, '//p', '//a')
|
|
11
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
12
|
+
expect do
|
|
13
|
+
expect(@session).to have_none_of_selectors(:css, 'p a#foo')
|
|
14
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
13
15
|
end
|
|
14
16
|
|
|
15
|
-
it
|
|
16
|
-
expect(@session).to have_none_of_selectors(:xpath,
|
|
17
|
-
expect(@session).to have_none_of_selectors(:css,
|
|
17
|
+
it 'should be true if none of the given locators are on the page' do
|
|
18
|
+
expect(@session).to have_none_of_selectors(:xpath, '//abbr', '//td')
|
|
19
|
+
expect(@session).to have_none_of_selectors(:css, 'p a#doesnotexist', 'abbr')
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
it
|
|
22
|
+
it 'should use default selector' do
|
|
21
23
|
Capybara.default_selector = :css
|
|
22
|
-
expect(@session).to have_none_of_selectors(
|
|
23
|
-
expect
|
|
24
|
-
expect(@session).to have_none_of_selectors(
|
|
25
|
-
|
|
24
|
+
expect(@session).to have_none_of_selectors('p a#doesnotexist', 'abbr')
|
|
25
|
+
expect do
|
|
26
|
+
expect(@session).to have_none_of_selectors('abbr', 'p a#foo')
|
|
27
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
26
28
|
end
|
|
27
29
|
|
|
28
|
-
context
|
|
29
|
-
it
|
|
30
|
+
context 'should respect scopes' do
|
|
31
|
+
it 'when used with `within`' do
|
|
30
32
|
@session.within "//p[@id='first']" do
|
|
31
|
-
expect
|
|
33
|
+
expect do
|
|
32
34
|
expect(@session).to have_none_of_selectors(".//a[@id='foo']")
|
|
33
|
-
|
|
35
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
34
36
|
expect(@session).to have_none_of_selectors(".//a[@id='red']")
|
|
35
37
|
end
|
|
36
38
|
end
|
|
37
39
|
|
|
38
|
-
it
|
|
40
|
+
it 'when called on an element' do
|
|
39
41
|
el = @session.find "//p[@id='first']"
|
|
40
|
-
expect
|
|
42
|
+
expect do
|
|
41
43
|
expect(el).to have_none_of_selectors(".//a[@id='foo']")
|
|
42
|
-
|
|
44
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
43
45
|
expect(el).to have_none_of_selectors(".//a[@id='red']")
|
|
44
46
|
end
|
|
45
47
|
end
|
|
46
48
|
|
|
47
|
-
context
|
|
48
|
-
it
|
|
49
|
-
expect
|
|
50
|
-
expect(@session).to have_none_of_selectors(
|
|
51
|
-
|
|
52
|
-
expect(@session).to have_none_of_selectors(
|
|
49
|
+
context 'with options' do
|
|
50
|
+
it 'should apply the options to all locators' do
|
|
51
|
+
expect do
|
|
52
|
+
expect(@session).to have_none_of_selectors('//p//a', text: 'Redirect')
|
|
53
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
54
|
+
expect(@session).to have_none_of_selectors('//p', text: 'Doesnotexist')
|
|
53
55
|
end
|
|
54
56
|
|
|
55
|
-
it
|
|
56
|
-
expect
|
|
57
|
-
expect(@session).to have_none_of_selectors(
|
|
58
|
-
|
|
59
|
-
expect(@session).to have_none_of_selectors(
|
|
57
|
+
it 'should discard all matches where the given regexp is matched' do
|
|
58
|
+
expect do
|
|
59
|
+
expect(@session).to have_none_of_selectors('//p//a', text: /re[dab]i/i, count: 1)
|
|
60
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
61
|
+
expect(@session).to have_none_of_selectors('//p//a', text: /Red$/)
|
|
60
62
|
end
|
|
61
63
|
end
|
|
62
64
|
|
|
63
|
-
context
|
|
64
|
-
it
|
|
65
|
+
context 'with wait', requires: [:js] do
|
|
66
|
+
it 'should not find elements if they appear after given wait duration' do
|
|
65
67
|
@session.visit('/with_js')
|
|
66
68
|
@session.click_link('Click me')
|
|
67
|
-
expect(@session).to have_none_of_selectors(:css,
|
|
69
|
+
expect(@session).to have_none_of_selectors(:css, '#new_field', 'a#has-been-clicked', wait: 0.1)
|
|
68
70
|
end
|
|
69
71
|
end
|
|
70
72
|
|
|
71
|
-
it
|
|
72
|
-
expect
|
|
73
|
-
expect(@session).not_to have_none_of_selectors(:css,
|
|
74
|
-
|
|
73
|
+
it 'cannot be negated' do
|
|
74
|
+
expect do
|
|
75
|
+
expect(@session).not_to have_none_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
|
|
76
|
+
end.to raise_error ArgumentError
|
|
75
77
|
end
|
|
76
78
|
end
|