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,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#has_link?' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_html')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should be true if the given link is on the page' do
|
|
9
|
+
expect(@session).to have_link('foo')
|
|
10
|
+
expect(@session).to have_link('awesome title')
|
|
11
|
+
expect(@session).to have_link('A link', href: '/with_simple_html')
|
|
12
|
+
expect(@session).to have_link(:'A link', href: :'/with_simple_html')
|
|
13
|
+
expect(@session).to have_link('A link', href: %r{/with_simple_html})
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'should be false if the given link is not on the page' do
|
|
17
|
+
expect(@session).not_to have_link('monkey')
|
|
18
|
+
expect(@session).not_to have_link('A link', href: '/nonexistent-href')
|
|
19
|
+
expect(@session).not_to have_link('A link', href: /nonexistent/)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Capybara::SpecHelper.spec '#has_no_link?' do
|
|
24
|
+
before do
|
|
25
|
+
@session.visit('/with_html')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should be false if the given link is on the page' do
|
|
29
|
+
expect(@session).not_to have_no_link('foo')
|
|
30
|
+
expect(@session).not_to have_no_link('awesome title')
|
|
31
|
+
expect(@session).not_to have_no_link('A link', href: '/with_simple_html')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it 'should be true if the given link is not on the page' do
|
|
35
|
+
expect(@session).to have_no_link('monkey')
|
|
36
|
+
expect(@session).to have_no_link('A link', href: '/nonexistent-href')
|
|
37
|
+
expect(@session).to have_no_link('A link', href: %r{/nonexistent-href})
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#have_none_of_selectors' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_html')
|
|
6
|
+
end
|
|
7
|
+
|
|
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
|
|
15
|
+
end
|
|
16
|
+
|
|
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')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'should use default selector' do
|
|
23
|
+
Capybara.default_selector = :css
|
|
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
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'should respect scopes' do
|
|
31
|
+
it 'when used with `within`' do
|
|
32
|
+
@session.within "//p[@id='first']" do
|
|
33
|
+
expect do
|
|
34
|
+
expect(@session).to have_none_of_selectors(".//a[@id='foo']")
|
|
35
|
+
end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
|
|
36
|
+
expect(@session).to have_none_of_selectors(".//a[@id='red']")
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'when called on an element' do
|
|
41
|
+
el = @session.find "//p[@id='first']"
|
|
42
|
+
expect do
|
|
43
|
+
expect(el).to have_none_of_selectors(".//a[@id='foo']")
|
|
44
|
+
end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
|
|
45
|
+
expect(el).to have_none_of_selectors(".//a[@id='red']")
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
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')
|
|
55
|
+
end
|
|
56
|
+
|
|
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$/)
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
context 'with wait', requires: [:js] do
|
|
66
|
+
it 'should not find elements if they appear after given wait duration' do
|
|
67
|
+
@session.visit('/with_js')
|
|
68
|
+
@session.click_link('Click me')
|
|
69
|
+
expect(@session).to have_none_of_selectors(:css, '#new_field', 'a#has-been-clicked', wait: 0.1)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
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
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#has_select?' do
|
|
4
|
+
before { @session.visit('/form') }
|
|
5
|
+
|
|
6
|
+
it 'should be true if the field is on the page' do
|
|
7
|
+
expect(@session).to have_select('Locale')
|
|
8
|
+
expect(@session).to have_select('form_region')
|
|
9
|
+
expect(@session).to have_select('Languages')
|
|
10
|
+
expect(@session).to have_select(:Languages)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'should be false if the field is not on the page' do
|
|
14
|
+
expect(@session).not_to have_select('Monkey')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context 'with selected value' do
|
|
18
|
+
it 'should be true if a field with the given value is on the page' do
|
|
19
|
+
expect(@session).to have_select('form_locale', selected: 'English')
|
|
20
|
+
expect(@session).to have_select('Region', selected: 'Norway')
|
|
21
|
+
expect(@session).to have_select('Underwear', selected: [
|
|
22
|
+
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
|
23
|
+
])
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'should be false if the given field is not on the page' do
|
|
27
|
+
expect(@session).not_to have_select('Locale', selected: 'Swedish')
|
|
28
|
+
expect(@session).not_to have_select('Does not exist', selected: 'John')
|
|
29
|
+
expect(@session).not_to have_select('City', selected: 'Not there')
|
|
30
|
+
expect(@session).not_to have_select('Underwear', selected: [
|
|
31
|
+
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns', 'Nonexistent'
|
|
32
|
+
])
|
|
33
|
+
expect(@session).not_to have_select('Underwear', selected: [
|
|
34
|
+
'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
|
35
|
+
])
|
|
36
|
+
expect(@session).not_to have_select('Underwear', selected: [
|
|
37
|
+
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons"
|
|
38
|
+
])
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it 'should be true after the given value is selected' do
|
|
42
|
+
@session.select('Swedish', from: 'Locale')
|
|
43
|
+
expect(@session).to have_select('Locale', selected: 'Swedish')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'should be false after a different value is selected' do
|
|
47
|
+
@session.select('Swedish', from: 'Locale')
|
|
48
|
+
expect(@session).not_to have_select('Locale', selected: 'English')
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'should be true after the given values are selected' do
|
|
52
|
+
@session.select('Boxers', from: 'Underwear')
|
|
53
|
+
expect(@session).to have_select('Underwear', selected: [
|
|
54
|
+
'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
|
55
|
+
])
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it 'should be false after one of the values is unselected' do
|
|
59
|
+
@session.unselect('Briefs', from: 'Underwear')
|
|
60
|
+
expect(@session).not_to have_select('Underwear', selected: [
|
|
61
|
+
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
|
62
|
+
])
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should be true even when the selected option invisible, regardless of the select's visibility" do
|
|
66
|
+
expect(@session).to have_select('Icecream', visible: false, selected: 'Chocolate')
|
|
67
|
+
expect(@session).to have_select('Sorbet', selected: 'Vanilla')
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
context 'with partial select' do
|
|
72
|
+
it 'should be true if a field with the given partial values is on the page' do
|
|
73
|
+
expect(@session).to have_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'should be false if a field with the given partial values is not on the page' do
|
|
77
|
+
expect(@session).not_to have_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it 'should be true after the given partial value is selected' do
|
|
81
|
+
@session.select('Boxers', from: 'Underwear')
|
|
82
|
+
expect(@session).to have_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it 'should be false after one of the given partial values is unselected' do
|
|
86
|
+
@session.unselect('Briefs', from: 'Underwear')
|
|
87
|
+
expect(@session).not_to have_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "should be true even when the selected values are invisible, regardless of the select's visibility" do
|
|
91
|
+
expect(@session).to have_select('Dessert', visible: false, with_options: %w[Pudding Tiramisu])
|
|
92
|
+
expect(@session).to have_select('Cake', with_selected: ['Chocolate Cake', 'Sponge Cake'])
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'should support non array partial values' do
|
|
96
|
+
expect(@session).to have_select('Underwear', with_selected: 'Briefs')
|
|
97
|
+
expect(@session).not_to have_select('Underwear', with_selected: 'Boxers')
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
context 'with exact options' do
|
|
102
|
+
it 'should be true if a field with the given options is on the page' do
|
|
103
|
+
expect(@session).to have_select('Region', options: %w[Norway Sweden Finland])
|
|
104
|
+
expect(@session).to have_select('Tendency', options: [])
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'should be false if the given field is not on the page' do
|
|
108
|
+
expect(@session).not_to have_select('Locale', options: ['Swedish'])
|
|
109
|
+
expect(@session).not_to have_select('Does not exist', options: ['John'])
|
|
110
|
+
expect(@session).not_to have_select('City', options: ['London', 'Made up city'])
|
|
111
|
+
expect(@session).not_to have_select('Region', options: %w[Norway Sweden])
|
|
112
|
+
expect(@session).not_to have_select('Region', options: %w[Norway Norway Norway])
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'should be true even when the options are invisible, if the select itself is invisible' do
|
|
116
|
+
expect(@session).to have_select('Icecream', visible: false, options: %w[Chocolate Vanilla Strawberry])
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
context 'with enabled options' do
|
|
121
|
+
it 'should be true if the listed options exist and are enabled' do
|
|
122
|
+
expect(@session).to have_select('form_title', enabled_options: %w[Mr Mrs Miss])
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it 'should be false if the listed options do not exist' do
|
|
126
|
+
expect(@session).not_to have_select('form_title', enabled_options: ['Not there'])
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'should be false if the listed option exists but is not enabled' do
|
|
130
|
+
expect(@session).not_to have_select('form_title', enabled_options: %w[Mr Mrs Miss Other])
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
context 'with disabled options' do
|
|
135
|
+
it 'should be true if the listed options exist and are disabled' do
|
|
136
|
+
expect(@session).to have_select('form_title', disabled_options: ['Other'])
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
it 'should be false if the listed options do not exist' do
|
|
140
|
+
expect(@session).not_to have_select('form_title', disabled_options: ['Not there'])
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it 'should be false if the listed option exists but is not disabled' do
|
|
144
|
+
expect(@session).not_to have_select('form_title', disabled_options: %w[Other Mrs])
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
context 'with partial options' do
|
|
149
|
+
it 'should be true if a field with the given partial options is on the page' do
|
|
150
|
+
expect(@session).to have_select('Region', with_options: %w[Norway Sweden])
|
|
151
|
+
expect(@session).to have_select('City', with_options: ['London'])
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it 'should be false if a field with the given partial options is not on the page' do
|
|
155
|
+
expect(@session).not_to have_select('Locale', with_options: ['Uruguayan'])
|
|
156
|
+
expect(@session).not_to have_select('Does not exist', with_options: ['John'])
|
|
157
|
+
expect(@session).not_to have_select('Region', with_options: %w[Norway Sweden Finland Latvia])
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it 'should be true even when the options are invisible, if the select itself is invisible' do
|
|
161
|
+
expect(@session).to have_select('Icecream', visible: false, with_options: %w[Vanilla Strawberry])
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
context 'with multiple option' do
|
|
166
|
+
it 'should find multiple selects if true' do
|
|
167
|
+
expect(@session).to have_select('form_languages', multiple: true)
|
|
168
|
+
expect(@session).not_to have_select('form_other_title', multiple: true)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
it 'should not find multiple selects if false' do
|
|
172
|
+
expect(@session).not_to have_select('form_languages', multiple: false)
|
|
173
|
+
expect(@session).to have_select('form_other_title', multiple: false)
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
it 'should find both if not specified' do
|
|
177
|
+
expect(@session).to have_select('form_languages')
|
|
178
|
+
expect(@session).to have_select('form_other_title')
|
|
179
|
+
end
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it 'should support locator-less usage' do
|
|
183
|
+
expect(@session.has_select?(with_options: %w[Norway Sweden])).to eq true
|
|
184
|
+
expect(@session).to have_select(with_options: ['London'])
|
|
185
|
+
expect(@session.has_select?(with_selected: %w[Commando Boxerbriefs])).to eq true
|
|
186
|
+
expect(@session).to have_select(with_selected: ['Briefs'])
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
Capybara::SpecHelper.spec '#has_no_select?' do
|
|
191
|
+
before { @session.visit('/form') }
|
|
192
|
+
|
|
193
|
+
it 'should be false if the field is on the page' do
|
|
194
|
+
expect(@session).not_to have_no_select('Locale')
|
|
195
|
+
expect(@session).not_to have_no_select('form_region')
|
|
196
|
+
expect(@session).not_to have_no_select('Languages')
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it 'should be true if the field is not on the page' do
|
|
200
|
+
expect(@session).to have_no_select('Monkey')
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
context 'with selected value' do
|
|
204
|
+
it 'should be false if a field with the given value is on the page' do
|
|
205
|
+
expect(@session).not_to have_no_select('form_locale', selected: 'English')
|
|
206
|
+
expect(@session).not_to have_no_select('Region', selected: 'Norway')
|
|
207
|
+
expect(@session).not_to have_no_select('Underwear', selected: [
|
|
208
|
+
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
|
209
|
+
])
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
it 'should be true if the given field is not on the page' do
|
|
213
|
+
expect(@session).to have_no_select('Locale', selected: 'Swedish')
|
|
214
|
+
expect(@session).to have_no_select('Does not exist', selected: 'John')
|
|
215
|
+
expect(@session).to have_no_select('City', selected: 'Not there')
|
|
216
|
+
expect(@session).to have_no_select('Underwear', selected: [
|
|
217
|
+
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns', 'Nonexistent'
|
|
218
|
+
])
|
|
219
|
+
expect(@session).to have_no_select('Underwear', selected: [
|
|
220
|
+
'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
|
221
|
+
])
|
|
222
|
+
expect(@session).to have_no_select('Underwear', selected: [
|
|
223
|
+
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons"
|
|
224
|
+
])
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
it 'should be false after the given value is selected' do
|
|
228
|
+
@session.select('Swedish', from: 'Locale')
|
|
229
|
+
expect(@session).not_to have_no_select('Locale', selected: 'Swedish')
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it 'should be true after a different value is selected' do
|
|
233
|
+
@session.select('Swedish', from: 'Locale')
|
|
234
|
+
expect(@session).to have_no_select('Locale', selected: 'English')
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
it 'should be false after the given values are selected' do
|
|
238
|
+
@session.select('Boxers', from: 'Underwear')
|
|
239
|
+
expect(@session).not_to have_no_select('Underwear', selected: [
|
|
240
|
+
'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
|
241
|
+
])
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
it 'should be true after one of the values is unselected' do
|
|
245
|
+
@session.unselect('Briefs', from: 'Underwear')
|
|
246
|
+
expect(@session).to have_no_select('Underwear', selected: [
|
|
247
|
+
'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
|
|
248
|
+
])
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
context 'with partial select' do
|
|
253
|
+
it 'should be false if a field with the given partial values is on the page' do
|
|
254
|
+
expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
it 'should be true if a field with the given partial values is not on the page' do
|
|
258
|
+
expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
it 'should be false after the given partial value is selected' do
|
|
262
|
+
@session.select('Boxers', from: 'Underwear')
|
|
263
|
+
expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
it 'should be true after one of the given partial values is unselected' do
|
|
267
|
+
@session.unselect('Briefs', from: 'Underwear')
|
|
268
|
+
expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
it 'should support non array partial values' do
|
|
272
|
+
expect(@session).not_to have_no_select('Underwear', with_selected: 'Briefs')
|
|
273
|
+
expect(@session).to have_no_select('Underwear', with_selected: 'Boxers')
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
context 'with exact options' do
|
|
278
|
+
it 'should be false if a field with the given options is on the page' do
|
|
279
|
+
expect(@session).not_to have_no_select('Region', options: %w[Norway Sweden Finland])
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
it 'should be true if the given field is not on the page' do
|
|
283
|
+
expect(@session).to have_no_select('Locale', options: ['Swedish'])
|
|
284
|
+
expect(@session).to have_no_select('Does not exist', options: ['John'])
|
|
285
|
+
expect(@session).to have_no_select('City', options: ['London', 'Made up city'])
|
|
286
|
+
expect(@session).to have_no_select('Region', options: %w[Norway Sweden])
|
|
287
|
+
expect(@session).to have_no_select('Region', options: %w[Norway Norway Norway])
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
context 'with partial options' do
|
|
292
|
+
it 'should be false if a field with the given partial options is on the page' do
|
|
293
|
+
expect(@session).not_to have_no_select('Region', with_options: %w[Norway Sweden])
|
|
294
|
+
expect(@session).not_to have_no_select('City', with_options: ['London'])
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
it 'should be true if a field with the given partial options is not on the page' do
|
|
298
|
+
expect(@session).to have_no_select('Locale', with_options: ['Uruguayan'])
|
|
299
|
+
expect(@session).to have_no_select('Does not exist', with_options: ['John'])
|
|
300
|
+
expect(@session).to have_no_select('Region', with_options: %w[Norway Sweden Finland Latvia])
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
it 'should support locator-less usage' do
|
|
305
|
+
expect(@session.has_no_select?(with_options: %w[Norway Sweden Finland Latvia])).to eq true
|
|
306
|
+
expect(@session).to have_no_select(with_options: ['New London'])
|
|
307
|
+
expect(@session.has_no_select?(id: 'form_underwear', with_selected: ['Boxers'])).to eq true
|
|
308
|
+
expect(@session).to have_no_select(id: 'form_underwear', with_selected: %w[Commando Boxers])
|
|
309
|
+
end
|
|
310
|
+
end
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#has_selector?' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_html')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should be true if the given selector is on the page' do
|
|
9
|
+
expect(@session).to have_selector(:xpath, '//p')
|
|
10
|
+
expect(@session).to have_selector(:css, 'p a#foo')
|
|
11
|
+
expect(@session).to have_selector("//p[contains(.,'est')]")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'should be false if the given selector is not on the page' do
|
|
15
|
+
expect(@session).not_to have_selector(:xpath, '//abbr')
|
|
16
|
+
expect(@session).not_to have_selector(:css, 'p a#doesnotexist')
|
|
17
|
+
expect(@session).not_to have_selector("//p[contains(.,'thisstringisnotonpage')]")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'should use default selector' do
|
|
21
|
+
Capybara.default_selector = :css
|
|
22
|
+
expect(@session).not_to have_selector('p a#doesnotexist')
|
|
23
|
+
expect(@session).to have_selector('p a#foo')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'should respect scopes' do
|
|
27
|
+
@session.within "//p[@id='first']" do
|
|
28
|
+
expect(@session).to have_selector(".//a[@id='foo']")
|
|
29
|
+
expect(@session).not_to have_selector(".//a[@id='red']")
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'should accept a filter block' do
|
|
34
|
+
expect(@session).to have_selector(:css, 'a', count: 1) { |el| el[:id] == 'foo' }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'with count' do
|
|
38
|
+
it 'should be true if the content is on the page the given number of times' do
|
|
39
|
+
expect(@session).to have_selector('//p', count: 3)
|
|
40
|
+
expect(@session).to have_selector("//p//a[@id='foo']", count: 1)
|
|
41
|
+
expect(@session).to have_selector("//p[contains(.,'est')]", count: 1)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'should be false if the content is on the page the given number of times' do
|
|
45
|
+
expect(@session).not_to have_selector('//p', count: 6)
|
|
46
|
+
expect(@session).not_to have_selector("//p//a[@id='foo']", count: 2)
|
|
47
|
+
expect(@session).not_to have_selector("//p[contains(.,'est')]", count: 5)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should be false if the content isn't on the page at all" do
|
|
51
|
+
expect(@session).not_to have_selector('//abbr', count: 2)
|
|
52
|
+
expect(@session).not_to have_selector("//p//a[@id='doesnotexist']", count: 1)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context 'with text' do
|
|
57
|
+
it 'should discard all matches where the given string is not contained' do
|
|
58
|
+
expect(@session).to have_selector('//p//a', text: 'Redirect', count: 1)
|
|
59
|
+
expect(@session).to have_selector(:css, 'p a', text: 'Redirect', count: 1)
|
|
60
|
+
expect(@session).not_to have_selector('//p', text: 'Doesnotexist')
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should respect visibility setting' do
|
|
64
|
+
expect(@session).to have_selector(:id, 'hidden-text', text: 'Some of this text is hidden!', visible: false)
|
|
65
|
+
expect(@session).not_to have_selector(:id, 'hidden-text', text: 'Some of this text is hidden!', visible: true)
|
|
66
|
+
Capybara.ignore_hidden_elements = false
|
|
67
|
+
expect(@session).to have_selector(:id, 'hidden-text', text: 'Some of this text is hidden!', visible: false)
|
|
68
|
+
Capybara.visible_text_only = true
|
|
69
|
+
expect(@session).not_to have_selector(:id, 'hidden-text', text: 'Some of this text is hidden!', visible: true)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'should discard all matches where the given regexp is not matched' do
|
|
73
|
+
expect(@session).to have_selector('//p//a', text: /re[dab]i/i, count: 1)
|
|
74
|
+
expect(@session).not_to have_selector('//p//a', text: /Red$/)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'should raise when extra parameters passed' do
|
|
78
|
+
expect do
|
|
79
|
+
expect(@session).to have_selector(:css, 'p a#foo', 'extra')
|
|
80
|
+
end.to raise_error ArgumentError, /extra/
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context 'with whitespace normalization' do
|
|
84
|
+
context 'Capybara.default_normalize_ws = false' do
|
|
85
|
+
it 'should support normalize_ws option' do
|
|
86
|
+
Capybara.default_normalize_ws = false
|
|
87
|
+
expect(@session).not_to have_selector(:id, 'second', text: 'text with whitespace')
|
|
88
|
+
expect(@session).to have_selector(:id, 'second', text: 'text with whitespace', normalize_ws: true)
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
context 'Capybara.default_normalize_ws = true' do
|
|
93
|
+
it 'should support normalize_ws option' do
|
|
94
|
+
Capybara.default_normalize_ws = true
|
|
95
|
+
expect(@session).to have_selector(:id, 'second', text: 'text with whitespace')
|
|
96
|
+
expect(@session).not_to have_selector(:id, 'second', text: 'text with whitespace', normalize_ws: false)
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
context 'with exact_text' do
|
|
103
|
+
context 'string' do
|
|
104
|
+
it 'should only match elements that match exactly' do
|
|
105
|
+
expect(@session).to have_selector(:id, 'h2one', exact_text: 'Header Class Test One')
|
|
106
|
+
expect(@session).to have_no_selector(:id, 'h2one', exact_text: 'Header Class Test')
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
context 'boolean' do
|
|
111
|
+
it 'should only match elements that match exactly when true' do
|
|
112
|
+
expect(@session).to have_selector(:id, 'h2one', text: 'Header Class Test One', exact_text: true)
|
|
113
|
+
expect(@session).to have_no_selector(:id, 'h2one', text: 'Header Class Test', exact_text: true)
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
it 'should match substrings when false' do
|
|
117
|
+
expect(@session).to have_selector(:id, 'h2one', text: 'Header Class Test One', exact_text: false)
|
|
118
|
+
expect(@session).to have_selector(:id, 'h2one', text: 'Header Class Test', exact_text: false)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
context 'datalist' do
|
|
124
|
+
it 'should match options' do
|
|
125
|
+
@session.visit('/form')
|
|
126
|
+
expect(@session).to have_selector(:datalist_input, with_options: %w[Jaguar Audi Mercedes])
|
|
127
|
+
expect(@session).not_to have_selector(:datalist_input, with_options: %w[Ford Chevy])
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
Capybara::SpecHelper.spec '#has_no_selector?' do
|
|
133
|
+
before do
|
|
134
|
+
@session.visit('/with_html')
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it 'should be false if the given selector is on the page' do
|
|
138
|
+
expect(@session).not_to have_no_selector(:xpath, '//p')
|
|
139
|
+
expect(@session).not_to have_no_selector(:css, 'p a#foo')
|
|
140
|
+
expect(@session).not_to have_no_selector("//p[contains(.,'est')]")
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it 'should be true if the given selector is not on the page' do
|
|
144
|
+
expect(@session).to have_no_selector(:xpath, '//abbr')
|
|
145
|
+
expect(@session).to have_no_selector(:css, 'p a#doesnotexist')
|
|
146
|
+
expect(@session).to have_no_selector("//p[contains(.,'thisstringisnotonpage')]")
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it 'should use default selector' do
|
|
150
|
+
Capybara.default_selector = :css
|
|
151
|
+
expect(@session).to have_no_selector('p a#doesnotexist')
|
|
152
|
+
expect(@session).not_to have_no_selector('p a#foo')
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it 'should respect scopes' do
|
|
156
|
+
@session.within "//p[@id='first']" do
|
|
157
|
+
expect(@session).not_to have_no_selector(".//a[@id='foo']")
|
|
158
|
+
expect(@session).to have_no_selector(".//a[@id='red']")
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it 'should accept a filter block' do
|
|
163
|
+
expect(@session).to have_no_selector(:css, 'a#foo') { |el| el[:id] != 'foo' }
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
context 'with count' do
|
|
167
|
+
it 'should be false if the content is on the page the given number of times' do
|
|
168
|
+
expect(@session).not_to have_no_selector('//p', count: 3)
|
|
169
|
+
expect(@session).not_to have_no_selector("//p//a[@id='foo']", count: 1)
|
|
170
|
+
expect(@session).not_to have_no_selector("//p[contains(.,'est')]", count: 1)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it 'should be true if the content is on the page the wrong number of times' do
|
|
174
|
+
expect(@session).to have_no_selector('//p', count: 6)
|
|
175
|
+
expect(@session).to have_no_selector("//p//a[@id='foo']", count: 2)
|
|
176
|
+
expect(@session).to have_no_selector("//p[contains(.,'est')]", count: 5)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "should be true if the content isn't on the page at all" do
|
|
180
|
+
expect(@session).to have_no_selector('//abbr', count: 2)
|
|
181
|
+
expect(@session).to have_no_selector("//p//a[@id='doesnotexist']", count: 1)
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
context 'with text' do
|
|
186
|
+
it 'should discard all matches where the given string is contained' do
|
|
187
|
+
expect(@session).not_to have_no_selector('//p//a', text: 'Redirect', count: 1)
|
|
188
|
+
expect(@session).to have_no_selector('//p', text: 'Doesnotexist')
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it 'should discard all matches where the given regexp is matched' do
|
|
192
|
+
expect(@session).not_to have_no_selector('//p//a', text: /re[dab]i/i, count: 1)
|
|
193
|
+
expect(@session).to have_no_selector('//p//a', text: /Red$/)
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
it 'should error when matching element exists' do
|
|
197
|
+
expect do
|
|
198
|
+
expect(@session).to have_no_selector('//h2', text: 'Header Class Test Five')
|
|
199
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|