capybara 3.0.0 → 3.36.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 +777 -10
- data/License.txt +1 -1
- data/README.md +75 -58
- data/lib/capybara/config.rb +29 -10
- data/lib/capybara/cucumber.rb +1 -1
- data/lib/capybara/driver/base.rb +22 -4
- data/lib/capybara/driver/node.rb +34 -9
- data/lib/capybara/dsl.rb +14 -6
- data/lib/capybara/helpers.rb +52 -7
- data/lib/capybara/minitest/spec.rb +173 -84
- data/lib/capybara/minitest.rb +250 -144
- data/lib/capybara/node/actions.rb +248 -124
- data/lib/capybara/node/base.rb +34 -20
- data/lib/capybara/node/document.rb +14 -2
- data/lib/capybara/node/document_matchers.rb +13 -15
- data/lib/capybara/node/element.rb +339 -113
- data/lib/capybara/node/finders.rb +95 -82
- data/lib/capybara/node/matchers.rb +338 -157
- data/lib/capybara/node/simple.rb +54 -15
- data/lib/capybara/queries/active_element_query.rb +18 -0
- data/lib/capybara/queries/ancestor_query.rb +9 -10
- data/lib/capybara/queries/base_query.rb +25 -18
- data/lib/capybara/queries/current_path_query.rb +16 -6
- data/lib/capybara/queries/match_query.rb +11 -0
- data/lib/capybara/queries/selector_query.rb +600 -103
- data/lib/capybara/queries/sibling_query.rb +9 -7
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +40 -22
- data/lib/capybara/queries/title_query.rb +2 -2
- data/lib/capybara/rack_test/browser.rb +47 -28
- data/lib/capybara/rack_test/driver.rb +12 -3
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +53 -50
- data/lib/capybara/rack_test/node.rb +114 -37
- data/lib/capybara/rails.rb +1 -1
- data/lib/capybara/registration_container.rb +44 -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 +45 -0
- data/lib/capybara/result.rb +86 -52
- data/lib/capybara/rspec/features.rb +8 -10
- data/lib/capybara/rspec/matcher_proxies.rb +39 -18
- 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 +43 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/rspec/matchers.rb +138 -316
- data/lib/capybara/rspec.rb +3 -2
- 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 +89 -12
- 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 +54 -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 +279 -0
- data/lib/capybara/selector/filter.rb +1 -0
- data/lib/capybara/selector/filter_set.rb +72 -27
- data/lib/capybara/selector/filters/base.rb +45 -2
- data/lib/capybara/selector/filters/expression_filter.rb +5 -6
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +18 -4
- data/lib/capybara/selector/regexp_disassembler.rb +214 -0
- data/lib/capybara/selector/selector.rb +85 -200
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +226 -537
- 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 +296 -238
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -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 +76 -0
- data/lib/capybara/selenium/logger_suppressor.rb +40 -0
- data/lib/capybara/selenium/node.rb +436 -166
- data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +104 -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/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 +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 +69 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +71 -0
- data/lib/capybara/server.rb +58 -67
- data/lib/capybara/session/config.rb +38 -6
- data/lib/capybara/session/matchers.rb +26 -19
- data/lib/capybara/session.rb +258 -190
- 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 +122 -8
- data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
- data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +135 -42
- data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
- data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
- 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.rb → assert_text_spec.rb} +62 -38
- data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +120 -72
- data/lib/capybara/spec/session/body_spec.rb +11 -13
- data/lib/capybara/spec/session/check_spec.rb +111 -51
- data/lib/capybara/spec/session/choose_spec.rb +62 -30
- data/lib/capybara/spec/session/click_button_spec.rb +227 -161
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
- data/lib/capybara/spec/session/click_link_spec.rb +78 -55
- data/lib/capybara/spec/session/current_scope_spec.rb +7 -7
- data/lib/capybara/spec/session/current_url_spec.rb +44 -37
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -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 +8 -6
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
- data/lib/capybara/spec/session/fill_in_spec.rb +104 -44
- data/lib/capybara/spec/session/find_button_spec.rb +23 -23
- data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
- data/lib/capybara/spec/session/find_field_spec.rb +33 -31
- data/lib/capybara/spec/session/find_link_spec.rb +32 -14
- data/lib/capybara/spec/session/find_spec.rb +236 -141
- data/lib/capybara/spec/session/first_spec.rb +44 -43
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +44 -19
- data/lib/capybara/spec/session/go_back_spec.rb +1 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +18 -18
- 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 +92 -12
- data/lib/capybara/spec/session/has_css_spec.rb +271 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +48 -33
- data/lib/capybara/spec/session/has_field_spec.rb +137 -58
- data/lib/capybara/spec/session/has_link_spec.rb +30 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +26 -24
- data/lib/capybara/spec/session/has_select_spec.rb +75 -47
- data/lib/capybara/spec/session/has_selector_spec.rb +102 -69
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +170 -4
- data/lib/capybara/spec/session/has_text_spec.rb +108 -52
- data/lib/capybara/spec/session/has_title_spec.rb +19 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
- data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +1 -1
- data/lib/capybara/spec/session/html_spec.rb +13 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +871 -122
- data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
- data/lib/capybara/spec/session/refresh_spec.rb +9 -7
- data/lib/capybara/spec/session/reset_session_spec.rb +52 -37
- data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +1 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +5 -4
- data/lib/capybara/spec/session/save_page_spec.rb +41 -38
- data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +117 -0
- data/lib/capybara/spec/session/select_spec.rb +102 -76
- data/lib/capybara/spec/session/selectors_spec.rb +51 -18
- data/lib/capybara/spec/session/sibling_spec.rb +9 -9
- data/lib/capybara/spec/session/text_spec.rb +26 -24
- data/lib/capybara/spec/session/title_spec.rb +8 -6
- data/lib/capybara/spec/session/uncheck_spec.rb +40 -21
- data/lib/capybara/spec/session/unselect_spec.rb +37 -37
- data/lib/capybara/spec/session/visit_spec.rb +59 -53
- data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
- data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
- data/lib/capybara/spec/session/window/window_spec.rb +88 -54
- data/lib/capybara/spec/session/window/windows_spec.rb +10 -7
- data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
- data/lib/capybara/spec/session/within_spec.rb +69 -44
- data/lib/capybara/spec/spec_helper.rb +41 -53
- data/lib/capybara/spec/test_app.rb +79 -40
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +134 -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 +43 -10
- 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_other.erb +6 -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 +1 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +31 -25
- data/lib/capybara.rb +120 -100
- data/spec/basic_node_spec.rb +59 -34
- data/spec/capybara_spec.rb +54 -52
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +80 -53
- data/spec/filter_set_spec.rb +24 -7
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
- data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
- data/spec/minitest_spec.rb +38 -5
- data/spec/minitest_spec_spec.rb +88 -62
- data/spec/per_session_config_spec.rb +5 -5
- data/spec/rack_test_spec.rb +169 -115
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +86 -33
- data/spec/rspec/features_spec.rb +26 -23
- data/spec/rspec/scenarios_spec.rb +8 -4
- data/spec/rspec/shared_spec_matchers.rb +393 -363
- data/spec/rspec/views_spec.rb +4 -3
- data/spec/rspec_matchers_spec.rb +10 -10
- data/spec/rspec_spec.rb +109 -85
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +391 -61
- data/spec/selenium_spec_chrome.rb +180 -41
- data/spec/selenium_spec_chrome_remote.rb +101 -0
- data/spec/selenium_spec_edge.rb +28 -8
- data/spec/selenium_spec_firefox.rb +211 -0
- data/spec/selenium_spec_firefox_remote.rb +80 -0
- data/spec/selenium_spec_ie.rb +127 -11
- data/spec/selenium_spec_safari.rb +156 -0
- data/spec/server_spec.rb +177 -78
- data/spec/session_spec.rb +52 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +455 -123
- data/spec/spec_helper.rb +91 -2
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +343 -42
- 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/rspec/compound.rb +0 -90
- data/lib/capybara/spec/session/assert_selector.rb +0 -149
- 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 -143
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
Capybara::SpecHelper.spec '#has_text?' do
|
|
4
|
-
it
|
|
4
|
+
it 'should be true if the given text is on the page at least once' do
|
|
5
5
|
@session.visit('/with_html')
|
|
6
6
|
expect(@session).to have_text('est')
|
|
7
7
|
expect(@session).to have_text('Lorem')
|
|
@@ -9,32 +9,51 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
|
9
9
|
expect(@session).to have_text(:Redirect)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
it
|
|
12
|
+
it 'should be true if scoped to an element which has the text' do
|
|
13
13
|
@session.visit('/with_html')
|
|
14
14
|
@session.within("//a[@title='awesome title']") do
|
|
15
15
|
expect(@session).to have_text('labore')
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
it
|
|
19
|
+
it 'should be false if scoped to an element which does not have the text' do
|
|
20
20
|
@session.visit('/with_html')
|
|
21
21
|
@session.within("//a[@title='awesome title']") do
|
|
22
22
|
expect(@session).not_to have_text('monkey')
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
it
|
|
26
|
+
it 'should ignore tags' do
|
|
27
27
|
@session.visit('/with_html')
|
|
28
28
|
expect(@session).not_to have_text('exercitation <a href="/foo" id="foo">ullamco</a> laboris')
|
|
29
29
|
expect(@session).to have_text('exercitation ullamco laboris')
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
it
|
|
32
|
+
it 'should search correctly normalized text' do
|
|
33
33
|
@session.visit('/with_html')
|
|
34
34
|
expect(@session).to have_text('text with whitespace')
|
|
35
35
|
end
|
|
36
36
|
|
|
37
|
-
it
|
|
37
|
+
it 'should search whitespace collapsed text' do
|
|
38
|
+
@session.visit('/with_html')
|
|
39
|
+
expect(@session).to have_text('text with whitespace', normalize_ws: true)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
context 'with enabled default collapsing whitespace' do
|
|
43
|
+
before { Capybara.default_normalize_ws = true }
|
|
44
|
+
|
|
45
|
+
it 'should search unnormalized text' do
|
|
46
|
+
@session.visit('/with_html')
|
|
47
|
+
expect(@session).to have_text('text with whitespace', normalize_ws: false)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'should search whitespace collapsed text' do
|
|
51
|
+
@session.visit('/with_html')
|
|
52
|
+
expect(@session).to have_text('text with whitespace')
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'should be false if the given text is not on the page' do
|
|
38
57
|
@session.visit('/with_html')
|
|
39
58
|
expect(@session).not_to have_text('xxxxyzzz')
|
|
40
59
|
expect(@session).not_to have_text('monkey')
|
|
@@ -66,23 +85,23 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
|
66
85
|
expect(@session).not_to have_text('aVar')
|
|
67
86
|
end
|
|
68
87
|
|
|
69
|
-
it
|
|
88
|
+
it 'should be false if the given text is on the page but not visible' do
|
|
70
89
|
@session.visit('/with_html')
|
|
71
90
|
expect(@session).not_to have_text('Inside element with hidden ancestor')
|
|
72
91
|
end
|
|
73
92
|
|
|
74
|
-
it
|
|
93
|
+
it 'should be true if :all given and text is invisible.' do
|
|
75
94
|
@session.visit('/with_html')
|
|
76
95
|
expect(@session).to have_text(:all, 'Some of this text is hidden!')
|
|
77
96
|
end
|
|
78
97
|
|
|
79
|
-
it
|
|
98
|
+
it 'should be true if `Capybara.ignore_hidden_elements = false` and text is invisible.' do
|
|
80
99
|
Capybara.ignore_hidden_elements = false
|
|
81
100
|
@session.visit('/with_html')
|
|
82
101
|
expect(@session).to have_text('Some of this text is hidden!')
|
|
83
102
|
end
|
|
84
103
|
|
|
85
|
-
it
|
|
104
|
+
it 'should be true if the text in the page matches given regexp' do
|
|
86
105
|
@session.visit('/with_html')
|
|
87
106
|
expect(@session).to have_text(/Lorem/)
|
|
88
107
|
end
|
|
@@ -92,50 +111,80 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
|
92
111
|
expect(@session).not_to have_text(/xxxxyzzz/)
|
|
93
112
|
end
|
|
94
113
|
|
|
95
|
-
context
|
|
96
|
-
it
|
|
114
|
+
context 'with object implementing to_s and to_hash' do
|
|
115
|
+
it 'should work if the object is passed alone' do
|
|
116
|
+
with_to_hash = Class.new do
|
|
117
|
+
def to_s; '42' end
|
|
118
|
+
def to_hash; { value: 'Other hash' } end
|
|
119
|
+
end.new
|
|
97
120
|
@session.visit('/with_html')
|
|
98
|
-
expect(@session
|
|
121
|
+
expect(@session).to have_text(with_to_hash)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it 'should work if passed with empty options' do
|
|
125
|
+
with_to_hash = Class.new do
|
|
126
|
+
def to_s; '42' end
|
|
127
|
+
def to_hash; { value: 'Other hash' } end
|
|
128
|
+
end.new
|
|
129
|
+
@session.visit('/with_html')
|
|
130
|
+
if RUBY_VERSION >= '2.7'
|
|
131
|
+
expect(@session).to have_text(:visible, with_to_hash, **{})
|
|
132
|
+
else
|
|
133
|
+
expect(@session).to have_text(:visible, with_to_hash, {})
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
context 'with exact: true option' do
|
|
139
|
+
it 'should be true if text matches exactly' do
|
|
140
|
+
@session.visit('/with_html')
|
|
141
|
+
expect(@session.find(:id, 'h2one')).to have_text('Header Class Test One', exact: true)
|
|
99
142
|
end
|
|
100
143
|
|
|
101
144
|
it "should be false if text doesn't match exactly" do
|
|
102
145
|
@session.visit('/with_html')
|
|
103
|
-
expect(@session.find(:id,
|
|
146
|
+
expect(@session.find(:id, 'h2one')).not_to have_text('Header Class Test On', exact: true)
|
|
104
147
|
end
|
|
105
148
|
end
|
|
106
149
|
|
|
107
|
-
it
|
|
150
|
+
it 'should escape any characters that would have special meaning in a regexp' do
|
|
108
151
|
@session.visit('/with_html')
|
|
109
152
|
expect(@session).not_to have_text('.orem')
|
|
110
153
|
end
|
|
111
154
|
|
|
112
|
-
it
|
|
155
|
+
it 'should accept non-string parameters' do
|
|
113
156
|
@session.visit('/with_html')
|
|
114
157
|
expect(@session).to have_text(42)
|
|
115
158
|
end
|
|
116
159
|
|
|
117
|
-
it
|
|
160
|
+
it 'should be true when passed nil' do
|
|
118
161
|
# nil is converted to '' when to_s is invoked
|
|
119
162
|
@session.visit('/with_html')
|
|
120
163
|
expect(@session).to have_text(nil)
|
|
121
164
|
end
|
|
122
165
|
|
|
123
|
-
it
|
|
166
|
+
it 'should warn when passed nil' do
|
|
167
|
+
@session.visit('/with_html')
|
|
168
|
+
expect_any_instance_of(Kernel).to receive(:warn).with(/Checking for expected text of nil is confusing/) # rubocop:disable RSpec/AnyInstance
|
|
169
|
+
expect(@session).to have_text(nil)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it 'should wait for text to appear', requires: [:js] do
|
|
124
173
|
Capybara.using_wait_time(3) do
|
|
125
174
|
@session.visit('/with_js')
|
|
126
175
|
@session.click_link('Click me')
|
|
127
|
-
expect(@session).to have_text(
|
|
176
|
+
expect(@session).to have_text('Has been clicked')
|
|
128
177
|
end
|
|
129
178
|
end
|
|
130
179
|
|
|
131
|
-
context
|
|
132
|
-
it
|
|
180
|
+
context 'with between' do
|
|
181
|
+
it 'should be true if the text occurs within the range given' do
|
|
133
182
|
@session.visit('/with_count')
|
|
134
183
|
expect(@session).to have_text('count', between: 1..3)
|
|
135
184
|
expect(@session).to have_text(/count/, between: 2..2)
|
|
136
185
|
end
|
|
137
186
|
|
|
138
|
-
it
|
|
187
|
+
it 'should be false if the text occurs more or fewer times than range' do
|
|
139
188
|
@session.visit('/with_count')
|
|
140
189
|
expect(@session).not_to have_text('count', between: 0..1)
|
|
141
190
|
expect(@session).not_to have_text('count', between: 3..10)
|
|
@@ -143,76 +192,82 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
|
143
192
|
end
|
|
144
193
|
end
|
|
145
194
|
|
|
146
|
-
context
|
|
147
|
-
it
|
|
195
|
+
context 'with count' do
|
|
196
|
+
it 'should be true if the text occurs the given number of times' do
|
|
148
197
|
@session.visit('/with_count')
|
|
149
198
|
expect(@session).to have_text('count', count: 2)
|
|
199
|
+
expect(@session).to have_text('count').exactly(2).times
|
|
150
200
|
end
|
|
151
201
|
|
|
152
|
-
it
|
|
202
|
+
it 'should be false if the text occurs a different number of times than the given' do
|
|
153
203
|
@session.visit('/with_count')
|
|
154
204
|
expect(@session).not_to have_text('count', count: 0)
|
|
155
205
|
expect(@session).not_to have_text('count', count: 1)
|
|
206
|
+
expect(@session).not_to have_text('count').once
|
|
156
207
|
expect(@session).not_to have_text(/count/, count: 3)
|
|
157
208
|
end
|
|
158
209
|
|
|
159
|
-
it
|
|
210
|
+
it 'should coerce count to an integer' do
|
|
160
211
|
@session.visit('/with_count')
|
|
161
212
|
expect(@session).to have_text('count', count: '2')
|
|
162
213
|
expect(@session).not_to have_text('count', count: '3')
|
|
163
214
|
end
|
|
164
215
|
end
|
|
165
216
|
|
|
166
|
-
context
|
|
167
|
-
it
|
|
217
|
+
context 'with maximum' do
|
|
218
|
+
it 'should be true when text occurs same or fewer times than given' do
|
|
168
219
|
@session.visit('/with_count')
|
|
169
220
|
expect(@session).to have_text('count', maximum: 2)
|
|
221
|
+
expect(@session).to have_text('count').at_most(2).times
|
|
170
222
|
expect(@session).to have_text(/count/, maximum: 3)
|
|
171
223
|
end
|
|
172
224
|
|
|
173
|
-
it
|
|
225
|
+
it 'should be false when text occurs more times than given' do
|
|
174
226
|
@session.visit('/with_count')
|
|
175
227
|
expect(@session).not_to have_text('count', maximum: 1)
|
|
228
|
+
expect(@session).not_to have_text('count').at_most(1).times
|
|
176
229
|
expect(@session).not_to have_text('count', maximum: 0)
|
|
177
230
|
end
|
|
178
231
|
|
|
179
|
-
it
|
|
232
|
+
it 'should coerce maximum to an integer' do
|
|
180
233
|
@session.visit('/with_count')
|
|
181
234
|
expect(@session).to have_text('count', maximum: '2')
|
|
182
235
|
expect(@session).not_to have_text('count', maximum: '1')
|
|
183
236
|
end
|
|
184
237
|
end
|
|
185
238
|
|
|
186
|
-
context
|
|
187
|
-
it
|
|
239
|
+
context 'with minimum' do
|
|
240
|
+
it 'should be true when text occurs same or more times than given' do
|
|
188
241
|
@session.visit('/with_count')
|
|
189
242
|
expect(@session).to have_text('count', minimum: 2)
|
|
243
|
+
expect(@session).to have_text('count').at_least(2).times
|
|
190
244
|
expect(@session).to have_text(/count/, minimum: 0)
|
|
191
245
|
end
|
|
192
246
|
|
|
193
|
-
it
|
|
247
|
+
it 'should be false when text occurs fewer times than given' do
|
|
194
248
|
@session.visit('/with_count')
|
|
195
249
|
expect(@session).not_to have_text('count', minimum: 3)
|
|
250
|
+
expect(@session).not_to have_text('count').at_least(3).times
|
|
196
251
|
end
|
|
197
252
|
|
|
198
|
-
it
|
|
253
|
+
it 'should coerce minimum to an integer' do
|
|
199
254
|
@session.visit('/with_count')
|
|
200
255
|
expect(@session).to have_text('count', minimum: '2')
|
|
201
256
|
expect(@session).not_to have_text('count', minimum: '3')
|
|
202
257
|
end
|
|
203
258
|
end
|
|
204
259
|
|
|
205
|
-
context
|
|
206
|
-
it
|
|
260
|
+
context 'with wait', requires: [:js] do
|
|
261
|
+
it 'should find element if it appears before given wait duration' do
|
|
207
262
|
Capybara.using_wait_time(0.1) do
|
|
208
263
|
@session.visit('/with_js')
|
|
209
264
|
@session.click_link('Click me')
|
|
210
|
-
expect(@session).to have_text('Has been clicked', wait:
|
|
265
|
+
expect(@session).to have_text('Has been clicked', wait: 3)
|
|
211
266
|
end
|
|
212
267
|
end
|
|
213
268
|
end
|
|
214
269
|
|
|
215
|
-
it
|
|
270
|
+
it 'should raise an error if an invalid option is passed' do
|
|
216
271
|
@session.visit('/with_html')
|
|
217
272
|
expect do
|
|
218
273
|
expect(@session).to have_text('Lorem', invalid: true)
|
|
@@ -221,34 +276,34 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
|
221
276
|
end
|
|
222
277
|
|
|
223
278
|
Capybara::SpecHelper.spec '#has_no_text?' do
|
|
224
|
-
it
|
|
279
|
+
it 'should be false if the given text is on the page at least once' do
|
|
225
280
|
@session.visit('/with_html')
|
|
226
281
|
expect(@session).not_to have_no_text('est')
|
|
227
282
|
expect(@session).not_to have_no_text('Lorem')
|
|
228
283
|
expect(@session).not_to have_no_text('Redirect')
|
|
229
284
|
end
|
|
230
285
|
|
|
231
|
-
it
|
|
286
|
+
it 'should be false if scoped to an element which has the text' do
|
|
232
287
|
@session.visit('/with_html')
|
|
233
288
|
@session.within("//a[@title='awesome title']") do
|
|
234
289
|
expect(@session).not_to have_no_text('labore')
|
|
235
290
|
end
|
|
236
291
|
end
|
|
237
292
|
|
|
238
|
-
it
|
|
293
|
+
it 'should be true if scoped to an element which does not have the text' do
|
|
239
294
|
@session.visit('/with_html')
|
|
240
295
|
@session.within("//a[@title='awesome title']") do
|
|
241
296
|
expect(@session).to have_no_text('monkey')
|
|
242
297
|
end
|
|
243
298
|
end
|
|
244
299
|
|
|
245
|
-
it
|
|
300
|
+
it 'should ignore tags' do
|
|
246
301
|
@session.visit('/with_html')
|
|
247
302
|
expect(@session).to have_no_text('exercitation <a href="/foo" id="foo">ullamco</a> laboris')
|
|
248
303
|
expect(@session).not_to have_no_text('exercitation ullamco laboris')
|
|
249
304
|
end
|
|
250
305
|
|
|
251
|
-
it
|
|
306
|
+
it 'should be true if the given text is not on the page' do
|
|
252
307
|
@session.visit('/with_html')
|
|
253
308
|
expect(@session).to have_no_text('xxxxyzzz')
|
|
254
309
|
expect(@session).to have_no_text('monkey')
|
|
@@ -280,17 +335,17 @@ Capybara::SpecHelper.spec '#has_no_text?' do
|
|
|
280
335
|
expect(@session).to have_no_text('aVar')
|
|
281
336
|
end
|
|
282
337
|
|
|
283
|
-
it
|
|
338
|
+
it 'should be true if the given text is on the page but not visible' do
|
|
284
339
|
@session.visit('/with_html')
|
|
285
340
|
expect(@session).to have_no_text('Inside element with hidden ancestor')
|
|
286
341
|
end
|
|
287
342
|
|
|
288
|
-
it
|
|
343
|
+
it 'should be false if :all given and text is invisible.' do
|
|
289
344
|
@session.visit('/with_html')
|
|
290
345
|
expect(@session).not_to have_no_text(:all, 'Some of this text is hidden!')
|
|
291
346
|
end
|
|
292
347
|
|
|
293
|
-
it
|
|
348
|
+
it 'should be false if `Capybara.ignore_hidden_elements = false` and text is invisible.' do
|
|
294
349
|
Capybara.ignore_hidden_elements = false
|
|
295
350
|
@session.visit('/with_html')
|
|
296
351
|
expect(@session).not_to have_no_text('Some of this text is hidden!')
|
|
@@ -301,24 +356,25 @@ Capybara::SpecHelper.spec '#has_no_text?' do
|
|
|
301
356
|
expect(@session).to have_no_text(/xxxxyzzz/)
|
|
302
357
|
end
|
|
303
358
|
|
|
304
|
-
it
|
|
359
|
+
it 'should be false if the text in the page matches given regexp' do
|
|
305
360
|
@session.visit('/with_html')
|
|
306
361
|
expect(@session).not_to have_no_text(/Lorem/)
|
|
307
362
|
end
|
|
308
363
|
|
|
309
|
-
it
|
|
364
|
+
it 'should escape any characters that would have special meaning in a regexp' do
|
|
310
365
|
@session.visit('/with_html')
|
|
311
366
|
expect(@session).to have_no_text('.orem')
|
|
312
367
|
end
|
|
313
368
|
|
|
314
|
-
it
|
|
369
|
+
it 'should wait for text to disappear', requires: [:js] do
|
|
370
|
+
Capybara.default_max_wait_time = 2
|
|
315
371
|
@session.visit('/with_js')
|
|
316
372
|
@session.click_link('Click me')
|
|
317
|
-
expect(@session).to have_no_text(
|
|
373
|
+
expect(@session).to have_no_text('I changed it')
|
|
318
374
|
end
|
|
319
375
|
|
|
320
|
-
context
|
|
321
|
-
it
|
|
376
|
+
context 'with wait', requires: [:js] do
|
|
377
|
+
it 'should not find element if it appears after given wait duration' do
|
|
322
378
|
@session.visit('/with_js')
|
|
323
379
|
@session.click_link('Click me')
|
|
324
380
|
expect(@session).to have_no_text('Has been clicked', wait: 0.05)
|
|
@@ -5,35 +5,39 @@ Capybara::SpecHelper.spec '#has_title?' do
|
|
|
5
5
|
@session.visit('/with_js')
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
it
|
|
8
|
+
it 'should be true if the page has the given title' do
|
|
9
9
|
expect(@session).to have_title('with_js')
|
|
10
|
+
expect(@session.has_title?('with_js')).to be true
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
it
|
|
13
|
+
it 'should allow regexp matches' do
|
|
13
14
|
expect(@session).to have_title(/w[a-z]{3}_js/)
|
|
14
15
|
expect(@session).not_to have_title(/monkey/)
|
|
15
16
|
end
|
|
16
17
|
|
|
17
|
-
it
|
|
18
|
-
@session.click_link(
|
|
19
|
-
expect(@session).to have_title(
|
|
18
|
+
it 'should wait for title', requires: [:js] do
|
|
19
|
+
@session.click_link('Change title')
|
|
20
|
+
expect(@session).to have_title('changed title')
|
|
20
21
|
end
|
|
21
22
|
|
|
22
|
-
it
|
|
23
|
+
it 'should be false if the page has not the given title' do
|
|
23
24
|
expect(@session).not_to have_title('monkey')
|
|
25
|
+
expect(@session.has_title?('monkey')).to be false
|
|
24
26
|
end
|
|
25
27
|
|
|
26
|
-
it
|
|
28
|
+
it 'should default to exact: false matching' do
|
|
27
29
|
expect(@session).to have_title('with_js', exact: false)
|
|
28
30
|
expect(@session).to have_title('with_', exact: false)
|
|
29
31
|
end
|
|
30
32
|
|
|
31
|
-
it
|
|
33
|
+
it 'should match exactly if exact: true option passed' do
|
|
32
34
|
expect(@session).to have_title('with_js', exact: true)
|
|
33
35
|
expect(@session).not_to have_title('with_', exact: true)
|
|
36
|
+
expect(@session.has_title?('with_js', exact: true)).to be true
|
|
37
|
+
expect(@session.has_title?('with_', exact: true)).to be false
|
|
34
38
|
end
|
|
35
39
|
|
|
36
|
-
it
|
|
40
|
+
it 'should match partial if exact: false option passed' do
|
|
37
41
|
expect(@session).to have_title('with_js', exact: false)
|
|
38
42
|
expect(@session).to have_title('with_', exact: false)
|
|
39
43
|
end
|
|
@@ -44,23 +48,24 @@ Capybara::SpecHelper.spec '#has_no_title?' do
|
|
|
44
48
|
@session.visit('/with_js')
|
|
45
49
|
end
|
|
46
50
|
|
|
47
|
-
it
|
|
51
|
+
it 'should be false if the page has the given title' do
|
|
48
52
|
expect(@session).not_to have_no_title('with_js')
|
|
49
53
|
end
|
|
50
54
|
|
|
51
|
-
it
|
|
55
|
+
it 'should allow regexp matches' do
|
|
52
56
|
expect(@session).not_to have_no_title(/w[a-z]{3}_js/)
|
|
53
57
|
expect(@session).to have_no_title(/monkey/)
|
|
54
58
|
end
|
|
55
59
|
|
|
56
|
-
it
|
|
60
|
+
it 'should wait for title to disappear', requires: [:js] do
|
|
57
61
|
Capybara.using_wait_time(5) do
|
|
58
|
-
@session.click_link(
|
|
62
|
+
@session.click_link('Change title') # triggers title change after 400ms
|
|
59
63
|
expect(@session).to have_no_title('with_js')
|
|
60
64
|
end
|
|
61
65
|
end
|
|
62
66
|
|
|
63
|
-
it
|
|
67
|
+
it 'should be true if the page has not the given title' do
|
|
64
68
|
expect(@session).to have_no_title('monkey')
|
|
69
|
+
expect(@session.has_no_title?('monkey')).to be true
|
|
65
70
|
end
|
|
66
71
|
end
|
|
@@ -5,31 +5,45 @@ Capybara::SpecHelper.spec '#has_xpath?' do
|
|
|
5
5
|
@session.visit('/with_html')
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
it
|
|
9
|
-
expect(@session).to have_xpath(
|
|
8
|
+
it 'should be true if the given selector is on the page' do
|
|
9
|
+
expect(@session).to have_xpath('//p')
|
|
10
10
|
expect(@session).to have_xpath("//p//a[@id='foo']")
|
|
11
11
|
expect(@session).to have_xpath("//p[contains(.,'est')]")
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
it
|
|
15
|
-
expect(@session).
|
|
14
|
+
it 'should support :id option' do
|
|
15
|
+
expect(@session).to have_xpath('//h2', id: 'h2one')
|
|
16
|
+
expect(@session).to have_xpath('//h2')
|
|
17
|
+
expect(@session).to have_xpath('//h2', id: /h2o/)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'should support :class option' do
|
|
21
|
+
expect(@session).to have_xpath('//li', class: 'guitarist')
|
|
22
|
+
expect(@session).to have_xpath('//li', class: /guitar/)
|
|
23
|
+
expect(@session).to have_xpath('//li', class: /guitar|drummer/)
|
|
24
|
+
expect(@session).to have_xpath('//li', class: %w[beatle guitarist])
|
|
25
|
+
expect(@session).to have_xpath('//li', class: /.*/)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should be false if the given selector is not on the page' do
|
|
29
|
+
expect(@session).not_to have_xpath('//abbr')
|
|
16
30
|
expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
|
|
17
31
|
expect(@session).not_to have_xpath("//p[contains(.,'thisstringisnotonpage')]")
|
|
18
32
|
end
|
|
19
33
|
|
|
20
|
-
it
|
|
34
|
+
it 'should use xpath even if default selector is CSS' do
|
|
21
35
|
Capybara.default_selector = :css
|
|
22
36
|
expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
|
|
23
37
|
end
|
|
24
38
|
|
|
25
|
-
it
|
|
39
|
+
it 'should respect scopes' do
|
|
26
40
|
@session.within "//p[@id='first']" do
|
|
27
41
|
expect(@session).to have_xpath(".//a[@id='foo']")
|
|
28
42
|
expect(@session).not_to have_xpath(".//a[@id='red']")
|
|
29
43
|
end
|
|
30
44
|
end
|
|
31
45
|
|
|
32
|
-
it
|
|
46
|
+
it 'should wait for content to appear', requires: [:js] do
|
|
33
47
|
Capybara.using_wait_time(3) do
|
|
34
48
|
@session.visit('/with_js')
|
|
35
49
|
@session.click_link('Click me') # updates page after 500ms
|
|
@@ -37,31 +51,34 @@ Capybara::SpecHelper.spec '#has_xpath?' do
|
|
|
37
51
|
end
|
|
38
52
|
end
|
|
39
53
|
|
|
40
|
-
context
|
|
41
|
-
it
|
|
42
|
-
expect(@session).to have_xpath(
|
|
54
|
+
context 'with count' do
|
|
55
|
+
it 'should be true if the content occurs the given number of times' do
|
|
56
|
+
expect(@session).to have_xpath('//p', count: 3)
|
|
43
57
|
expect(@session).to have_xpath("//p//a[@id='foo']", count: 1)
|
|
44
58
|
expect(@session).to have_xpath("//p[contains(.,'est')]", count: 1)
|
|
45
59
|
expect(@session).to have_xpath("//p//a[@id='doesnotexist']", count: 0)
|
|
60
|
+
expect(@session).to have_xpath('//li', class: /guitar|drummer/, count: 4)
|
|
61
|
+
expect(@session).to have_xpath('//li', id: /john|paul/, class: /guitar|drummer/, count: 2)
|
|
62
|
+
expect(@session).to have_xpath('//li', class: %w[beatle guitarist], count: 2)
|
|
46
63
|
end
|
|
47
64
|
|
|
48
|
-
it
|
|
49
|
-
expect(@session).not_to have_xpath(
|
|
65
|
+
it 'should be false if the content occurs a different number of times than the given' do
|
|
66
|
+
expect(@session).not_to have_xpath('//p', count: 6)
|
|
50
67
|
expect(@session).not_to have_xpath("//p//a[@id='foo']", count: 2)
|
|
51
68
|
expect(@session).not_to have_xpath("//p[contains(.,'est')]", count: 5)
|
|
52
69
|
expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']", count: 1)
|
|
53
70
|
end
|
|
54
71
|
end
|
|
55
72
|
|
|
56
|
-
context
|
|
57
|
-
it
|
|
58
|
-
expect(@session).to have_xpath(
|
|
59
|
-
expect(@session).not_to have_xpath(
|
|
73
|
+
context 'with text' do
|
|
74
|
+
it 'should discard all matches where the given string is not contained' do
|
|
75
|
+
expect(@session).to have_xpath('//p//a', text: 'Redirect', count: 1)
|
|
76
|
+
expect(@session).not_to have_xpath('//p', text: 'Doesnotexist')
|
|
60
77
|
end
|
|
61
78
|
|
|
62
|
-
it
|
|
63
|
-
expect(@session).to have_xpath(
|
|
64
|
-
expect(@session).not_to have_xpath(
|
|
79
|
+
it 'should discard all matches where the given regexp is not matched' do
|
|
80
|
+
expect(@session).to have_xpath('//p//a', text: /re[dab]i/i, count: 1)
|
|
81
|
+
expect(@session).not_to have_xpath('//p//a', text: /Red$/)
|
|
65
82
|
end
|
|
66
83
|
end
|
|
67
84
|
end
|
|
@@ -71,61 +88,62 @@ Capybara::SpecHelper.spec '#has_no_xpath?' do
|
|
|
71
88
|
@session.visit('/with_html')
|
|
72
89
|
end
|
|
73
90
|
|
|
74
|
-
it
|
|
75
|
-
expect(@session).not_to have_no_xpath(
|
|
91
|
+
it 'should be false if the given selector is on the page' do
|
|
92
|
+
expect(@session).not_to have_no_xpath('//p')
|
|
76
93
|
expect(@session).not_to have_no_xpath("//p//a[@id='foo']")
|
|
77
94
|
expect(@session).not_to have_no_xpath("//p[contains(.,'est')]")
|
|
78
95
|
end
|
|
79
96
|
|
|
80
|
-
it
|
|
81
|
-
expect(@session).to have_no_xpath(
|
|
97
|
+
it 'should be true if the given selector is not on the page' do
|
|
98
|
+
expect(@session).to have_no_xpath('//abbr')
|
|
82
99
|
expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
|
|
83
100
|
expect(@session).to have_no_xpath("//p[contains(.,'thisstringisnotonpage')]")
|
|
84
101
|
end
|
|
85
102
|
|
|
86
|
-
it
|
|
103
|
+
it 'should use xpath even if default selector is CSS' do
|
|
87
104
|
Capybara.default_selector = :css
|
|
88
105
|
expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
|
|
89
106
|
end
|
|
90
107
|
|
|
91
|
-
it
|
|
108
|
+
it 'should respect scopes' do
|
|
92
109
|
@session.within "//p[@id='first']" do
|
|
93
110
|
expect(@session).not_to have_no_xpath(".//a[@id='foo']")
|
|
94
111
|
expect(@session).to have_no_xpath(".//a[@id='red']")
|
|
95
112
|
end
|
|
96
113
|
end
|
|
97
114
|
|
|
98
|
-
it
|
|
115
|
+
it 'should wait for content to disappear', requires: [:js] do
|
|
116
|
+
Capybara.default_max_wait_time = 2
|
|
99
117
|
@session.visit('/with_js')
|
|
100
118
|
@session.click_link('Click me')
|
|
101
119
|
expect(@session).to have_no_xpath("//p[@id='change']")
|
|
102
120
|
end
|
|
103
121
|
|
|
104
|
-
context
|
|
105
|
-
it
|
|
106
|
-
expect(@session).not_to have_no_xpath(
|
|
122
|
+
context 'with count' do
|
|
123
|
+
it 'should be false if the content occurs the given number of times' do
|
|
124
|
+
expect(@session).not_to have_no_xpath('//p', count: 3)
|
|
107
125
|
expect(@session).not_to have_no_xpath("//p//a[@id='foo']", count: 1)
|
|
108
126
|
expect(@session).not_to have_no_xpath("//p[contains(.,'est')]", count: 1)
|
|
109
127
|
expect(@session).not_to have_no_xpath("//p//a[@id='doesnotexist']", count: 0)
|
|
110
128
|
end
|
|
111
129
|
|
|
112
|
-
it
|
|
113
|
-
expect(@session).to have_no_xpath(
|
|
130
|
+
it 'should be true if the content occurs a different number of times than the given' do
|
|
131
|
+
expect(@session).to have_no_xpath('//p', count: 6)
|
|
114
132
|
expect(@session).to have_no_xpath("//p//a[@id='foo']", count: 2)
|
|
115
133
|
expect(@session).to have_no_xpath("//p[contains(.,'est')]", count: 5)
|
|
116
134
|
expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']", count: 1)
|
|
117
135
|
end
|
|
118
136
|
end
|
|
119
137
|
|
|
120
|
-
context
|
|
121
|
-
it
|
|
122
|
-
expect(@session).not_to have_no_xpath(
|
|
123
|
-
expect(@session).to have_no_xpath(
|
|
138
|
+
context 'with text' do
|
|
139
|
+
it 'should discard all matches where the given string is contained' do
|
|
140
|
+
expect(@session).not_to have_no_xpath('//p//a', text: 'Redirect', count: 1)
|
|
141
|
+
expect(@session).to have_no_xpath('//p', text: 'Doesnotexist')
|
|
124
142
|
end
|
|
125
143
|
|
|
126
|
-
it
|
|
127
|
-
expect(@session).not_to have_no_xpath(
|
|
128
|
-
expect(@session).to have_no_xpath(
|
|
144
|
+
it 'should discard all matches where the given regexp is matched' do
|
|
145
|
+
expect(@session).not_to have_no_xpath('//p//a', text: /re[dab]i/i, count: 1)
|
|
146
|
+
expect(@session).to have_no_xpath('//p//a', text: /Red$/)
|
|
129
147
|
end
|
|
130
148
|
end
|
|
131
149
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
Capybara::SpecHelper.spec '#response_headers' do
|
|
4
|
-
it
|
|
4
|
+
it 'should return response headers', requires: [:response_headers] do
|
|
5
5
|
@session.visit('/with_simple_html')
|
|
6
6
|
expect(@session.response_headers['Content-Type']).to match %r{text/html}
|
|
7
7
|
end
|