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,35 +5,39 @@ Capybara::SpecHelper.spec '#has_title?' do
|
|
5
5
|
@session.visit('/with_js')
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
8
|
+
it 'should be true if the page has the given title' do
|
9
9
|
expect(@session).to have_title('with_js')
|
10
|
+
expect(@session.has_title?('with_js')).to be true
|
10
11
|
end
|
11
12
|
|
12
|
-
it
|
13
|
+
it 'should allow regexp matches' do
|
13
14
|
expect(@session).to have_title(/w[a-z]{3}_js/)
|
14
15
|
expect(@session).not_to have_title(/monkey/)
|
15
16
|
end
|
16
17
|
|
17
|
-
it
|
18
|
-
@session.click_link(
|
19
|
-
expect(@session).to have_title(
|
18
|
+
it 'should wait for title', requires: [:js] do
|
19
|
+
@session.click_link('Change title')
|
20
|
+
expect(@session).to have_title('changed title')
|
20
21
|
end
|
21
22
|
|
22
|
-
it
|
23
|
+
it 'should be false if the page has not the given title' do
|
23
24
|
expect(@session).not_to have_title('monkey')
|
25
|
+
expect(@session.has_title?('monkey')).to be false
|
24
26
|
end
|
25
27
|
|
26
|
-
it
|
28
|
+
it 'should default to exact: false matching' do
|
27
29
|
expect(@session).to have_title('with_js', exact: false)
|
28
30
|
expect(@session).to have_title('with_', exact: false)
|
29
31
|
end
|
30
32
|
|
31
|
-
it
|
33
|
+
it 'should match exactly if exact: true option passed' do
|
32
34
|
expect(@session).to have_title('with_js', exact: true)
|
33
35
|
expect(@session).not_to have_title('with_', exact: true)
|
36
|
+
expect(@session.has_title?('with_js', exact: true)).to be true
|
37
|
+
expect(@session.has_title?('with_', exact: true)).to be false
|
34
38
|
end
|
35
39
|
|
36
|
-
it
|
40
|
+
it 'should match partial if exact: false option passed' do
|
37
41
|
expect(@session).to have_title('with_js', exact: false)
|
38
42
|
expect(@session).to have_title('with_', exact: false)
|
39
43
|
end
|
@@ -44,23 +48,24 @@ Capybara::SpecHelper.spec '#has_no_title?' do
|
|
44
48
|
@session.visit('/with_js')
|
45
49
|
end
|
46
50
|
|
47
|
-
it
|
51
|
+
it 'should be false if the page has the given title' do
|
48
52
|
expect(@session).not_to have_no_title('with_js')
|
49
53
|
end
|
50
54
|
|
51
|
-
it
|
55
|
+
it 'should allow regexp matches' do
|
52
56
|
expect(@session).not_to have_no_title(/w[a-z]{3}_js/)
|
53
57
|
expect(@session).to have_no_title(/monkey/)
|
54
58
|
end
|
55
59
|
|
56
|
-
it
|
60
|
+
it 'should wait for title to disappear', requires: [:js] do
|
57
61
|
Capybara.using_wait_time(5) do
|
58
|
-
@session.click_link(
|
62
|
+
@session.click_link('Change title') # triggers title change after 400ms
|
59
63
|
expect(@session).to have_no_title('with_js')
|
60
64
|
end
|
61
65
|
end
|
62
66
|
|
63
|
-
it
|
67
|
+
it 'should be true if the page has not the given title' do
|
64
68
|
expect(@session).to have_no_title('monkey')
|
69
|
+
expect(@session.has_no_title?('monkey')).to be true
|
65
70
|
end
|
66
71
|
end
|
@@ -5,31 +5,45 @@ Capybara::SpecHelper.spec '#has_xpath?' do
|
|
5
5
|
@session.visit('/with_html')
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
9
|
-
expect(@session).to have_xpath(
|
8
|
+
it 'should be true if the given selector is on the page' do
|
9
|
+
expect(@session).to have_xpath('//p')
|
10
10
|
expect(@session).to have_xpath("//p//a[@id='foo']")
|
11
11
|
expect(@session).to have_xpath("//p[contains(.,'est')]")
|
12
12
|
end
|
13
13
|
|
14
|
-
it
|
15
|
-
expect(@session).
|
14
|
+
it 'should support :id option' do
|
15
|
+
expect(@session).to have_xpath('//h2', id: 'h2one')
|
16
|
+
expect(@session).to have_xpath('//h2')
|
17
|
+
expect(@session).to have_xpath('//h2', id: /h2o/)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should support :class option' do
|
21
|
+
expect(@session).to have_xpath('//li', class: 'guitarist')
|
22
|
+
expect(@session).to have_xpath('//li', class: /guitar/)
|
23
|
+
expect(@session).to have_xpath('//li', class: /guitar|drummer/)
|
24
|
+
expect(@session).to have_xpath('//li', class: %w[beatle guitarist])
|
25
|
+
expect(@session).to have_xpath('//li', class: /.*/)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should be false if the given selector is not on the page' do
|
29
|
+
expect(@session).not_to have_xpath('//abbr')
|
16
30
|
expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
|
17
31
|
expect(@session).not_to have_xpath("//p[contains(.,'thisstringisnotonpage')]")
|
18
32
|
end
|
19
33
|
|
20
|
-
it
|
34
|
+
it 'should use xpath even if default selector is CSS' do
|
21
35
|
Capybara.default_selector = :css
|
22
36
|
expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
|
23
37
|
end
|
24
38
|
|
25
|
-
it
|
39
|
+
it 'should respect scopes' do
|
26
40
|
@session.within "//p[@id='first']" do
|
27
41
|
expect(@session).to have_xpath(".//a[@id='foo']")
|
28
42
|
expect(@session).not_to have_xpath(".//a[@id='red']")
|
29
43
|
end
|
30
44
|
end
|
31
45
|
|
32
|
-
it
|
46
|
+
it 'should wait for content to appear', requires: [:js] do
|
33
47
|
Capybara.using_wait_time(3) do
|
34
48
|
@session.visit('/with_js')
|
35
49
|
@session.click_link('Click me') # updates page after 500ms
|
@@ -37,31 +51,34 @@ Capybara::SpecHelper.spec '#has_xpath?' do
|
|
37
51
|
end
|
38
52
|
end
|
39
53
|
|
40
|
-
context
|
41
|
-
it
|
42
|
-
expect(@session).to have_xpath(
|
54
|
+
context 'with count' do
|
55
|
+
it 'should be true if the content occurs the given number of times' do
|
56
|
+
expect(@session).to have_xpath('//p', count: 3)
|
43
57
|
expect(@session).to have_xpath("//p//a[@id='foo']", count: 1)
|
44
58
|
expect(@session).to have_xpath("//p[contains(.,'est')]", count: 1)
|
45
59
|
expect(@session).to have_xpath("//p//a[@id='doesnotexist']", count: 0)
|
60
|
+
expect(@session).to have_xpath('//li', class: /guitar|drummer/, count: 4)
|
61
|
+
expect(@session).to have_xpath('//li', id: /john|paul/, class: /guitar|drummer/, count: 2)
|
62
|
+
expect(@session).to have_xpath('//li', class: %w[beatle guitarist], count: 2)
|
46
63
|
end
|
47
64
|
|
48
|
-
it
|
49
|
-
expect(@session).not_to have_xpath(
|
65
|
+
it 'should be false if the content occurs a different number of times than the given' do
|
66
|
+
expect(@session).not_to have_xpath('//p', count: 6)
|
50
67
|
expect(@session).not_to have_xpath("//p//a[@id='foo']", count: 2)
|
51
68
|
expect(@session).not_to have_xpath("//p[contains(.,'est')]", count: 5)
|
52
69
|
expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']", count: 1)
|
53
70
|
end
|
54
71
|
end
|
55
72
|
|
56
|
-
context
|
57
|
-
it
|
58
|
-
expect(@session).to have_xpath(
|
59
|
-
expect(@session).not_to have_xpath(
|
73
|
+
context 'with text' do
|
74
|
+
it 'should discard all matches where the given string is not contained' do
|
75
|
+
expect(@session).to have_xpath('//p//a', text: 'Redirect', count: 1)
|
76
|
+
expect(@session).not_to have_xpath('//p', text: 'Doesnotexist')
|
60
77
|
end
|
61
78
|
|
62
|
-
it
|
63
|
-
expect(@session).to have_xpath(
|
64
|
-
expect(@session).not_to have_xpath(
|
79
|
+
it 'should discard all matches where the given regexp is not matched' do
|
80
|
+
expect(@session).to have_xpath('//p//a', text: /re[dab]i/i, count: 1)
|
81
|
+
expect(@session).not_to have_xpath('//p//a', text: /Red$/)
|
65
82
|
end
|
66
83
|
end
|
67
84
|
end
|
@@ -71,61 +88,62 @@ Capybara::SpecHelper.spec '#has_no_xpath?' do
|
|
71
88
|
@session.visit('/with_html')
|
72
89
|
end
|
73
90
|
|
74
|
-
it
|
75
|
-
expect(@session).not_to have_no_xpath(
|
91
|
+
it 'should be false if the given selector is on the page' do
|
92
|
+
expect(@session).not_to have_no_xpath('//p')
|
76
93
|
expect(@session).not_to have_no_xpath("//p//a[@id='foo']")
|
77
94
|
expect(@session).not_to have_no_xpath("//p[contains(.,'est')]")
|
78
95
|
end
|
79
96
|
|
80
|
-
it
|
81
|
-
expect(@session).to have_no_xpath(
|
97
|
+
it 'should be true if the given selector is not on the page' do
|
98
|
+
expect(@session).to have_no_xpath('//abbr')
|
82
99
|
expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
|
83
100
|
expect(@session).to have_no_xpath("//p[contains(.,'thisstringisnotonpage')]")
|
84
101
|
end
|
85
102
|
|
86
|
-
it
|
103
|
+
it 'should use xpath even if default selector is CSS' do
|
87
104
|
Capybara.default_selector = :css
|
88
105
|
expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
|
89
106
|
end
|
90
107
|
|
91
|
-
it
|
108
|
+
it 'should respect scopes' do
|
92
109
|
@session.within "//p[@id='first']" do
|
93
110
|
expect(@session).not_to have_no_xpath(".//a[@id='foo']")
|
94
111
|
expect(@session).to have_no_xpath(".//a[@id='red']")
|
95
112
|
end
|
96
113
|
end
|
97
114
|
|
98
|
-
it
|
115
|
+
it 'should wait for content to disappear', requires: [:js] do
|
116
|
+
Capybara.default_max_wait_time = 2
|
99
117
|
@session.visit('/with_js')
|
100
118
|
@session.click_link('Click me')
|
101
119
|
expect(@session).to have_no_xpath("//p[@id='change']")
|
102
120
|
end
|
103
121
|
|
104
|
-
context
|
105
|
-
it
|
106
|
-
expect(@session).not_to have_no_xpath(
|
122
|
+
context 'with count' do
|
123
|
+
it 'should be false if the content occurs the given number of times' do
|
124
|
+
expect(@session).not_to have_no_xpath('//p', count: 3)
|
107
125
|
expect(@session).not_to have_no_xpath("//p//a[@id='foo']", count: 1)
|
108
126
|
expect(@session).not_to have_no_xpath("//p[contains(.,'est')]", count: 1)
|
109
127
|
expect(@session).not_to have_no_xpath("//p//a[@id='doesnotexist']", count: 0)
|
110
128
|
end
|
111
129
|
|
112
|
-
it
|
113
|
-
expect(@session).to have_no_xpath(
|
130
|
+
it 'should be true if the content occurs a different number of times than the given' do
|
131
|
+
expect(@session).to have_no_xpath('//p', count: 6)
|
114
132
|
expect(@session).to have_no_xpath("//p//a[@id='foo']", count: 2)
|
115
133
|
expect(@session).to have_no_xpath("//p[contains(.,'est')]", count: 5)
|
116
134
|
expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']", count: 1)
|
117
135
|
end
|
118
136
|
end
|
119
137
|
|
120
|
-
context
|
121
|
-
it
|
122
|
-
expect(@session).not_to have_no_xpath(
|
123
|
-
expect(@session).to have_no_xpath(
|
138
|
+
context 'with text' do
|
139
|
+
it 'should discard all matches where the given string is contained' do
|
140
|
+
expect(@session).not_to have_no_xpath('//p//a', text: 'Redirect', count: 1)
|
141
|
+
expect(@session).to have_no_xpath('//p', text: 'Doesnotexist')
|
124
142
|
end
|
125
143
|
|
126
|
-
it
|
127
|
-
expect(@session).not_to have_no_xpath(
|
128
|
-
expect(@session).to have_no_xpath(
|
144
|
+
it 'should discard all matches where the given regexp is matched' do
|
145
|
+
expect(@session).not_to have_no_xpath('//p//a', text: /re[dab]i/i, count: 1)
|
146
|
+
expect(@session).to have_no_xpath('//p//a', text: /Red$/)
|
129
147
|
end
|
130
148
|
end
|
131
149
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
Capybara::SpecHelper.spec '#response_headers' do
|
4
|
-
it
|
4
|
+
it 'should return response headers', requires: [:response_headers] do
|
5
5
|
@session.visit('/with_simple_html')
|
6
6
|
expect(@session.response_headers['Content-Type']).to match %r{text/html}
|
7
7
|
end
|
@@ -1,39 +1,46 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# NOTE: This file uses `sleep` to sync up parts of the tests. This is only implemented like this
|
4
|
+
# because of the methods being tested. In tests using Capybara this type of behavior should be implemented
|
5
|
+
# using Capybara provided assertions with builtin waiting behavior.
|
6
|
+
|
3
7
|
Capybara::SpecHelper.spec '#html' do
|
4
|
-
it
|
8
|
+
it 'should return the unmodified page body' do
|
5
9
|
@session.visit('/')
|
6
10
|
expect(@session.html).to include('Hello world!')
|
7
11
|
end
|
8
12
|
|
9
|
-
it
|
13
|
+
it 'should return the current state of the page', requires: [:js] do
|
10
14
|
@session.visit('/with_js')
|
15
|
+
sleep 1
|
11
16
|
expect(@session.html).to include('I changed it')
|
12
17
|
expect(@session.html).not_to include('This is text')
|
13
18
|
end
|
14
19
|
end
|
15
20
|
|
16
21
|
Capybara::SpecHelper.spec '#source' do
|
17
|
-
it
|
22
|
+
it 'should return the unmodified page source' do
|
18
23
|
@session.visit('/')
|
19
24
|
expect(@session.source).to include('Hello world!')
|
20
25
|
end
|
21
26
|
|
22
|
-
it
|
27
|
+
it 'should return the current state of the page', requires: [:js] do
|
23
28
|
@session.visit('/with_js')
|
29
|
+
sleep 1
|
24
30
|
expect(@session.source).to include('I changed it')
|
25
31
|
expect(@session.source).not_to include('This is text')
|
26
32
|
end
|
27
33
|
end
|
28
34
|
|
29
35
|
Capybara::SpecHelper.spec '#body' do
|
30
|
-
it
|
36
|
+
it 'should return the unmodified page source' do
|
31
37
|
@session.visit('/')
|
32
38
|
expect(@session.body).to include('Hello world!')
|
33
39
|
end
|
34
40
|
|
35
|
-
it
|
41
|
+
it 'should return the current state of the page', requires: [:js] do
|
36
42
|
@session.visit('/with_js')
|
43
|
+
sleep 1
|
37
44
|
expect(@session.body).to include('I changed it')
|
38
45
|
expect(@session.body).not_to include('This is text')
|
39
46
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Capybara::SpecHelper.spec '#matches_style?', requires: [:css] do
|
4
|
+
before do
|
5
|
+
@session.visit('/with_html')
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'should be true if the element has the given style' do
|
9
|
+
expect(@session.find(:css, '#first')).to match_style(display: 'block')
|
10
|
+
expect(@session.find(:css, '#first').matches_style?(display: 'block')).to be true
|
11
|
+
expect(@session.find(:css, '#second')).to match_style('display' => 'inline')
|
12
|
+
expect(@session.find(:css, '#second').matches_style?('display' => 'inline')).to be true
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should be false if the element does not have the given style' do
|
16
|
+
expect(@session.find(:css, '#first').matches_style?('display' => 'inline')).to be false
|
17
|
+
expect(@session.find(:css, '#second').matches_style?(display: 'block')).to be false
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'allows Regexp for value matching' do
|
21
|
+
expect(@session.find(:css, '#first')).to match_style(display: /^bl/)
|
22
|
+
expect(@session.find(:css, '#first').matches_style?('display' => /^bl/)).to be true
|
23
|
+
expect(@session.find(:css, '#first').matches_style?(display: /^in/)).to be false
|
24
|
+
end
|
25
|
+
|
26
|
+
# rubocop:disable Capybara/MatchStyle
|
27
|
+
it 'deprecated has_style?' do
|
28
|
+
expect { have_style(display: /^bl/) }.to \
|
29
|
+
output(/have_style is deprecated/).to_stderr
|
30
|
+
|
31
|
+
el = @session.find(:css, '#first')
|
32
|
+
allow(Capybara::Helpers).to receive(:warn).and_return(nil)
|
33
|
+
el.has_style?('display' => /^bl/)
|
34
|
+
expect(Capybara::Helpers).to have_received(:warn)
|
35
|
+
end
|
36
|
+
# rubocop:enable Capybara/MatchStyle
|
37
|
+
end
|