capybara 3.3.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 -0
- data/History.md +803 -13
- data/License.txt +1 -1
- data/README.md +257 -84
- data/lib/capybara/config.rb +25 -9
- data/lib/capybara/cucumber.rb +1 -1
- data/lib/capybara/driver/base.rb +17 -3
- data/lib/capybara/driver/node.rb +31 -6
- data/lib/capybara/dsl.rb +9 -7
- data/lib/capybara/helpers.rb +31 -7
- data/lib/capybara/minitest/spec.rb +180 -88
- data/lib/capybara/minitest.rb +262 -149
- data/lib/capybara/node/actions.rb +202 -116
- data/lib/capybara/node/base.rb +34 -19
- data/lib/capybara/node/document.rb +14 -2
- data/lib/capybara/node/document_matchers.rb +10 -12
- data/lib/capybara/node/element.rb +269 -115
- data/lib/capybara/node/finders.rb +99 -77
- data/lib/capybara/node/matchers.rb +327 -151
- data/lib/capybara/node/simple.rb +48 -13
- 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 +8 -9
- data/lib/capybara/queries/base_query.rb +23 -16
- data/lib/capybara/queries/current_path_query.rb +16 -6
- data/lib/capybara/queries/match_query.rb +1 -0
- data/lib/capybara/queries/selector_query.rb +587 -130
- data/lib/capybara/queries/sibling_query.rb +8 -6
- data/lib/capybara/queries/style_query.rb +6 -2
- data/lib/capybara/queries/text_query.rb +28 -14
- data/lib/capybara/queries/title_query.rb +2 -2
- data/lib/capybara/rack_test/browser.rb +92 -25
- 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 +68 -41
- data/lib/capybara/rack_test/node.rb +106 -39
- 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 +75 -52
- data/lib/capybara/rspec/features.rb +7 -7
- 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 +141 -339
- data/lib/capybara/rspec.rb +2 -0
- 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 +27 -25
- 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 +73 -25
- data/lib/capybara/selector/filters/base.rb +24 -5
- data/lib/capybara/selector/filters/expression_filter.rb +3 -3
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +16 -2
- data/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/lib/capybara/selector/selector.rb +85 -348
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +474 -447
- 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 +255 -143
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +93 -11
- 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 +436 -134
- 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 +56 -19
- data/lib/capybara/server/checker.rb +9 -3
- data/lib/capybara/server/middleware.rb +28 -12
- data/lib/capybara/server.rb +33 -10
- data/lib/capybara/session/config.rb +34 -10
- data/lib/capybara/session/matchers.rb +23 -16
- data/lib/capybara/session.rb +230 -170
- 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 +121 -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 +127 -40
- 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_spec.rb +21 -18
- data/lib/capybara/spec/session/assert_selector_spec.rb +52 -58
- data/lib/capybara/spec/session/assert_style_spec.rb +7 -7
- data/lib/capybara/spec/session/assert_text_spec.rb +74 -50
- data/lib/capybara/spec/session/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 +6 -6
- data/lib/capybara/spec/session/check_spec.rb +102 -47
- data/lib/capybara/spec/session/choose_spec.rb +58 -32
- data/lib/capybara/spec/session/click_button_spec.rb +219 -163
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -23
- data/lib/capybara/spec/session/click_link_spec.rb +77 -54
- data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
- data/lib/capybara/spec/session/current_url_spec.rb +38 -29
- 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_spec.rb +8 -8
- data/lib/capybara/spec/session/element/match_css_spec.rb +16 -10
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +68 -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 +101 -46
- data/lib/capybara/spec/session/find_button_spec.rb +23 -23
- data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
- data/lib/capybara/spec/session/find_field_spec.rb +32 -30
- data/lib/capybara/spec/session/find_link_spec.rb +31 -21
- data/lib/capybara/spec/session/find_spec.rb +244 -141
- data/lib/capybara/spec/session/first_spec.rb +43 -43
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +30 -18
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +45 -18
- 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 +94 -13
- data/lib/capybara/spec/session/has_css_spec.rb +272 -132
- 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 +44 -4
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +31 -31
- data/lib/capybara/spec/session/has_select_spec.rb +84 -50
- data/lib/capybara/spec/session/has_selector_spec.rb +111 -71
- 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_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 +894 -142
- data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
- data/lib/capybara/spec/session/refresh_spec.rb +9 -7
- data/lib/capybara/spec/session/reset_session_spec.rb +63 -35
- data/lib/capybara/spec/session/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 +2 -2
- data/lib/capybara/spec/session/save_page_spec.rb +37 -37
- data/lib/capybara/spec/session/save_screenshot_spec.rb +10 -10
- 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 +85 -85
- data/lib/capybara/spec/session/selectors_spec.rb +49 -18
- data/lib/capybara/spec/session/sibling_spec.rb +9 -9
- data/lib/capybara/spec/session/text_spec.rb +25 -24
- data/lib/capybara/spec/session/title_spec.rb +7 -6
- data/lib/capybara/spec/session/uncheck_spec.rb +33 -21
- data/lib/capybara/spec/session/unselect_spec.rb +37 -37
- data/lib/capybara/spec/session/visit_spec.rb +68 -49
- data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +20 -16
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +6 -2
- data/lib/capybara/spec/session/window/window_spec.rb +62 -63
- data/lib/capybara/spec/session/window/windows_spec.rb +5 -1
- data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
- data/lib/capybara/spec/session/within_spec.rb +79 -42
- data/lib/capybara/spec/spec_helper.rb +41 -53
- data/lib/capybara/spec/test_app.rb +132 -43
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +139 -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 +67 -0
- data/lib/capybara/spec/views/with_animation.erb +39 -4
- 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 +37 -9
- 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 +26 -5
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +1 -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 +19 -25
- data/lib/capybara.rb +126 -111
- data/spec/basic_node_spec.rb +59 -34
- data/spec/capybara_spec.rb +56 -44
- data/spec/counter_spec.rb +35 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +8 -8
- data/spec/dsl_spec.rb +79 -52
- data/spec/filter_set_spec.rb +9 -9
- data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
- data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
- data/spec/minitest_spec.rb +45 -7
- data/spec/minitest_spec_spec.rb +87 -64
- data/spec/per_session_config_spec.rb +6 -6
- data/spec/rack_test_spec.rb +172 -116
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +80 -72
- data/spec/rspec/features_spec.rb +21 -16
- data/spec/rspec/scenarios_spec.rb +10 -6
- data/spec/rspec/shared_spec_matchers.rb +407 -365
- data/spec/rspec/views_spec.rb +3 -3
- data/spec/rspec_matchers_spec.rb +35 -10
- data/spec/rspec_spec.rb +63 -41
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +334 -89
- data/spec/selenium_spec_chrome.rb +176 -62
- data/spec/selenium_spec_chrome_remote.rb +54 -14
- 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 +171 -97
- data/spec/session_spec.rb +34 -18
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +344 -80
- data/spec/spec_helper.rb +124 -2
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +326 -28
- data/lib/capybara/rspec/compound.rb +0 -94
- data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +0 -31
- data/lib/capybara/selenium/nodes/marionette_node.rb +0 -31
- data/lib/capybara/spec/session/has_style_spec.rb +0 -25
- 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 -167
|
@@ -5,116 +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"\}/)
|
|
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
|
|
23
97
|
end
|
|
24
98
|
end
|
|
25
99
|
|
|
26
|
-
it
|
|
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')
|
|
227
|
+
end
|
|
228
|
+
|
|
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$/)
|
|
232
|
+
end
|
|
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
|
|
109
247
|
end
|
|
110
248
|
|
|
111
|
-
it
|
|
112
|
-
expect(@session).to have_css(
|
|
113
|
-
expect(@session).
|
|
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
|
|
114
253
|
end
|
|
115
254
|
end
|
|
116
255
|
|
|
117
|
-
it
|
|
256
|
+
it 'should allow escapes in the CSS selector' do
|
|
118
257
|
expect(@session).to have_css('p[data-random="abc\\\\def"]')
|
|
119
258
|
expect(@session).to have_css("p[data-random='#{Capybara::Selector::CSS.escape('abc\def')}']")
|
|
120
259
|
end
|
|
@@ -125,111 +264,112 @@ Capybara::SpecHelper.spec '#has_no_css?' do
|
|
|
125
264
|
@session.visit('/with_html')
|
|
126
265
|
end
|
|
127
266
|
|
|
128
|
-
it
|
|
129
|
-
expect(@session).not_to have_no_css(
|
|
130
|
-
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')
|
|
131
270
|
end
|
|
132
271
|
|
|
133
|
-
it
|
|
134
|
-
expect(@session).to have_no_css(
|
|
135
|
-
expect(@session).to have_no_css(
|
|
136
|
-
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')
|
|
137
276
|
end
|
|
138
277
|
|
|
139
|
-
it
|
|
278
|
+
it 'should respect scopes' do
|
|
140
279
|
@session.within "//p[@id='first']" do
|
|
141
|
-
expect(@session).not_to have_no_css(
|
|
142
|
-
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')
|
|
143
282
|
end
|
|
144
283
|
end
|
|
145
284
|
|
|
146
|
-
it
|
|
285
|
+
it 'should wait for content to disappear', requires: [:js] do
|
|
286
|
+
Capybara.default_max_wait_time = 2
|
|
147
287
|
@session.visit('/with_js')
|
|
148
288
|
@session.click_link('Click me')
|
|
149
|
-
expect(@session).to have_no_css(
|
|
289
|
+
expect(@session).to have_no_css('p#change')
|
|
150
290
|
end
|
|
151
291
|
|
|
152
|
-
context
|
|
153
|
-
it
|
|
154
|
-
expect(@session).not_to have_no_css(
|
|
155
|
-
expect(@session).not_to have_no_css(
|
|
156
|
-
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)
|
|
157
297
|
end
|
|
158
298
|
|
|
159
|
-
it
|
|
160
|
-
expect(@session).to have_no_css(
|
|
161
|
-
expect(@session).to have_no_css(
|
|
162
|
-
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)
|
|
163
303
|
end
|
|
164
304
|
end
|
|
165
305
|
|
|
166
|
-
context
|
|
167
|
-
it
|
|
168
|
-
expect(@session).not_to have_no_css(
|
|
169
|
-
expect(@session).not_to have_no_css(
|
|
170
|
-
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)
|
|
171
311
|
end
|
|
172
312
|
|
|
173
|
-
it
|
|
174
|
-
expect(@session).to have_no_css(
|
|
175
|
-
expect(@session).to have_no_css(
|
|
176
|
-
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)
|
|
177
317
|
end
|
|
178
318
|
|
|
179
|
-
it
|
|
180
|
-
expect(@session).not_to have_no_css(
|
|
181
|
-
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')
|
|
182
322
|
end
|
|
183
323
|
end
|
|
184
324
|
|
|
185
|
-
context
|
|
186
|
-
it
|
|
187
|
-
expect(@session).not_to have_no_css(
|
|
188
|
-
expect(@session).not_to have_no_css(
|
|
189
|
-
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)
|
|
190
330
|
end
|
|
191
331
|
|
|
192
|
-
it
|
|
193
|
-
expect(@session).to have_no_css(
|
|
194
|
-
expect(@session).to have_no_css(
|
|
195
|
-
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)
|
|
196
336
|
end
|
|
197
337
|
|
|
198
|
-
it
|
|
199
|
-
expect(@session).not_to have_no_css(
|
|
200
|
-
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')
|
|
201
341
|
end
|
|
202
342
|
end
|
|
203
343
|
|
|
204
|
-
context
|
|
205
|
-
it
|
|
206
|
-
expect(@session).not_to have_no_css(
|
|
207
|
-
expect(@session).not_to have_no_css(
|
|
208
|
-
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)
|
|
209
349
|
end
|
|
210
350
|
|
|
211
|
-
it
|
|
212
|
-
expect(@session).to have_no_css(
|
|
213
|
-
expect(@session).to have_no_css(
|
|
214
|
-
expect(@session).to have_no_css(
|
|
215
|
-
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)
|
|
216
356
|
end
|
|
217
357
|
|
|
218
|
-
it
|
|
219
|
-
expect(@session).not_to have_no_css(
|
|
220
|
-
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')
|
|
221
361
|
end
|
|
222
362
|
end
|
|
223
363
|
|
|
224
|
-
context
|
|
225
|
-
it
|
|
226
|
-
expect(@session).not_to have_no_css(
|
|
227
|
-
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')
|
|
228
368
|
end
|
|
229
369
|
|
|
230
|
-
it
|
|
231
|
-
expect(@session).not_to have_no_css(
|
|
232
|
-
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$/)
|
|
233
373
|
end
|
|
234
374
|
end
|
|
235
375
|
end
|