capybara 3.0.0 → 3.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/History.md +891 -12
- data/License.txt +1 -1
- data/README.md +257 -84
- 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 +38 -9
- data/lib/capybara/dsl.rb +9 -7
- data/lib/capybara/helpers.rb +57 -8
- data/lib/capybara/minitest/spec.rb +185 -84
- data/lib/capybara/minitest.rb +264 -145
- data/lib/capybara/node/actions.rb +248 -124
- data/lib/capybara/node/base.rb +35 -20
- data/lib/capybara/node/document.rb +14 -2
- data/lib/capybara/node/document_matchers.rb +13 -15
- data/lib/capybara/node/element.rb +350 -113
- data/lib/capybara/node/finders.rb +104 -82
- data/lib/capybara/node/matchers.rb +363 -157
- data/lib/capybara/node/simple.rb +54 -15
- data/lib/capybara/node/whitespace_normalizer.rb +81 -0
- data/lib/capybara/queries/active_element_query.rb +18 -0
- data/lib/capybara/queries/ancestor_query.rb +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 +617 -104
- 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 +106 -31
- data/lib/capybara/rack_test/driver.rb +16 -7
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +74 -49
- data/lib/capybara/rack_test/node.rb +120 -47
- data/lib/capybara/rails.rb +1 -1
- data/lib/capybara/registration_container.rb +41 -0
- data/lib/capybara/registrations/drivers.rb +42 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
- data/lib/capybara/registrations/servers.rb +66 -0
- data/lib/capybara/result.rb +87 -53
- data/lib/capybara/rspec/features.rb +8 -10
- data/lib/capybara/rspec/matcher_proxies.rb +39 -18
- data/lib/capybara/rspec/matchers/base.rb +113 -0
- data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
- data/lib/capybara/rspec/matchers/compound.rb +88 -0
- data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
- data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
- data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
- data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
- data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/lib/capybara/rspec/matchers/have_text.rb +33 -0
- data/lib/capybara/rspec/matchers/have_title.rb +29 -0
- data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
- data/lib/capybara/rspec/matchers/match_style.rb +43 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/rspec/matchers.rb +142 -315
- 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 +85 -8
- data/lib/capybara/selector/definition/button.rb +68 -0
- data/lib/capybara/selector/definition/checkbox.rb +26 -0
- data/lib/capybara/selector/definition/css.rb +10 -0
- data/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/lib/capybara/selector/definition/element.rb +28 -0
- data/lib/capybara/selector/definition/field.rb +40 -0
- data/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/lib/capybara/selector/definition/file_field.rb +13 -0
- data/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/lib/capybara/selector/definition/frame.rb +17 -0
- data/lib/capybara/selector/definition/id.rb +6 -0
- data/lib/capybara/selector/definition/label.rb +62 -0
- data/lib/capybara/selector/definition/link.rb +55 -0
- data/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/lib/capybara/selector/definition/option.rb +27 -0
- data/lib/capybara/selector/definition/radio_button.rb +27 -0
- data/lib/capybara/selector/definition/select.rb +81 -0
- data/lib/capybara/selector/definition/table.rb +109 -0
- data/lib/capybara/selector/definition/table_row.rb +21 -0
- data/lib/capybara/selector/definition/xpath.rb +5 -0
- data/lib/capybara/selector/definition.rb +280 -0
- data/lib/capybara/selector/filter.rb +1 -0
- data/lib/capybara/selector/filter_set.rb +72 -28
- 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 +211 -0
- data/lib/capybara/selector/selector.rb +89 -200
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +474 -534
- 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 +270 -245
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +110 -0
- data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +76 -0
- data/lib/capybara/selenium/node.rb +460 -170
- data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
- data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +45 -0
- data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
- data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/lib/capybara/server/animation_disabler.rb +80 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +71 -0
- data/lib/capybara/server.rb +58 -67
- data/lib/capybara/session/config.rb +40 -6
- data/lib/capybara/session/matchers.rb +26 -19
- data/lib/capybara/session.rb +252 -194
- 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 +126 -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 -44
- 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} +76 -52
- data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
- data/lib/capybara/spec/session/body_spec.rb +11 -13
- data/lib/capybara/spec/session/check_spec.rb +112 -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 +89 -55
- data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
- 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 +110 -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 +42 -14
- data/lib/capybara/spec/session/find_spec.rb +251 -142
- data/lib/capybara/spec/session/first_spec.rb +45 -44
- 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 +46 -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 +23 -23
- 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 +98 -12
- data/lib/capybara/spec/session/has_css_spec.rb +271 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
- data/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/lib/capybara/spec/session/has_field_spec.rb +137 -58
- data/lib/capybara/spec/session/has_link_spec.rb +46 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
- data/lib/capybara/spec/session/has_select_spec.rb +84 -50
- data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +181 -4
- data/lib/capybara/spec/session/has_text_spec.rb +101 -53
- 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 +37 -0
- data/lib/capybara/spec/session/node_spec.rb +958 -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 +65 -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 +119 -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 +41 -22
- data/lib/capybara/spec/session/unselect_spec.rb +37 -37
- data/lib/capybara/spec/session/visit_spec.rb +79 -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 +11 -8
- data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
- data/lib/capybara/spec/session/within_spec.rb +82 -44
- data/lib/capybara/spec/spec_helper.rb +46 -52
- data/lib/capybara/spec/test_app.rb +148 -41
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +156 -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 +46 -11
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +30 -5
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +21 -0
- data/lib/capybara/spec/views/with_scope.erb +2 -2
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_shadow.erb +31 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
- data/lib/capybara/spec/views/with_windows.erb +1 -1
- data/lib/capybara/spec/views/within_frames.erb +1 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +32 -26
- data/lib/capybara.rb +128 -104
- data/spec/basic_node_spec.rb +59 -34
- data/spec/capybara_spec.rb +65 -51
- data/spec/counter_spec.rb +35 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +84 -55
- 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 +5 -5
- data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
- data/spec/minitest_spec.rb +49 -5
- data/spec/minitest_spec_spec.rb +92 -62
- data/spec/per_session_config_spec.rb +6 -6
- data/spec/rack_test_spec.rb +183 -115
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +99 -39
- data/spec/rspec/features_spec.rb +28 -25
- data/spec/rspec/scenarios_spec.rb +10 -6
- data/spec/rspec/shared_spec_matchers.rb +418 -364
- data/spec/rspec/views_spec.rb +4 -3
- data/spec/rspec_matchers_spec.rb +35 -10
- data/spec/rspec_spec.rb +109 -85
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +392 -62
- data/spec/selenium_spec_chrome.rb +183 -41
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +41 -8
- data/spec/selenium_spec_firefox.rb +228 -0
- data/spec/selenium_spec_firefox_remote.rb +94 -0
- data/spec/selenium_spec_ie.rb +129 -11
- data/spec/selenium_spec_safari.rb +162 -0
- data/spec/server_spec.rb +192 -81
- data/spec/session_spec.rb +52 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +460 -123
- data/spec/spec_helper.rb +124 -2
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +344 -45
- 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
@@ -5,122 +5,255 @@ Capybara::SpecHelper.spec '#has_css?' do
|
|
5
5
|
@session.visit('/with_html')
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
9
|
-
expect(@session).to have_css(
|
10
|
-
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')
|
11
11
|
end
|
12
12
|
|
13
|
-
it
|
14
|
-
|
15
|
-
|
16
|
-
|
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)
|
17
20
|
end
|
18
21
|
|
19
|
-
it
|
20
|
-
@session.
|
21
|
-
|
22
|
-
|
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"\}/)
|
23
66
|
end
|
24
67
|
end
|
25
68
|
|
26
|
-
it
|
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
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'should wait for content to appear', requires: [:js] do
|
101
|
+
Capybara.default_max_wait_time = 2
|
27
102
|
@session.visit('/with_js')
|
28
103
|
@session.click_link('Click me')
|
29
104
|
expect(@session).to have_css("input[type='submit'][value='New Here']")
|
30
105
|
end
|
31
106
|
|
32
|
-
context
|
33
|
-
it
|
34
|
-
|
35
|
-
|
36
|
-
|
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)
|
37
139
|
end
|
38
140
|
|
39
|
-
it
|
40
|
-
expect(@session).not_to have_css(
|
41
|
-
expect(@session).not_to have_css(
|
42
|
-
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)
|
43
145
|
end
|
44
146
|
end
|
45
147
|
|
46
|
-
context
|
47
|
-
it
|
48
|
-
expect(@session).to have_css(
|
49
|
-
expect(@session).to have_css(
|
50
|
-
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)
|
51
160
|
end
|
52
161
|
|
53
|
-
it
|
54
|
-
expect(@session).
|
55
|
-
expect(@session).not_to have_css("p a#foo", count: 2)
|
56
|
-
expect(@session).not_to have_css("p a.doesnotexist", count: 1)
|
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)
|
57
164
|
end
|
58
165
|
|
59
|
-
it
|
60
|
-
expect(@session).
|
61
|
-
expect(@session).
|
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)
|
171
|
+
end
|
172
|
+
|
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')
|
62
176
|
end
|
63
177
|
end
|
64
178
|
|
65
|
-
context
|
66
|
-
it
|
67
|
-
expect(@session).to have_css(
|
68
|
-
expect(@session).to have_css(
|
69
|
-
expect(@session).to have_css(
|
70
|
-
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)
|
71
186
|
end
|
72
187
|
|
73
|
-
it
|
74
|
-
expect(@session).not_to have_css(
|
75
|
-
expect(@session).not_to have_css(
|
76
|
-
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)
|
77
193
|
end
|
78
194
|
|
79
|
-
it
|
80
|
-
expect(@session).to have_css(
|
81
|
-
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')
|
82
198
|
end
|
83
199
|
end
|
84
200
|
|
85
|
-
context
|
86
|
-
it
|
87
|
-
expect(@session).to have_css(
|
88
|
-
expect(@session).to have_css(
|
89
|
-
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)
|
90
207
|
end
|
91
208
|
|
92
|
-
it
|
93
|
-
expect(@session).not_to have_css(
|
94
|
-
expect(@session).not_to have_css(
|
95
|
-
expect(@session).not_to have_css(
|
96
|
-
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)
|
97
215
|
end
|
98
216
|
|
99
|
-
it
|
100
|
-
expect(@session).to have_css(
|
101
|
-
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')
|
102
220
|
end
|
103
221
|
end
|
104
222
|
|
105
|
-
context
|
106
|
-
it
|
107
|
-
expect(@session).to have_css(
|
108
|
-
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')
|
109
227
|
end
|
110
228
|
|
111
|
-
it
|
112
|
-
expect(@session).to have_css(
|
113
|
-
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$/)
|
114
232
|
end
|
115
233
|
end
|
116
234
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
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
|
123
253
|
end
|
254
|
+
end
|
255
|
+
|
256
|
+
it 'should allow escapes in the CSS selector' do
|
124
257
|
expect(@session).to have_css('p[data-random="abc\\\\def"]')
|
125
258
|
expect(@session).to have_css("p[data-random='#{Capybara::Selector::CSS.escape('abc\def')}']")
|
126
259
|
end
|
@@ -131,111 +264,112 @@ Capybara::SpecHelper.spec '#has_no_css?' do
|
|
131
264
|
@session.visit('/with_html')
|
132
265
|
end
|
133
266
|
|
134
|
-
it
|
135
|
-
expect(@session).not_to have_no_css(
|
136
|
-
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')
|
137
270
|
end
|
138
271
|
|
139
|
-
it
|
140
|
-
expect(@session).to have_no_css(
|
141
|
-
expect(@session).to have_no_css(
|
142
|
-
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')
|
143
276
|
end
|
144
277
|
|
145
|
-
it
|
278
|
+
it 'should respect scopes' do
|
146
279
|
@session.within "//p[@id='first']" do
|
147
|
-
expect(@session).not_to have_no_css(
|
148
|
-
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')
|
149
282
|
end
|
150
283
|
end
|
151
284
|
|
152
|
-
it
|
285
|
+
it 'should wait for content to disappear', requires: [:js] do
|
286
|
+
Capybara.default_max_wait_time = 2
|
153
287
|
@session.visit('/with_js')
|
154
288
|
@session.click_link('Click me')
|
155
|
-
expect(@session).to have_no_css(
|
289
|
+
expect(@session).to have_no_css('p#change')
|
156
290
|
end
|
157
291
|
|
158
|
-
context
|
159
|
-
it
|
160
|
-
expect(@session).not_to have_no_css(
|
161
|
-
expect(@session).not_to have_no_css(
|
162
|
-
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)
|
163
297
|
end
|
164
298
|
|
165
|
-
it
|
166
|
-
expect(@session).to have_no_css(
|
167
|
-
expect(@session).to have_no_css(
|
168
|
-
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)
|
169
303
|
end
|
170
304
|
end
|
171
305
|
|
172
|
-
context
|
173
|
-
it
|
174
|
-
expect(@session).not_to have_no_css(
|
175
|
-
expect(@session).not_to have_no_css(
|
176
|
-
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)
|
177
311
|
end
|
178
312
|
|
179
|
-
it
|
180
|
-
expect(@session).to have_no_css(
|
181
|
-
expect(@session).to have_no_css(
|
182
|
-
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)
|
183
317
|
end
|
184
318
|
|
185
|
-
it
|
186
|
-
expect(@session).not_to have_no_css(
|
187
|
-
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')
|
188
322
|
end
|
189
323
|
end
|
190
324
|
|
191
|
-
context
|
192
|
-
it
|
193
|
-
expect(@session).not_to have_no_css(
|
194
|
-
expect(@session).not_to have_no_css(
|
195
|
-
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)
|
196
330
|
end
|
197
331
|
|
198
|
-
it
|
199
|
-
expect(@session).to have_no_css(
|
200
|
-
expect(@session).to have_no_css(
|
201
|
-
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)
|
202
336
|
end
|
203
337
|
|
204
|
-
it
|
205
|
-
expect(@session).not_to have_no_css(
|
206
|
-
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')
|
207
341
|
end
|
208
342
|
end
|
209
343
|
|
210
|
-
context
|
211
|
-
it
|
212
|
-
expect(@session).not_to have_no_css(
|
213
|
-
expect(@session).not_to have_no_css(
|
214
|
-
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)
|
215
349
|
end
|
216
350
|
|
217
|
-
it
|
218
|
-
expect(@session).to have_no_css(
|
219
|
-
expect(@session).to have_no_css(
|
220
|
-
expect(@session).to have_no_css(
|
221
|
-
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)
|
222
356
|
end
|
223
357
|
|
224
|
-
it
|
225
|
-
expect(@session).not_to have_no_css(
|
226
|
-
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')
|
227
361
|
end
|
228
362
|
end
|
229
363
|
|
230
|
-
context
|
231
|
-
it
|
232
|
-
expect(@session).not_to have_no_css(
|
233
|
-
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')
|
234
368
|
end
|
235
369
|
|
236
|
-
it
|
237
|
-
expect(@session).not_to have_no_css(
|
238
|
-
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$/)
|
239
373
|
end
|
240
374
|
end
|
241
375
|
end
|