capybara 2.7.0 → 3.35.3
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 +5 -5
- data/.yardopts +1 -0
- data/History.md +1147 -11
- data/License.txt +1 -1
- data/README.md +252 -131
- data/lib/capybara/config.rb +92 -0
- data/lib/capybara/cucumber.rb +3 -3
- data/lib/capybara/driver/base.rb +52 -21
- data/lib/capybara/driver/node.rb +48 -14
- data/lib/capybara/dsl.rb +16 -9
- data/lib/capybara/helpers.rb +72 -81
- data/lib/capybara/minitest/spec.rb +267 -0
- data/lib/capybara/minitest.rb +385 -0
- data/lib/capybara/node/actions.rb +337 -89
- data/lib/capybara/node/base.rb +50 -32
- data/lib/capybara/node/document.rb +19 -3
- data/lib/capybara/node/document_matchers.rb +22 -24
- data/lib/capybara/node/element.rb +388 -125
- data/lib/capybara/node/finders.rb +231 -121
- data/lib/capybara/node/matchers.rb +503 -217
- data/lib/capybara/node/simple.rb +64 -27
- data/lib/capybara/queries/ancestor_query.rb +27 -0
- data/lib/capybara/queries/base_query.rb +87 -11
- data/lib/capybara/queries/current_path_query.rb +24 -24
- data/lib/capybara/queries/match_query.rb +15 -10
- data/lib/capybara/queries/selector_query.rb +675 -81
- 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 +88 -20
- data/lib/capybara/queries/title_query.rb +9 -11
- data/lib/capybara/rack_test/browser.rb +63 -39
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +26 -16
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +73 -58
- data/lib/capybara/rack_test/node.rb +187 -67
- data/lib/capybara/rails.rb +4 -8
- 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 +142 -14
- data/lib/capybara/rspec/features.rb +17 -42
- data/lib/capybara/rspec/matcher_proxies.rb +82 -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 +43 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/rspec/matchers.rb +143 -244
- data/lib/capybara/rspec.rb +10 -12
- 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 +102 -0
- data/lib/capybara/selector/definition/button.rb +63 -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 +278 -0
- data/lib/capybara/selector/filter.rb +3 -46
- 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 +155 -0
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +232 -369
- 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 +380 -142
- 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 +528 -97
- 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 +63 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +71 -0
- data/lib/capybara/server.rb +74 -71
- data/lib/capybara/session/config.rb +126 -0
- data/lib/capybara/session/matchers.rb +44 -27
- data/lib/capybara/session.rb +500 -297
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- 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 +168 -14
- data/lib/capybara/spec/session/accept_alert_spec.rb +37 -14
- data/lib/capybara/spec/session/accept_confirm_spec.rb +7 -6
- data/lib/capybara/spec/session/accept_prompt_spec.rb +38 -10
- data/lib/capybara/spec/session/all_spec.rb +179 -59
- 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 +154 -48
- data/lib/capybara/spec/session/body_spec.rb +12 -13
- data/lib/capybara/spec/session/check_spec.rb +168 -41
- data/lib/capybara/spec/session/choose_spec.rb +75 -23
- data/lib/capybara/spec/session/click_button_spec.rb +243 -175
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +57 -32
- data/lib/capybara/spec/session/click_link_spec.rb +100 -53
- data/lib/capybara/spec/session/current_scope_spec.rb +11 -10
- data/lib/capybara/spec/session/current_url_spec.rb +61 -35
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +7 -7
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +5 -4
- data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +13 -6
- data/lib/capybara/spec/session/element/match_css_spec.rb +21 -7
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +91 -34
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +45 -3
- data/lib/capybara/spec/session/execute_script_spec.rb +24 -4
- data/lib/capybara/spec/session/fill_in_spec.rb +166 -64
- data/lib/capybara/spec/session/find_button_spec.rb +37 -18
- data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
- data/lib/capybara/spec/session/find_field_spec.rb +57 -34
- data/lib/capybara/spec/session/find_link_spec.rb +47 -10
- data/lib/capybara/spec/session/find_spec.rb +290 -144
- data/lib/capybara/spec/session/first_spec.rb +91 -48
- 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 +3 -2
- data/lib/capybara/spec/session/go_forward_spec.rb +3 -2
- 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 +76 -19
- data/lib/capybara/spec/session/has_css_spec.rb +277 -131
- data/lib/capybara/spec/session/has_current_path_spec.rb +98 -26
- data/lib/capybara/spec/session/has_field_spec.rb +177 -107
- data/lib/capybara/spec/session/has_link_spec.rb +13 -12
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
- data/lib/capybara/spec/session/has_select_spec.rb +191 -95
- data/lib/capybara/spec/session/has_selector_spec.rb +128 -64
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +172 -5
- data/lib/capybara/spec/session/has_text_spec.rb +126 -60
- data/lib/capybara/spec/session/has_title_spec.rb +35 -12
- data/lib/capybara/spec/session/has_xpath_spec.rb +74 -53
- data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
- data/lib/capybara/spec/session/html_spec.rb +14 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +1028 -131
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +34 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +75 -34
- data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +11 -15
- data/lib/capybara/spec/session/save_page_spec.rb +42 -55
- data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +117 -0
- data/lib/capybara/spec/session/select_spec.rb +112 -85
- data/lib/capybara/spec/session/selectors_spec.rb +71 -8
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/text_spec.rb +38 -23
- data/lib/capybara/spec/session/title_spec.rb +17 -5
- data/lib/capybara/spec/session/uncheck_spec.rb +71 -12
- data/lib/capybara/spec/session/unselect_spec.rb +44 -43
- data/lib/capybara/spec/session/visit_spec.rb +99 -32
- data/lib/capybara/spec/session/window/become_closed_spec.rb +33 -29
- data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +39 -30
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +17 -10
- data/lib/capybara/spec/session/window/window_spec.rb +121 -73
- data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
- data/lib/capybara/spec/session/window/within_window_spec.rb +52 -82
- data/lib/capybara/spec/session/within_spec.rb +76 -43
- data/lib/capybara/spec/spec_helper.rb +67 -33
- data/lib/capybara/spec/test_app.rb +85 -36
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/buttons.erb +1 -1
- data/lib/capybara/spec/views/fieldsets.erb +1 -1
- data/lib/capybara/spec/views/form.erb +227 -20
- data/lib/capybara/spec/views/frame_child.erb +10 -2
- data/lib/capybara/spec/views/frame_one.erb +2 -1
- data/lib/capybara/spec/views/frame_parent.erb +2 -2
- data/lib/capybara/spec/views/frame_two.erb +1 -1
- data/lib/capybara/spec/views/header_links.erb +1 -1
- data/lib/capybara/spec/views/host_links.erb +1 -1
- 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 +1 -1
- 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/postback.erb +1 -1
- 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 +69 -2
- data/lib/capybara/spec/views/with_animation.erb +82 -0
- data/lib/capybara/spec/views/with_base_tag.erb +1 -1
- data/lib/capybara/spec/views/with_count.erb +1 -1
- data/lib/capybara/spec/views/with_dragula.erb +24 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +7 -1
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +100 -10
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_html_entities.erb +1 -1
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +49 -3
- 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 +1 -1
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_simple_html.erb +1 -1
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_title.erb +1 -1
- data/lib/capybara/spec/views/with_unload_alert.erb +3 -1
- data/lib/capybara/spec/views/with_windows.erb +7 -1
- data/lib/capybara/spec/views/within_frames.erb +6 -3
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +39 -21
- data/lib/capybara.rb +208 -186
- data/spec/basic_node_spec.rb +52 -39
- data/spec/capybara_spec.rb +72 -50
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +81 -61
- 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 +7 -3
- data/spec/fixtures/selenium_driver_rspec_success.rb +7 -3
- data/spec/minitest_spec.rb +164 -0
- data/spec/minitest_spec_spec.rb +162 -0
- data/spec/per_session_config_spec.rb +68 -0
- data/spec/rack_test_spec.rb +189 -96
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +143 -13
- data/spec/rspec/features_spec.rb +38 -32
- data/spec/rspec/scenarios_spec.rb +9 -7
- data/spec/rspec/shared_spec_matchers.rb +959 -0
- data/spec/rspec/views_spec.rb +9 -3
- data/spec/rspec_matchers_spec.rb +62 -0
- data/spec/rspec_spec.rb +127 -30
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +458 -37
- data/spec/selenium_spec_chrome.rb +196 -9
- data/spec/selenium_spec_chrome_remote.rb +100 -0
- data/spec/selenium_spec_edge.rb +47 -0
- data/spec/selenium_spec_firefox.rb +210 -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 +200 -101
- data/spec/session_spec.rb +91 -0
- data/spec/shared_selenium_node.rb +83 -0
- data/spec/shared_selenium_session.rb +558 -0
- data/spec/spec_helper.rb +94 -2
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +420 -60
- data/lib/capybara/query.rb +0 -7
- data/lib/capybara/spec/session/assert_current_path.rb +0 -60
- data/lib/capybara/spec/session/assert_selector.rb +0 -148
- data/lib/capybara/spec/session/assert_text.rb +0 -196
- data/lib/capybara/spec/session/assert_title.rb +0 -70
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/session/within_frame_spec.rb +0 -53
- data/spec/rspec/matchers_spec.rb +0 -827
- data/spec/selenium_spec.rb +0 -151
|
@@ -1,44 +1,59 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#has_text?' do
|
|
3
|
-
it
|
|
4
|
+
it 'should be true if the given text is on the page at least once' do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
expect(@session).to have_text('est')
|
|
6
7
|
expect(@session).to have_text('Lorem')
|
|
7
8
|
expect(@session).to have_text('Redirect')
|
|
8
|
-
expect(@session).to have_text(:
|
|
9
|
+
expect(@session).to have_text(:Redirect)
|
|
9
10
|
end
|
|
10
11
|
|
|
11
|
-
it
|
|
12
|
+
it 'should be true if scoped to an element which has the text' do
|
|
12
13
|
@session.visit('/with_html')
|
|
13
14
|
@session.within("//a[@title='awesome title']") do
|
|
14
15
|
expect(@session).to have_text('labore')
|
|
15
16
|
end
|
|
16
17
|
end
|
|
17
18
|
|
|
18
|
-
it
|
|
19
|
+
it 'should be false if scoped to an element which does not have the text' do
|
|
19
20
|
@session.visit('/with_html')
|
|
20
21
|
@session.within("//a[@title='awesome title']") do
|
|
21
22
|
expect(@session).not_to have_text('monkey')
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
25
|
|
|
25
|
-
it
|
|
26
|
+
it 'should ignore tags' do
|
|
26
27
|
@session.visit('/with_html')
|
|
27
28
|
expect(@session).not_to have_text('exercitation <a href="/foo" id="foo">ullamco</a> laboris')
|
|
28
29
|
expect(@session).to have_text('exercitation ullamco laboris')
|
|
29
30
|
end
|
|
30
31
|
|
|
31
|
-
it
|
|
32
|
+
it 'should search correctly normalized text' do
|
|
32
33
|
@session.visit('/with_html')
|
|
33
|
-
expect(@session).to have_text('text with
|
|
34
|
+
expect(@session).to have_text('text with whitespace')
|
|
34
35
|
end
|
|
35
36
|
|
|
36
|
-
it
|
|
37
|
+
it 'should search whitespace collapsed text' do
|
|
37
38
|
@session.visit('/with_html')
|
|
38
|
-
expect(@session).to have_text(
|
|
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
|
|
39
54
|
end
|
|
40
55
|
|
|
41
|
-
it
|
|
56
|
+
it 'should be false if the given text is not on the page' do
|
|
42
57
|
@session.visit('/with_html')
|
|
43
58
|
expect(@session).not_to have_text('xxxxyzzz')
|
|
44
59
|
expect(@session).not_to have_text('monkey')
|
|
@@ -51,12 +66,12 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
|
51
66
|
|
|
52
67
|
it 'should handle double quotes in the text' do
|
|
53
68
|
@session.visit('/with-quotes')
|
|
54
|
-
expect(@session).to have_text(
|
|
69
|
+
expect(@session).to have_text('"No," he said')
|
|
55
70
|
end
|
|
56
71
|
|
|
57
72
|
it 'should handle mixed single and double quotes in the text' do
|
|
58
73
|
@session.visit('/with-quotes')
|
|
59
|
-
expect(@session).to have_text(%q
|
|
74
|
+
expect(@session).to have_text(%q("you can't do that."))
|
|
60
75
|
end
|
|
61
76
|
|
|
62
77
|
it 'should be false if text is in the title tag in the head' do
|
|
@@ -70,23 +85,23 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
|
70
85
|
expect(@session).not_to have_text('aVar')
|
|
71
86
|
end
|
|
72
87
|
|
|
73
|
-
it
|
|
88
|
+
it 'should be false if the given text is on the page but not visible' do
|
|
74
89
|
@session.visit('/with_html')
|
|
75
90
|
expect(@session).not_to have_text('Inside element with hidden ancestor')
|
|
76
91
|
end
|
|
77
92
|
|
|
78
|
-
it
|
|
93
|
+
it 'should be true if :all given and text is invisible.' do
|
|
79
94
|
@session.visit('/with_html')
|
|
80
95
|
expect(@session).to have_text(:all, 'Some of this text is hidden!')
|
|
81
96
|
end
|
|
82
97
|
|
|
83
|
-
it
|
|
98
|
+
it 'should be true if `Capybara.ignore_hidden_elements = false` and text is invisible.' do
|
|
84
99
|
Capybara.ignore_hidden_elements = false
|
|
85
100
|
@session.visit('/with_html')
|
|
86
101
|
expect(@session).to have_text('Some of this text is hidden!')
|
|
87
102
|
end
|
|
88
103
|
|
|
89
|
-
it
|
|
104
|
+
it 'should be true if the text in the page matches given regexp' do
|
|
90
105
|
@session.visit('/with_html')
|
|
91
106
|
expect(@session).to have_text(/Lorem/)
|
|
92
107
|
end
|
|
@@ -96,36 +111,80 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
|
96
111
|
expect(@session).not_to have_text(/xxxxyzzz/)
|
|
97
112
|
end
|
|
98
113
|
|
|
99
|
-
|
|
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
|
|
120
|
+
@session.visit('/with_html')
|
|
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)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "should be false if text doesn't match exactly" do
|
|
145
|
+
@session.visit('/with_html')
|
|
146
|
+
expect(@session.find(:id, 'h2one')).not_to have_text('Header Class Test On', exact: true)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
it 'should escape any characters that would have special meaning in a regexp' do
|
|
100
151
|
@session.visit('/with_html')
|
|
101
152
|
expect(@session).not_to have_text('.orem')
|
|
102
153
|
end
|
|
103
154
|
|
|
104
|
-
it
|
|
155
|
+
it 'should accept non-string parameters' do
|
|
105
156
|
@session.visit('/with_html')
|
|
106
157
|
expect(@session).to have_text(42)
|
|
107
158
|
end
|
|
108
159
|
|
|
109
|
-
it
|
|
160
|
+
it 'should be true when passed nil' do
|
|
110
161
|
# nil is converted to '' when to_s is invoked
|
|
111
162
|
@session.visit('/with_html')
|
|
112
163
|
expect(@session).to have_text(nil)
|
|
113
164
|
end
|
|
114
165
|
|
|
115
|
-
it
|
|
116
|
-
@session.visit('/
|
|
117
|
-
|
|
118
|
-
expect(@session).to have_text(
|
|
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
|
|
173
|
+
Capybara.using_wait_time(3) do
|
|
174
|
+
@session.visit('/with_js')
|
|
175
|
+
@session.click_link('Click me')
|
|
176
|
+
expect(@session).to have_text('Has been clicked')
|
|
177
|
+
end
|
|
119
178
|
end
|
|
120
179
|
|
|
121
|
-
context
|
|
122
|
-
it
|
|
180
|
+
context 'with between' do
|
|
181
|
+
it 'should be true if the text occurs within the range given' do
|
|
123
182
|
@session.visit('/with_count')
|
|
124
183
|
expect(@session).to have_text('count', between: 1..3)
|
|
125
184
|
expect(@session).to have_text(/count/, between: 2..2)
|
|
126
185
|
end
|
|
127
186
|
|
|
128
|
-
it
|
|
187
|
+
it 'should be false if the text occurs more or fewer times than range' do
|
|
129
188
|
@session.visit('/with_count')
|
|
130
189
|
expect(@session).not_to have_text('count', between: 0..1)
|
|
131
190
|
expect(@session).not_to have_text('count', between: 3..10)
|
|
@@ -133,112 +192,118 @@ Capybara::SpecHelper.spec '#has_text?' do
|
|
|
133
192
|
end
|
|
134
193
|
end
|
|
135
194
|
|
|
136
|
-
context
|
|
137
|
-
it
|
|
195
|
+
context 'with count' do
|
|
196
|
+
it 'should be true if the text occurs the given number of times' do
|
|
138
197
|
@session.visit('/with_count')
|
|
139
198
|
expect(@session).to have_text('count', count: 2)
|
|
199
|
+
expect(@session).to have_text('count').exactly(2).times
|
|
140
200
|
end
|
|
141
201
|
|
|
142
|
-
it
|
|
202
|
+
it 'should be false if the text occurs a different number of times than the given' do
|
|
143
203
|
@session.visit('/with_count')
|
|
144
204
|
expect(@session).not_to have_text('count', count: 0)
|
|
145
205
|
expect(@session).not_to have_text('count', count: 1)
|
|
206
|
+
expect(@session).not_to have_text('count').once
|
|
146
207
|
expect(@session).not_to have_text(/count/, count: 3)
|
|
147
208
|
end
|
|
148
209
|
|
|
149
|
-
it
|
|
210
|
+
it 'should coerce count to an integer' do
|
|
150
211
|
@session.visit('/with_count')
|
|
151
212
|
expect(@session).to have_text('count', count: '2')
|
|
152
213
|
expect(@session).not_to have_text('count', count: '3')
|
|
153
214
|
end
|
|
154
215
|
end
|
|
155
216
|
|
|
156
|
-
context
|
|
157
|
-
it
|
|
217
|
+
context 'with maximum' do
|
|
218
|
+
it 'should be true when text occurs same or fewer times than given' do
|
|
158
219
|
@session.visit('/with_count')
|
|
159
220
|
expect(@session).to have_text('count', maximum: 2)
|
|
221
|
+
expect(@session).to have_text('count').at_most(2).times
|
|
160
222
|
expect(@session).to have_text(/count/, maximum: 3)
|
|
161
223
|
end
|
|
162
224
|
|
|
163
|
-
it
|
|
225
|
+
it 'should be false when text occurs more times than given' do
|
|
164
226
|
@session.visit('/with_count')
|
|
165
227
|
expect(@session).not_to have_text('count', maximum: 1)
|
|
228
|
+
expect(@session).not_to have_text('count').at_most(1).times
|
|
166
229
|
expect(@session).not_to have_text('count', maximum: 0)
|
|
167
230
|
end
|
|
168
231
|
|
|
169
|
-
it
|
|
232
|
+
it 'should coerce maximum to an integer' do
|
|
170
233
|
@session.visit('/with_count')
|
|
171
234
|
expect(@session).to have_text('count', maximum: '2')
|
|
172
235
|
expect(@session).not_to have_text('count', maximum: '1')
|
|
173
236
|
end
|
|
174
237
|
end
|
|
175
238
|
|
|
176
|
-
context
|
|
177
|
-
it
|
|
239
|
+
context 'with minimum' do
|
|
240
|
+
it 'should be true when text occurs same or more times than given' do
|
|
178
241
|
@session.visit('/with_count')
|
|
179
242
|
expect(@session).to have_text('count', minimum: 2)
|
|
243
|
+
expect(@session).to have_text('count').at_least(2).times
|
|
180
244
|
expect(@session).to have_text(/count/, minimum: 0)
|
|
181
245
|
end
|
|
182
246
|
|
|
183
|
-
it
|
|
247
|
+
it 'should be false when text occurs fewer times than given' do
|
|
184
248
|
@session.visit('/with_count')
|
|
185
249
|
expect(@session).not_to have_text('count', minimum: 3)
|
|
250
|
+
expect(@session).not_to have_text('count').at_least(3).times
|
|
186
251
|
end
|
|
187
252
|
|
|
188
|
-
it
|
|
253
|
+
it 'should coerce minimum to an integer' do
|
|
189
254
|
@session.visit('/with_count')
|
|
190
255
|
expect(@session).to have_text('count', minimum: '2')
|
|
191
256
|
expect(@session).not_to have_text('count', minimum: '3')
|
|
192
257
|
end
|
|
193
258
|
end
|
|
194
259
|
|
|
195
|
-
context
|
|
196
|
-
it
|
|
260
|
+
context 'with wait', requires: [:js] do
|
|
261
|
+
it 'should find element if it appears before given wait duration' do
|
|
197
262
|
Capybara.using_wait_time(0.1) do
|
|
198
263
|
@session.visit('/with_js')
|
|
199
264
|
@session.click_link('Click me')
|
|
200
|
-
expect(@session).to have_text('Has been clicked', :
|
|
265
|
+
expect(@session).to have_text('Has been clicked', wait: 3)
|
|
201
266
|
end
|
|
202
267
|
end
|
|
203
268
|
end
|
|
204
269
|
|
|
205
|
-
it
|
|
270
|
+
it 'should raise an error if an invalid option is passed' do
|
|
206
271
|
@session.visit('/with_html')
|
|
207
272
|
expect do
|
|
208
|
-
expect(@session).to have_text('Lorem',
|
|
273
|
+
expect(@session).to have_text('Lorem', invalid: true)
|
|
209
274
|
end.to raise_error(ArgumentError)
|
|
210
275
|
end
|
|
211
276
|
end
|
|
212
277
|
|
|
213
278
|
Capybara::SpecHelper.spec '#has_no_text?' do
|
|
214
|
-
it
|
|
279
|
+
it 'should be false if the given text is on the page at least once' do
|
|
215
280
|
@session.visit('/with_html')
|
|
216
281
|
expect(@session).not_to have_no_text('est')
|
|
217
282
|
expect(@session).not_to have_no_text('Lorem')
|
|
218
283
|
expect(@session).not_to have_no_text('Redirect')
|
|
219
284
|
end
|
|
220
285
|
|
|
221
|
-
it
|
|
286
|
+
it 'should be false if scoped to an element which has the text' do
|
|
222
287
|
@session.visit('/with_html')
|
|
223
288
|
@session.within("//a[@title='awesome title']") do
|
|
224
289
|
expect(@session).not_to have_no_text('labore')
|
|
225
290
|
end
|
|
226
291
|
end
|
|
227
292
|
|
|
228
|
-
it
|
|
293
|
+
it 'should be true if scoped to an element which does not have the text' do
|
|
229
294
|
@session.visit('/with_html')
|
|
230
295
|
@session.within("//a[@title='awesome title']") do
|
|
231
296
|
expect(@session).to have_no_text('monkey')
|
|
232
297
|
end
|
|
233
298
|
end
|
|
234
299
|
|
|
235
|
-
it
|
|
300
|
+
it 'should ignore tags' do
|
|
236
301
|
@session.visit('/with_html')
|
|
237
302
|
expect(@session).to have_no_text('exercitation <a href="/foo" id="foo">ullamco</a> laboris')
|
|
238
303
|
expect(@session).not_to have_no_text('exercitation ullamco laboris')
|
|
239
304
|
end
|
|
240
305
|
|
|
241
|
-
it
|
|
306
|
+
it 'should be true if the given text is not on the page' do
|
|
242
307
|
@session.visit('/with_html')
|
|
243
308
|
expect(@session).to have_no_text('xxxxyzzz')
|
|
244
309
|
expect(@session).to have_no_text('monkey')
|
|
@@ -251,12 +316,12 @@ Capybara::SpecHelper.spec '#has_no_text?' do
|
|
|
251
316
|
|
|
252
317
|
it 'should handle double quotes in the text' do
|
|
253
318
|
@session.visit('/with-quotes')
|
|
254
|
-
expect(@session).not_to have_no_text(
|
|
319
|
+
expect(@session).not_to have_no_text('"No," he said')
|
|
255
320
|
end
|
|
256
321
|
|
|
257
322
|
it 'should handle mixed single and double quotes in the text' do
|
|
258
323
|
@session.visit('/with-quotes')
|
|
259
|
-
expect(@session).not_to have_no_text(%q
|
|
324
|
+
expect(@session).not_to have_no_text(%q("you can't do that."))
|
|
260
325
|
end
|
|
261
326
|
|
|
262
327
|
it 'should be true if text is in the title tag in the head' do
|
|
@@ -270,17 +335,17 @@ Capybara::SpecHelper.spec '#has_no_text?' do
|
|
|
270
335
|
expect(@session).to have_no_text('aVar')
|
|
271
336
|
end
|
|
272
337
|
|
|
273
|
-
it
|
|
338
|
+
it 'should be true if the given text is on the page but not visible' do
|
|
274
339
|
@session.visit('/with_html')
|
|
275
340
|
expect(@session).to have_no_text('Inside element with hidden ancestor')
|
|
276
341
|
end
|
|
277
342
|
|
|
278
|
-
it
|
|
343
|
+
it 'should be false if :all given and text is invisible.' do
|
|
279
344
|
@session.visit('/with_html')
|
|
280
345
|
expect(@session).not_to have_no_text(:all, 'Some of this text is hidden!')
|
|
281
346
|
end
|
|
282
347
|
|
|
283
|
-
it
|
|
348
|
+
it 'should be false if `Capybara.ignore_hidden_elements = false` and text is invisible.' do
|
|
284
349
|
Capybara.ignore_hidden_elements = false
|
|
285
350
|
@session.visit('/with_html')
|
|
286
351
|
expect(@session).not_to have_no_text('Some of this text is hidden!')
|
|
@@ -291,27 +356,28 @@ Capybara::SpecHelper.spec '#has_no_text?' do
|
|
|
291
356
|
expect(@session).to have_no_text(/xxxxyzzz/)
|
|
292
357
|
end
|
|
293
358
|
|
|
294
|
-
it
|
|
359
|
+
it 'should be false if the text in the page matches given regexp' do
|
|
295
360
|
@session.visit('/with_html')
|
|
296
361
|
expect(@session).not_to have_no_text(/Lorem/)
|
|
297
362
|
end
|
|
298
363
|
|
|
299
|
-
it
|
|
364
|
+
it 'should escape any characters that would have special meaning in a regexp' do
|
|
300
365
|
@session.visit('/with_html')
|
|
301
366
|
expect(@session).to have_no_text('.orem')
|
|
302
367
|
end
|
|
303
368
|
|
|
304
|
-
it
|
|
369
|
+
it 'should wait for text to disappear', requires: [:js] do
|
|
370
|
+
Capybara.default_max_wait_time = 2
|
|
305
371
|
@session.visit('/with_js')
|
|
306
372
|
@session.click_link('Click me')
|
|
307
|
-
expect(@session).to have_no_text(
|
|
373
|
+
expect(@session).to have_no_text('I changed it')
|
|
308
374
|
end
|
|
309
375
|
|
|
310
|
-
context
|
|
311
|
-
it
|
|
376
|
+
context 'with wait', requires: [:js] do
|
|
377
|
+
it 'should not find element if it appears after given wait duration' do
|
|
312
378
|
@session.visit('/with_js')
|
|
313
379
|
@session.click_link('Click me')
|
|
314
|
-
expect(@session).to have_no_text('Has been clicked', :
|
|
380
|
+
expect(@session).to have_no_text('Has been clicked', wait: 0.05)
|
|
315
381
|
end
|
|
316
382
|
end
|
|
317
383
|
end
|
|
@@ -1,25 +1,45 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#has_title?' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_js')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
+
it 'should be true if the page has the given title' do
|
|
8
9
|
expect(@session).to have_title('with_js')
|
|
10
|
+
expect(@session.has_title?('with_js')).to be true
|
|
9
11
|
end
|
|
10
12
|
|
|
11
|
-
it
|
|
13
|
+
it 'should allow regexp matches' do
|
|
12
14
|
expect(@session).to have_title(/w[a-z]{3}_js/)
|
|
13
15
|
expect(@session).not_to have_title(/monkey/)
|
|
14
16
|
end
|
|
15
17
|
|
|
16
|
-
it
|
|
17
|
-
@session.click_link(
|
|
18
|
-
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')
|
|
19
21
|
end
|
|
20
22
|
|
|
21
|
-
it
|
|
23
|
+
it 'should be false if the page has not the given title' do
|
|
22
24
|
expect(@session).not_to have_title('monkey')
|
|
25
|
+
expect(@session.has_title?('monkey')).to be false
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should default to exact: false matching' do
|
|
29
|
+
expect(@session).to have_title('with_js', exact: false)
|
|
30
|
+
expect(@session).to have_title('with_', exact: false)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'should match exactly if exact: true option passed' do
|
|
34
|
+
expect(@session).to have_title('with_js', exact: true)
|
|
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
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'should match partial if exact: false option passed' do
|
|
41
|
+
expect(@session).to have_title('with_js', exact: false)
|
|
42
|
+
expect(@session).to have_title('with_', exact: false)
|
|
23
43
|
end
|
|
24
44
|
end
|
|
25
45
|
|
|
@@ -28,21 +48,24 @@ Capybara::SpecHelper.spec '#has_no_title?' do
|
|
|
28
48
|
@session.visit('/with_js')
|
|
29
49
|
end
|
|
30
50
|
|
|
31
|
-
it
|
|
51
|
+
it 'should be false if the page has the given title' do
|
|
32
52
|
expect(@session).not_to have_no_title('with_js')
|
|
33
53
|
end
|
|
34
54
|
|
|
35
|
-
it
|
|
55
|
+
it 'should allow regexp matches' do
|
|
36
56
|
expect(@session).not_to have_no_title(/w[a-z]{3}_js/)
|
|
37
57
|
expect(@session).to have_no_title(/monkey/)
|
|
38
58
|
end
|
|
39
59
|
|
|
40
|
-
it
|
|
41
|
-
|
|
42
|
-
|
|
60
|
+
it 'should wait for title to disappear', requires: [:js] do
|
|
61
|
+
Capybara.using_wait_time(5) do
|
|
62
|
+
@session.click_link('Change title') # triggers title change after 400ms
|
|
63
|
+
expect(@session).to have_no_title('with_js')
|
|
64
|
+
end
|
|
43
65
|
end
|
|
44
66
|
|
|
45
|
-
it
|
|
67
|
+
it 'should be true if the page has not the given title' do
|
|
46
68
|
expect(@session).to have_no_title('monkey')
|
|
69
|
+
expect(@session.has_no_title?('monkey')).to be true
|
|
47
70
|
end
|
|
48
71
|
end
|