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,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#go_back', requires: [:js] do
|
|
4
|
+
it 'should fetch a response from the driver from the previous page' do
|
|
4
5
|
@session.visit('/')
|
|
5
6
|
expect(@session).to have_content('Hello world!')
|
|
6
7
|
@session.visit('/foo')
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#go_forward', requires: [:js] do
|
|
4
|
+
it 'should fetch a response from the driver from the previous page' do
|
|
4
5
|
@session.visit('/')
|
|
5
6
|
expect(@session).to have_content('Hello world!')
|
|
6
7
|
@session.visit('/foo')
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#have_all_of_selectors' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_html')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should be true if the given selectors are on the page' do
|
|
9
|
+
expect(@session).to have_all_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it 'should be false if any of the given selectors are not on the page' do
|
|
13
|
+
expect do
|
|
14
|
+
expect(@session).to have_all_of_selectors(:css, 'p a#foo', 'h2#h2three', 'h2#h2one')
|
|
15
|
+
end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should use default selector' do
|
|
19
|
+
Capybara.default_selector = :css
|
|
20
|
+
expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2two', 'h2#h2one')
|
|
21
|
+
expect do
|
|
22
|
+
expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2three', 'h2#h2one')
|
|
23
|
+
end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context 'should respect scopes' do
|
|
27
|
+
it 'when used with `within`' do
|
|
28
|
+
@session.within "//p[@id='first']" do
|
|
29
|
+
expect(@session).to have_all_of_selectors(".//a[@id='foo']")
|
|
30
|
+
expect do
|
|
31
|
+
expect(@session).to have_all_of_selectors(".//a[@id='red']")
|
|
32
|
+
end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'when called on elements' do
|
|
37
|
+
el = @session.find "//p[@id='first']"
|
|
38
|
+
expect(el).to have_all_of_selectors(".//a[@id='foo']")
|
|
39
|
+
expect do
|
|
40
|
+
expect(el).to have_all_of_selectors(".//a[@id='red']")
|
|
41
|
+
end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
context 'with options' do
|
|
46
|
+
it 'should apply options to all locators' do
|
|
47
|
+
expect(@session).to have_all_of_selectors(:field, 'normal', 'additional_newline', type: :textarea)
|
|
48
|
+
expect do
|
|
49
|
+
expect(@session).to have_all_of_selectors(:field, 'normal', 'test_field', 'additional_newline', type: :textarea)
|
|
50
|
+
end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
context 'with wait', requires: [:js] do
|
|
55
|
+
it 'should not raise error if all the elements appear before given wait duration' do
|
|
56
|
+
Capybara.using_wait_time(0.1) do
|
|
57
|
+
@session.visit('/with_js')
|
|
58
|
+
@session.click_link('Click me')
|
|
59
|
+
expect(@session).to have_all_of_selectors(:css, 'a#clickable', 'a#has-been-clicked', '#drag', wait: 5)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'cannot be negated' do
|
|
65
|
+
expect do
|
|
66
|
+
expect(@session).not_to have_all_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
|
|
67
|
+
end.to raise_error ArgumentError
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#have_ancestor' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_html')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should assert an ancestor using the given locator' do
|
|
9
|
+
el = @session.find(:css, '#ancestor1')
|
|
10
|
+
expect(el).to have_ancestor(:css, '#ancestor2')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it 'should assert an ancestor even if not parent' do
|
|
14
|
+
el = @session.find(:css, '#child')
|
|
15
|
+
expect(el).to have_ancestor(:css, '#ancestor3')
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should not raise an error if there are multiple matches' do
|
|
19
|
+
el = @session.find(:css, '#child')
|
|
20
|
+
expect(el).to have_ancestor(:css, 'div')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it 'should allow counts to be specified' do
|
|
24
|
+
el = @session.find(:css, '#child')
|
|
25
|
+
|
|
26
|
+
expect do
|
|
27
|
+
expect(el).to have_ancestor(:css, 'div').once
|
|
28
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
|
29
|
+
|
|
30
|
+
expect(el).to have_ancestor(:css, 'div').exactly(3).times
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
Capybara::SpecHelper.spec '#have_no_ancestor' do
|
|
35
|
+
before do
|
|
36
|
+
@session.visit('/with_html')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'should assert no matching ancestor' do
|
|
40
|
+
el = @session.find(:css, '#ancestor1')
|
|
41
|
+
expect(el).to have_no_ancestor(:css, '#child')
|
|
42
|
+
expect(el).to have_no_ancestor(:css, '#ancestor1_sibiling')
|
|
43
|
+
expect(el).not_to have_ancestor(:css, '#child')
|
|
44
|
+
expect(el).not_to have_ancestor(:css, '#ancestor1_sibiling')
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#have_any_of_selectors' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/with_html')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should be true if any of the given selectors are on the page' do
|
|
9
|
+
expect(@session).to have_any_of_selectors(:css, 'p a#foo', 'h2#blah', 'h2#h2two')
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it 'should be false if none of the given selectors are not on the page' do
|
|
13
|
+
expect do
|
|
14
|
+
expect(@session).to have_any_of_selectors(:css, 'span a#foo', 'h2#h2nope', 'h2#h2one_no')
|
|
15
|
+
end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should use default selector' do
|
|
19
|
+
Capybara.default_selector = :css
|
|
20
|
+
expect(@session).to have_any_of_selectors('p a#foo', 'h2#h2two', 'a#not_on_page')
|
|
21
|
+
expect do
|
|
22
|
+
expect(@session).to have_any_of_selectors('p a#blah', 'h2#h2three')
|
|
23
|
+
end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -1,37 +1,69 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#has_button?' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/form')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
+
it 'should be true if the given button is on the page' do
|
|
8
9
|
expect(@session).to have_button('med')
|
|
9
10
|
expect(@session).to have_button('crap321')
|
|
10
|
-
expect(@session).to have_button(:
|
|
11
|
+
expect(@session).to have_button(:crap321)
|
|
12
|
+
expect(@session).to have_button('button with label element')
|
|
13
|
+
expect(@session).to have_button('button within label element')
|
|
11
14
|
end
|
|
12
15
|
|
|
13
|
-
it
|
|
14
|
-
expect(@session).to have_button('Disabled button', :
|
|
16
|
+
it 'should be true for disabled buttons if disabled: true' do
|
|
17
|
+
expect(@session).to have_button('Disabled button', disabled: true)
|
|
15
18
|
end
|
|
16
19
|
|
|
17
|
-
it
|
|
20
|
+
it 'should be false if the given button is not on the page' do
|
|
18
21
|
expect(@session).not_to have_button('monkey')
|
|
19
22
|
end
|
|
20
23
|
|
|
21
|
-
it
|
|
24
|
+
it 'should be false for disabled buttons by default' do
|
|
22
25
|
expect(@session).not_to have_button('Disabled button')
|
|
23
26
|
end
|
|
24
27
|
|
|
25
|
-
it
|
|
26
|
-
expect(@session).not_to have_button('Disabled button', :
|
|
28
|
+
it 'should be false for disabled buttons if disabled: false' do
|
|
29
|
+
expect(@session).not_to have_button('Disabled button', disabled: false)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'should be true for disabled buttons if disabled: :all' do
|
|
33
|
+
expect(@session).to have_button('Disabled button', disabled: :all)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'should be true for enabled buttons if disabled: :all' do
|
|
37
|
+
expect(@session).to have_button('med', disabled: :all)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'can verify button type' do
|
|
41
|
+
expect(@session).to have_button('awe123', type: 'submit')
|
|
42
|
+
expect(@session).not_to have_button('awe123', type: 'reset')
|
|
27
43
|
end
|
|
28
44
|
|
|
29
|
-
it
|
|
30
|
-
expect(@session).to have_button('
|
|
45
|
+
it 'should be true for role=button when enable_aria_role: true' do
|
|
46
|
+
expect(@session).to have_button('ARIA button', enable_aria_role: true)
|
|
31
47
|
end
|
|
32
48
|
|
|
33
|
-
it
|
|
34
|
-
expect(@session).
|
|
49
|
+
it 'should be false for a role=button within a label when enable_aria_role: true' do
|
|
50
|
+
expect(@session).not_to have_button('role=button within label', enable_aria_role: true)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'should be false for role=button when enable_aria_role: false' do
|
|
54
|
+
expect(@session).not_to have_button('ARIA button', enable_aria_role: false)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'should be false for a role=button within a label when enable_aria_role: false' do
|
|
58
|
+
expect(@session).not_to have_button('role=button within label', enable_aria_role: false)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it 'should not affect other selectors when enable_aria_role: true' do
|
|
62
|
+
expect(@session).to have_button('Click me!', enable_aria_role: true)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'should not affect other selectors when enable_aria_role: false' do
|
|
66
|
+
expect(@session).to have_button('Click me!', enable_aria_role: false)
|
|
35
67
|
end
|
|
36
68
|
end
|
|
37
69
|
|
|
@@ -40,24 +72,49 @@ Capybara::SpecHelper.spec '#has_no_button?' do
|
|
|
40
72
|
@session.visit('/form')
|
|
41
73
|
end
|
|
42
74
|
|
|
43
|
-
it
|
|
75
|
+
it 'should be true if the given button is on the page' do
|
|
44
76
|
expect(@session).not_to have_no_button('med')
|
|
45
77
|
expect(@session).not_to have_no_button('crap321')
|
|
46
78
|
end
|
|
47
79
|
|
|
48
|
-
it
|
|
49
|
-
expect(@session).not_to have_no_button('Disabled button', :
|
|
80
|
+
it 'should be true for disabled buttons if disabled: true' do
|
|
81
|
+
expect(@session).not_to have_no_button('Disabled button', disabled: true)
|
|
50
82
|
end
|
|
51
83
|
|
|
52
|
-
it
|
|
84
|
+
it 'should be false if the given button is not on the page' do
|
|
53
85
|
expect(@session).to have_no_button('monkey')
|
|
54
86
|
end
|
|
55
87
|
|
|
56
|
-
it
|
|
88
|
+
it 'should be false for disabled buttons by default' do
|
|
57
89
|
expect(@session).to have_no_button('Disabled button')
|
|
58
90
|
end
|
|
59
91
|
|
|
60
|
-
it
|
|
61
|
-
expect(@session).to have_no_button('Disabled button', :
|
|
92
|
+
it 'should be false for disabled buttons if disabled: false' do
|
|
93
|
+
expect(@session).to have_no_button('Disabled button', disabled: false)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it 'should be true for role=button when enable_aria_role: false' do
|
|
97
|
+
expect(@session).to have_no_button('ARIA button', enable_aria_role: false)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'should be true for role=button within a label when enable_aria_role: false' do
|
|
101
|
+
expect(@session).to have_no_button('role=button within label', enable_aria_role: false)
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it 'should be false for role=button when enable_aria_role: true' do
|
|
105
|
+
expect(@session).not_to have_no_button('ARIA button', enable_aria_role: true)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it 'should be true for a role=button within a label when enable_aria_role: true' do
|
|
109
|
+
# label element does not associate with aria button
|
|
110
|
+
expect(@session).to have_no_button('role=button within label', enable_aria_role: true)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it 'should not affect other selectors when enable_aria_role: true' do
|
|
114
|
+
expect(@session).to have_no_button('Junk button that does not exist', enable_aria_role: true)
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it 'should not affect other selectors when enable_aria_role: false' do
|
|
118
|
+
expect(@session).to have_no_button('Junk button that does not exist', enable_aria_role: false)
|
|
62
119
|
end
|
|
63
120
|
end
|
|
@@ -1,117 +1,262 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#has_css?' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
-
expect(@session).to have_css(
|
|
9
|
-
expect(@session).to have_css(
|
|
8
|
+
it 'should be true if the given selector is on the page' do
|
|
9
|
+
expect(@session).to have_css('p')
|
|
10
|
+
expect(@session).to have_css('p a#foo')
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
it
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
it 'should warn when passed a symbol' do
|
|
14
|
+
# This was never a specifically accepted format but it has worked for a
|
|
15
|
+
# lot of versions.
|
|
16
|
+
# TODO: Remove in 4.0
|
|
17
|
+
allow(Capybara::Helpers).to receive(:warn).and_return(nil)
|
|
18
|
+
expect(@session).to have_css(:p)
|
|
19
|
+
expect(Capybara::Helpers).to have_received(:warn)
|
|
16
20
|
end
|
|
17
21
|
|
|
18
|
-
it
|
|
19
|
-
@session.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
+
it 'should be false if the given selector is not on the page' do
|
|
23
|
+
expect(@session).not_to have_css('abbr')
|
|
24
|
+
expect(@session).not_to have_css('p a#doesnotexist')
|
|
25
|
+
expect(@session).not_to have_css('p.nosuchclass')
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'should support :id option' do
|
|
29
|
+
expect(@session).to have_css('h2', id: 'h2one')
|
|
30
|
+
expect(@session).to have_css('h2')
|
|
31
|
+
expect(@session).to have_css('h2', id: /h2o/)
|
|
32
|
+
expect(@session).to have_css('li', id: /john|paul/)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it 'should support :class option' do
|
|
36
|
+
expect(@session).to have_css('li', class: 'guitarist')
|
|
37
|
+
expect(@session).to have_css('li', class: /guitar/)
|
|
38
|
+
expect(@session).to have_css('li', class: /guitar|drummer/)
|
|
39
|
+
expect(@session).to have_css('li', class: %w[beatle guitarist])
|
|
40
|
+
expect(@session).to have_css('li', class: /.*/)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context ':style option' do
|
|
44
|
+
it 'should support String' do
|
|
45
|
+
expect(@session).to have_css('p', style: 'line-height: 25px;')
|
|
46
|
+
|
|
47
|
+
expect do
|
|
48
|
+
expect(@session).to have_css('p', style: 'display: not_valid')
|
|
49
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /style attribute "display: not_valid"/)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'should support Regexp' do
|
|
53
|
+
expect(@session).to have_css('p', style: /-height: 2/)
|
|
54
|
+
|
|
55
|
+
expect do
|
|
56
|
+
expect(@session).to have_css('p', style: /not_valid/)
|
|
57
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError, %r{style attribute matching /not_valid/})
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'should support Hash', requires: [:css] do
|
|
61
|
+
expect(@session).to have_css('p', style: { 'line-height': '25px' })
|
|
62
|
+
|
|
63
|
+
expect do
|
|
64
|
+
expect(@session).to have_css('p', style: { 'line-height': '30px' })
|
|
65
|
+
end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /with styles \{:"line-height"=>"30px"\}/)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'should support case insensitive :class and :id options' do
|
|
70
|
+
expect(@session).to have_css('li', class: /UiTaRI/i)
|
|
71
|
+
expect(@session).to have_css('h2', id: /2ON/i)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
context 'when scoped' do
|
|
75
|
+
it 'should look in the scope' do
|
|
76
|
+
@session.within "//p[@id='first']" do
|
|
77
|
+
expect(@session).to have_css('a#foo')
|
|
78
|
+
expect(@session).not_to have_css('a#red')
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it 'should be able to generate an error message if the scope is a sibling' do
|
|
83
|
+
el = @session.find(:css, '#first')
|
|
84
|
+
@session.within el.sibling(:css, '#second') do
|
|
85
|
+
expect do
|
|
86
|
+
expect(@session).to have_css('a#not_on_page')
|
|
87
|
+
end.to raise_error(/there were no matches/)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'should be able to generate an error message if the scope is a sibling from XPath' do
|
|
92
|
+
el = @session.find(:css, '#first').find(:xpath, './following-sibling::*[1]') do
|
|
93
|
+
expect do
|
|
94
|
+
expect(el).to have_css('a#not_on_page')
|
|
95
|
+
end.to raise_error(/there were no matches/)
|
|
96
|
+
end
|
|
22
97
|
end
|
|
23
98
|
end
|
|
24
99
|
|
|
25
|
-
it
|
|
100
|
+
it 'should wait for content to appear', requires: [:js] do
|
|
101
|
+
Capybara.default_max_wait_time = 2
|
|
26
102
|
@session.visit('/with_js')
|
|
27
103
|
@session.click_link('Click me')
|
|
28
104
|
expect(@session).to have_css("input[type='submit'][value='New Here']")
|
|
29
105
|
end
|
|
30
106
|
|
|
31
|
-
context
|
|
32
|
-
it
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
107
|
+
context 'with predicates_wait == true' do
|
|
108
|
+
it 'should wait for content to appear', requires: [:js] do
|
|
109
|
+
Capybara.predicates_wait = true
|
|
110
|
+
Capybara.default_max_wait_time = 2
|
|
111
|
+
@session.visit('/with_js')
|
|
112
|
+
@session.click_link('Click me')
|
|
113
|
+
expect(@session.has_css?("input[type='submit'][value='New Here']")).to be true
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
context 'with predicates_wait == false' do
|
|
118
|
+
before do
|
|
119
|
+
Capybara.predicates_wait = false
|
|
120
|
+
Capybara.default_max_wait_time = 5
|
|
121
|
+
@session.visit('/with_js')
|
|
122
|
+
@session.click_link('Click me')
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it 'should not wait for content to appear', requires: [:js] do
|
|
126
|
+
expect(@session.has_css?("input[type='submit'][value='New Here']")).to be false
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'should should the default wait time if true is passed for :wait', requires: [:js] do
|
|
130
|
+
expect(@session.has_css?("input[type='submit'][value='New Here']", wait: true)).to be true
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
context 'with between' do
|
|
135
|
+
it 'should be true if the content occurs within the range given' do
|
|
136
|
+
expect(@session).to have_css('p', between: 1..4)
|
|
137
|
+
expect(@session).to have_css('p a#foo', between: 1..3)
|
|
138
|
+
expect(@session).to have_css('p a.doesnotexist', between: 0..8)
|
|
36
139
|
end
|
|
37
140
|
|
|
38
|
-
it
|
|
39
|
-
expect(@session).not_to have_css(
|
|
40
|
-
expect(@session).not_to have_css(
|
|
41
|
-
expect(@session).not_to have_css(
|
|
141
|
+
it 'should be false if the content occurs more or fewer times than range' do
|
|
142
|
+
expect(@session).not_to have_css('p', between: 6..11)
|
|
143
|
+
expect(@session).not_to have_css('p a#foo', between: 4..7)
|
|
144
|
+
expect(@session).not_to have_css('p a.doesnotexist', between: 3..8)
|
|
42
145
|
end
|
|
43
146
|
end
|
|
44
147
|
|
|
45
|
-
context
|
|
46
|
-
it
|
|
47
|
-
expect(@session).to have_css(
|
|
48
|
-
expect(@session).to have_css(
|
|
49
|
-
expect(@session).to have_css(
|
|
148
|
+
context 'with count' do
|
|
149
|
+
it 'should be true if the content occurs the given number of times' do
|
|
150
|
+
expect(@session).to have_css('p', count: 3)
|
|
151
|
+
expect(@session).to have_css('p').exactly(3).times
|
|
152
|
+
expect(@session).to have_css('p a#foo', count: 1)
|
|
153
|
+
expect(@session).to have_css('p a#foo').once
|
|
154
|
+
expect(@session).to have_css('p a.doesnotexist', count: 0)
|
|
155
|
+
expect(@session).to have_css('li', class: /guitar|drummer/, count: 4)
|
|
156
|
+
expect(@session).to have_css('li', id: /john|paul/, class: /guitar|drummer/, count: 2)
|
|
157
|
+
expect(@session).to have_css('li', class: %w[beatle guitarist], count: 2)
|
|
158
|
+
expect(@session).to have_css('p', style: 'line-height: 25px;', count: 1)
|
|
159
|
+
expect(@session).to have_css('p', style: /-height: 2/, count: 1)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
it 'should be true if the content occurs the given number of times in CSS processing drivers', requires: [:css] do
|
|
163
|
+
expect(@session).to have_css('p', style: { 'line-height': '25px' }, count: 1)
|
|
50
164
|
end
|
|
51
165
|
|
|
52
|
-
it
|
|
53
|
-
expect(@session).not_to have_css(
|
|
54
|
-
expect(@session).not_to have_css(
|
|
55
|
-
expect(@session).not_to have_css(
|
|
166
|
+
it 'should be false if the content occurs a different number of times than the given' do
|
|
167
|
+
expect(@session).not_to have_css('p', count: 6)
|
|
168
|
+
expect(@session).not_to have_css('p').exactly(5).times
|
|
169
|
+
expect(@session).not_to have_css('p a#foo', count: 2)
|
|
170
|
+
expect(@session).not_to have_css('p a.doesnotexist', count: 1)
|
|
56
171
|
end
|
|
57
172
|
|
|
58
|
-
it
|
|
59
|
-
expect(@session).to have_css(
|
|
60
|
-
expect(@session).to have_css(
|
|
173
|
+
it 'should coerce count to an integer' do
|
|
174
|
+
expect(@session).to have_css('p', count: '3')
|
|
175
|
+
expect(@session).to have_css('p a#foo', count: '1')
|
|
61
176
|
end
|
|
62
177
|
end
|
|
63
178
|
|
|
64
|
-
context
|
|
65
|
-
it
|
|
66
|
-
expect(@session).to have_css(
|
|
67
|
-
expect(@session).to have_css(
|
|
68
|
-
expect(@session).to have_css(
|
|
69
|
-
expect(@session).to have_css(
|
|
179
|
+
context 'with maximum' do
|
|
180
|
+
it 'should be true when content occurs same or fewer times than given' do
|
|
181
|
+
expect(@session).to have_css('h2.head', maximum: 5) # edge case
|
|
182
|
+
expect(@session).to have_css('h2', maximum: 10)
|
|
183
|
+
expect(@session).to have_css('h2').at_most(10).times
|
|
184
|
+
expect(@session).to have_css('p a.doesnotexist', maximum: 1)
|
|
185
|
+
expect(@session).to have_css('p a.doesnotexist', maximum: 0)
|
|
70
186
|
end
|
|
71
187
|
|
|
72
|
-
it
|
|
73
|
-
expect(@session).not_to have_css(
|
|
74
|
-
expect(@session).not_to have_css(
|
|
75
|
-
expect(@session).not_to have_css(
|
|
188
|
+
it 'should be false when content occurs more times than given' do
|
|
189
|
+
# expect(@session).not_to have_css('h2.head', maximum: 4) # edge case
|
|
190
|
+
# expect(@session).not_to have_css('h2', maximum: 3)
|
|
191
|
+
expect(@session).not_to have_css('h2').at_most(3).times
|
|
192
|
+
# expect(@session).not_to have_css('p', maximum: 1)
|
|
76
193
|
end
|
|
77
194
|
|
|
78
|
-
it
|
|
79
|
-
expect(@session).to have_css(
|
|
80
|
-
expect(@session).to have_css(
|
|
195
|
+
it 'should coerce maximum to an integer' do
|
|
196
|
+
expect(@session).to have_css('h2.head', maximum: '5') # edge case
|
|
197
|
+
expect(@session).to have_css('h2', maximum: '10')
|
|
81
198
|
end
|
|
82
199
|
end
|
|
83
200
|
|
|
84
|
-
context
|
|
85
|
-
it
|
|
86
|
-
expect(@session).to have_css(
|
|
87
|
-
expect(@session).to have_css(
|
|
88
|
-
expect(@session).to have_css(
|
|
201
|
+
context 'with minimum' do
|
|
202
|
+
it 'should be true when content occurs same or more times than given' do
|
|
203
|
+
expect(@session).to have_css('h2.head', minimum: 5) # edge case
|
|
204
|
+
expect(@session).to have_css('h2', minimum: 3)
|
|
205
|
+
expect(@session).to have_css('h2').at_least(2).times
|
|
206
|
+
expect(@session).to have_css('p a.doesnotexist', minimum: 0)
|
|
89
207
|
end
|
|
90
208
|
|
|
91
|
-
it
|
|
92
|
-
expect(@session).not_to have_css(
|
|
93
|
-
expect(@session).not_to have_css(
|
|
94
|
-
expect(@session).not_to have_css(
|
|
95
|
-
expect(@session).not_to have_css(
|
|
209
|
+
it 'should be false when content occurs fewer times than given' do
|
|
210
|
+
expect(@session).not_to have_css('h2.head', minimum: 6) # edge case
|
|
211
|
+
expect(@session).not_to have_css('h2', minimum: 8)
|
|
212
|
+
expect(@session).not_to have_css('h2').at_least(8).times
|
|
213
|
+
expect(@session).not_to have_css('p', minimum: 10)
|
|
214
|
+
expect(@session).not_to have_css('p a.doesnotexist', minimum: 1)
|
|
96
215
|
end
|
|
97
216
|
|
|
98
|
-
it
|
|
99
|
-
expect(@session).to have_css(
|
|
100
|
-
expect(@session).to have_css(
|
|
217
|
+
it 'should coerce minimum to an integer' do
|
|
218
|
+
expect(@session).to have_css('h2.head', minimum: '5') # edge case
|
|
219
|
+
expect(@session).to have_css('h2', minimum: '3')
|
|
101
220
|
end
|
|
102
221
|
end
|
|
103
222
|
|
|
104
|
-
context
|
|
105
|
-
it
|
|
106
|
-
expect(@session).to have_css(
|
|
107
|
-
expect(@session).not_to have_css(
|
|
223
|
+
context 'with text' do
|
|
224
|
+
it 'should discard all matches where the given string is not contained' do
|
|
225
|
+
expect(@session).to have_css('p a', text: 'Redirect', count: 1)
|
|
226
|
+
expect(@session).not_to have_css('p a', text: 'Doesnotexist')
|
|
108
227
|
end
|
|
109
228
|
|
|
110
|
-
it
|
|
111
|
-
expect(@session).to have_css(
|
|
112
|
-
expect(@session).not_to have_css(
|
|
229
|
+
it 'should discard all matches where the given regexp is not matched' do
|
|
230
|
+
expect(@session).to have_css('p a', text: /re[dab]i/i, count: 1)
|
|
231
|
+
expect(@session).not_to have_css('p a', text: /Red$/)
|
|
113
232
|
end
|
|
114
233
|
end
|
|
234
|
+
|
|
235
|
+
context 'with spatial requirements', requires: [:spatial] do
|
|
236
|
+
before do
|
|
237
|
+
@session.visit('/spatial')
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
let :center do
|
|
241
|
+
@session.find(:css, '.center')
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
it 'accepts spatial options' do
|
|
245
|
+
expect(@session).to have_css('div', above: center).thrice
|
|
246
|
+
expect(@session).to have_css('div', above: center, right_of: center).once
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
it 'supports spatial sugar' do
|
|
250
|
+
expect(@session).to have_css('div').left_of(center).thrice
|
|
251
|
+
expect(@session).to have_css('div').below(center).right_of(center).once
|
|
252
|
+
expect(@session).to have_css('div').near(center).exactly(8).times
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
it 'should allow escapes in the CSS selector' do
|
|
257
|
+
expect(@session).to have_css('p[data-random="abc\\\\def"]')
|
|
258
|
+
expect(@session).to have_css("p[data-random='#{Capybara::Selector::CSS.escape('abc\def')}']")
|
|
259
|
+
end
|
|
115
260
|
end
|
|
116
261
|
|
|
117
262
|
Capybara::SpecHelper.spec '#has_no_css?' do
|
|
@@ -119,111 +264,112 @@ Capybara::SpecHelper.spec '#has_no_css?' do
|
|
|
119
264
|
@session.visit('/with_html')
|
|
120
265
|
end
|
|
121
266
|
|
|
122
|
-
it
|
|
123
|
-
expect(@session).not_to have_no_css(
|
|
124
|
-
expect(@session).not_to have_no_css(
|
|
267
|
+
it 'should be false if the given selector is on the page' do
|
|
268
|
+
expect(@session).not_to have_no_css('p')
|
|
269
|
+
expect(@session).not_to have_no_css('p a#foo')
|
|
125
270
|
end
|
|
126
271
|
|
|
127
|
-
it
|
|
128
|
-
expect(@session).to have_no_css(
|
|
129
|
-
expect(@session).to have_no_css(
|
|
130
|
-
expect(@session).to have_no_css(
|
|
272
|
+
it 'should be true if the given selector is not on the page' do
|
|
273
|
+
expect(@session).to have_no_css('abbr')
|
|
274
|
+
expect(@session).to have_no_css('p a#doesnotexist')
|
|
275
|
+
expect(@session).to have_no_css('p.nosuchclass')
|
|
131
276
|
end
|
|
132
277
|
|
|
133
|
-
it
|
|
278
|
+
it 'should respect scopes' do
|
|
134
279
|
@session.within "//p[@id='first']" do
|
|
135
|
-
expect(@session).not_to have_no_css(
|
|
136
|
-
expect(@session).to have_no_css(
|
|
280
|
+
expect(@session).not_to have_no_css('a#foo')
|
|
281
|
+
expect(@session).to have_no_css('a#red')
|
|
137
282
|
end
|
|
138
283
|
end
|
|
139
284
|
|
|
140
|
-
it
|
|
285
|
+
it 'should wait for content to disappear', requires: [:js] do
|
|
286
|
+
Capybara.default_max_wait_time = 2
|
|
141
287
|
@session.visit('/with_js')
|
|
142
288
|
@session.click_link('Click me')
|
|
143
|
-
expect(@session).to have_no_css(
|
|
289
|
+
expect(@session).to have_no_css('p#change')
|
|
144
290
|
end
|
|
145
291
|
|
|
146
|
-
context
|
|
147
|
-
it
|
|
148
|
-
expect(@session).not_to have_no_css(
|
|
149
|
-
expect(@session).not_to have_no_css(
|
|
150
|
-
expect(@session).not_to have_no_css(
|
|
292
|
+
context 'with between' do
|
|
293
|
+
it 'should be false if the content occurs within the range given' do
|
|
294
|
+
expect(@session).not_to have_no_css('p', between: 1..4)
|
|
295
|
+
expect(@session).not_to have_no_css('p a#foo', between: 1..3)
|
|
296
|
+
expect(@session).not_to have_no_css('p a.doesnotexist', between: 0..2)
|
|
151
297
|
end
|
|
152
298
|
|
|
153
|
-
it
|
|
154
|
-
expect(@session).to have_no_css(
|
|
155
|
-
expect(@session).to have_no_css(
|
|
156
|
-
expect(@session).to have_no_css(
|
|
299
|
+
it 'should be true if the content occurs more or fewer times than range' do
|
|
300
|
+
expect(@session).to have_no_css('p', between: 6..11)
|
|
301
|
+
expect(@session).to have_no_css('p a#foo', between: 4..7)
|
|
302
|
+
expect(@session).to have_no_css('p a.doesnotexist', between: 3..8)
|
|
157
303
|
end
|
|
158
304
|
end
|
|
159
305
|
|
|
160
|
-
context
|
|
161
|
-
it
|
|
162
|
-
expect(@session).not_to have_no_css(
|
|
163
|
-
expect(@session).not_to have_no_css(
|
|
164
|
-
expect(@session).not_to have_no_css(
|
|
306
|
+
context 'with count' do
|
|
307
|
+
it 'should be false if the content is on the page the given number of times' do
|
|
308
|
+
expect(@session).not_to have_no_css('p', count: 3)
|
|
309
|
+
expect(@session).not_to have_no_css('p a#foo', count: 1)
|
|
310
|
+
expect(@session).not_to have_no_css('p a.doesnotexist', count: 0)
|
|
165
311
|
end
|
|
166
312
|
|
|
167
|
-
it
|
|
168
|
-
expect(@session).to have_no_css(
|
|
169
|
-
expect(@session).to have_no_css(
|
|
170
|
-
expect(@session).to have_no_css(
|
|
313
|
+
it 'should be true if the content is on the page the given number of times' do
|
|
314
|
+
expect(@session).to have_no_css('p', count: 6)
|
|
315
|
+
expect(@session).to have_no_css('p a#foo', count: 2)
|
|
316
|
+
expect(@session).to have_no_css('p a.doesnotexist', count: 1)
|
|
171
317
|
end
|
|
172
318
|
|
|
173
|
-
it
|
|
174
|
-
expect(@session).not_to have_no_css(
|
|
175
|
-
expect(@session).not_to have_no_css(
|
|
319
|
+
it 'should coerce count to an integer' do
|
|
320
|
+
expect(@session).not_to have_no_css('p', count: '3')
|
|
321
|
+
expect(@session).not_to have_no_css('p a#foo', count: '1')
|
|
176
322
|
end
|
|
177
323
|
end
|
|
178
324
|
|
|
179
|
-
context
|
|
180
|
-
it
|
|
181
|
-
expect(@session).not_to have_no_css(
|
|
182
|
-
expect(@session).not_to have_no_css(
|
|
183
|
-
expect(@session).not_to have_no_css(
|
|
325
|
+
context 'with maximum' do
|
|
326
|
+
it 'should be false when content occurs same or fewer times than given' do
|
|
327
|
+
expect(@session).not_to have_no_css('h2.head', maximum: 5) # edge case
|
|
328
|
+
expect(@session).not_to have_no_css('h2', maximum: 10)
|
|
329
|
+
expect(@session).not_to have_no_css('p a.doesnotexist', maximum: 0)
|
|
184
330
|
end
|
|
185
331
|
|
|
186
|
-
it
|
|
187
|
-
expect(@session).to have_no_css(
|
|
188
|
-
expect(@session).to have_no_css(
|
|
189
|
-
expect(@session).to have_no_css(
|
|
332
|
+
it 'should be true when content occurs more times than given' do
|
|
333
|
+
expect(@session).to have_no_css('h2.head', maximum: 4) # edge case
|
|
334
|
+
expect(@session).to have_no_css('h2', maximum: 3)
|
|
335
|
+
expect(@session).to have_no_css('p', maximum: 1)
|
|
190
336
|
end
|
|
191
337
|
|
|
192
|
-
it
|
|
193
|
-
expect(@session).not_to have_no_css(
|
|
194
|
-
expect(@session).not_to have_no_css(
|
|
338
|
+
it 'should coerce maximum to an integer' do
|
|
339
|
+
expect(@session).not_to have_no_css('h2.head', maximum: '5') # edge case
|
|
340
|
+
expect(@session).not_to have_no_css('h2', maximum: '10')
|
|
195
341
|
end
|
|
196
342
|
end
|
|
197
343
|
|
|
198
|
-
context
|
|
199
|
-
it
|
|
200
|
-
expect(@session).not_to have_no_css(
|
|
201
|
-
expect(@session).not_to have_no_css(
|
|
202
|
-
expect(@session).not_to have_no_css(
|
|
344
|
+
context 'with minimum' do
|
|
345
|
+
it 'should be false when content occurs same or more times than given' do
|
|
346
|
+
expect(@session).not_to have_no_css('h2.head', minimum: 5) # edge case
|
|
347
|
+
expect(@session).not_to have_no_css('h2', minimum: 3)
|
|
348
|
+
expect(@session).not_to have_no_css('p a.doesnotexist', minimum: 0)
|
|
203
349
|
end
|
|
204
350
|
|
|
205
|
-
it
|
|
206
|
-
expect(@session).to have_no_css(
|
|
207
|
-
expect(@session).to have_no_css(
|
|
208
|
-
expect(@session).to have_no_css(
|
|
209
|
-
expect(@session).to have_no_css(
|
|
351
|
+
it 'should be true when content occurs fewer times than given' do
|
|
352
|
+
expect(@session).to have_no_css('h2.head', minimum: 6) # edge case
|
|
353
|
+
expect(@session).to have_no_css('h2', minimum: 8)
|
|
354
|
+
expect(@session).to have_no_css('p', minimum: 15)
|
|
355
|
+
expect(@session).to have_no_css('p a.doesnotexist', minimum: 1)
|
|
210
356
|
end
|
|
211
357
|
|
|
212
|
-
it
|
|
213
|
-
expect(@session).not_to have_no_css(
|
|
214
|
-
expect(@session).not_to have_no_css(
|
|
358
|
+
it 'should coerce minimum to an integer' do
|
|
359
|
+
expect(@session).not_to have_no_css('h2.head', minimum: '4') # edge case
|
|
360
|
+
expect(@session).not_to have_no_css('h2', minimum: '3')
|
|
215
361
|
end
|
|
216
362
|
end
|
|
217
363
|
|
|
218
|
-
context
|
|
219
|
-
it
|
|
220
|
-
expect(@session).not_to have_no_css(
|
|
221
|
-
expect(@session).to have_no_css(
|
|
364
|
+
context 'with text' do
|
|
365
|
+
it 'should discard all matches where the given string is not contained' do
|
|
366
|
+
expect(@session).not_to have_no_css('p a', text: 'Redirect', count: 1)
|
|
367
|
+
expect(@session).to have_no_css('p a', text: 'Doesnotexist')
|
|
222
368
|
end
|
|
223
369
|
|
|
224
|
-
it
|
|
225
|
-
expect(@session).not_to have_no_css(
|
|
226
|
-
expect(@session).to have_no_css(
|
|
370
|
+
it 'should discard all matches where the given regexp is not matched' do
|
|
371
|
+
expect(@session).not_to have_no_css('p a', text: /re[dab]i/i, count: 1)
|
|
372
|
+
expect(@session).to have_no_css('p a', text: /Red$/)
|
|
227
373
|
end
|
|
228
374
|
end
|
|
229
375
|
end
|