capybara 2.18.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 +945 -12
- data/License.txt +1 -1
- data/README.md +264 -90
- data/lib/capybara/config.rb +29 -57
- data/lib/capybara/cucumber.rb +2 -3
- data/lib/capybara/driver/base.rb +35 -18
- data/lib/capybara/driver/node.rb +40 -10
- data/lib/capybara/dsl.rb +10 -7
- data/lib/capybara/helpers.rb +70 -31
- data/lib/capybara/minitest/spec.rb +185 -83
- data/lib/capybara/minitest.rb +232 -112
- data/lib/capybara/node/actions.rb +274 -171
- data/lib/capybara/node/base.rb +42 -34
- data/lib/capybara/node/document.rb +15 -3
- data/lib/capybara/node/document_matchers.rb +19 -21
- data/lib/capybara/node/element.rb +362 -135
- data/lib/capybara/node/finders.rb +151 -137
- data/lib/capybara/node/matchers.rb +394 -209
- data/lib/capybara/node/simple.rb +59 -26
- 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 +12 -9
- data/lib/capybara/queries/base_query.rb +39 -28
- data/lib/capybara/queries/current_path_query.rb +21 -27
- data/lib/capybara/queries/match_query.rb +14 -7
- data/lib/capybara/queries/selector_query.rb +659 -149
- data/lib/capybara/queries/sibling_query.rb +11 -9
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +56 -38
- data/lib/capybara/queries/title_query.rb +8 -11
- data/lib/capybara/rack_test/browser.rb +114 -42
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +22 -17
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +93 -58
- data/lib/capybara/rack_test/node.rb +184 -81
- data/lib/capybara/rails.rb +3 -7
- 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 +97 -63
- data/lib/capybara/rspec/features.rb +17 -50
- data/lib/capybara/rspec/matcher_proxies.rb +52 -15
- 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 +146 -310
- data/lib/capybara/rspec.rb +7 -11
- 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 -13
- 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 +2 -17
- data/lib/capybara/selector/filter_set.rb +80 -33
- data/lib/capybara/selector/filters/base.rb +50 -6
- data/lib/capybara/selector/filters/expression_filter.rb +8 -26
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +16 -12
- data/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/lib/capybara/selector/selector.rb +93 -210
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +475 -523
- 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 +298 -267
- 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 +517 -145
- 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 +59 -67
- data/lib/capybara/session/config.rb +81 -67
- data/lib/capybara/session/matchers.rb +28 -20
- data/lib/capybara/session.rb +337 -365
- 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 +151 -12
- data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
- data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
- data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +161 -57
- data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
- data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
- data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
- data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
- data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
- data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +22 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
- data/lib/capybara/spec/session/body_spec.rb +12 -13
- data/lib/capybara/spec/session/check_spec.rb +117 -55
- data/lib/capybara/spec/session/choose_spec.rb +64 -31
- data/lib/capybara/spec/session/click_button_spec.rb +231 -173
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
- data/lib/capybara/spec/session/click_link_spec.rb +93 -58
- data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
- data/lib/capybara/spec/session/current_url_spec.rb +57 -39
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -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 +9 -7
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
- data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
- data/lib/capybara/spec/session/find_button_spec.rb +25 -24
- data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
- data/lib/capybara/spec/session/find_field_spec.rb +37 -41
- data/lib/capybara/spec/session/find_link_spec.rb +46 -17
- data/lib/capybara/spec/session/find_spec.rb +260 -145
- data/lib/capybara/spec/session/first_spec.rb +80 -52
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +33 -20
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
- data/lib/capybara/spec/session/go_back_spec.rb +2 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
- 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 +100 -13
- data/lib/capybara/spec/session/has_css_spec.rb +272 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
- data/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/lib/capybara/spec/session/has_field_spec.rb +139 -59
- data/lib/capybara/spec/session/has_link_spec.rb +47 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
- data/lib/capybara/spec/session/has_select_spec.rb +107 -72
- data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +183 -5
- data/lib/capybara/spec/session/has_text_spec.rb +106 -62
- data/lib/capybara/spec/session/has_title_spec.rb +20 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
- data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
- data/lib/capybara/spec/session/html_spec.rb +14 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
- data/lib/capybara/spec/session/node_spec.rb +1024 -153
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +12 -6
- data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
- data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
- data/lib/capybara/spec/session/save_page_spec.rb +42 -55
- data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +119 -0
- data/lib/capybara/spec/session/select_spec.rb +107 -81
- data/lib/capybara/spec/session/selectors_spec.rb +52 -19
- data/lib/capybara/spec/session/sibling_spec.rb +10 -10
- data/lib/capybara/spec/session/text_spec.rb +37 -21
- data/lib/capybara/spec/session/title_spec.rb +17 -5
- data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
- data/lib/capybara/spec/session/unselect_spec.rb +39 -38
- data/lib/capybara/spec/session/visit_spec.rb +85 -53
- data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
- data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
- data/lib/capybara/spec/session/window/window_spec.rb +97 -63
- data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
- data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
- data/lib/capybara/spec/session/within_spec.rb +83 -44
- data/lib/capybara/spec/spec_helper.rb +54 -44
- data/lib/capybara/spec/test_app.rb +158 -43
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +163 -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 +69 -12
- 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 +5 -2
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +36 -34
- data/lib/capybara.rb +134 -107
- data/spec/basic_node_spec.rb +60 -34
- data/spec/capybara_spec.rb +63 -88
- 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 +85 -64
- data/spec/filter_set_spec.rb +27 -9
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
- data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
- data/spec/minitest_spec.rb +52 -7
- data/spec/minitest_spec_spec.rb +94 -63
- data/spec/per_session_config_spec.rb +14 -13
- data/spec/rack_test_spec.rb +194 -125
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +111 -50
- data/spec/rspec/features_spec.rb +37 -31
- data/spec/rspec/scenarios_spec.rb +10 -8
- data/spec/rspec/shared_spec_matchers.rb +473 -422
- data/spec/rspec/views_spec.rb +5 -3
- data/spec/rspec_matchers_spec.rb +52 -11
- data/spec/rspec_spec.rb +109 -89
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +397 -68
- data/spec/selenium_spec_chrome.rb +187 -40
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +60 -0
- data/spec/selenium_spec_firefox.rb +201 -41
- data/spec/selenium_spec_firefox_remote.rb +94 -0
- data/spec/selenium_spec_ie.rb +149 -0
- data/spec/selenium_spec_safari.rb +162 -0
- data/spec/server_spec.rb +213 -102
- data/spec/session_spec.rb +53 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +473 -122
- data/spec/spec_helper.rb +126 -7
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +355 -73
- 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/query.rb +0 -7
- data/lib/capybara/rspec/compound.rb +0 -95
- data/lib/capybara/spec/session/assert_current_path.rb +0 -72
- data/lib/capybara/spec/session/assert_selector.rb +0 -148
- data/lib/capybara/spec/session/assert_text.rb +0 -234
- 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 -127
|
@@ -1,34 +1,49 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#has_xpath?' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
-
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')
|
|
9
10
|
expect(@session).to have_xpath("//p//a[@id='foo']")
|
|
10
11
|
expect(@session).to have_xpath("//p[contains(.,'est')]")
|
|
11
12
|
end
|
|
12
13
|
|
|
13
|
-
it
|
|
14
|
-
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')
|
|
15
30
|
expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
|
|
16
31
|
expect(@session).not_to have_xpath("//p[contains(.,'thisstringisnotonpage')]")
|
|
17
32
|
end
|
|
18
33
|
|
|
19
|
-
it
|
|
34
|
+
it 'should use xpath even if default selector is CSS' do
|
|
20
35
|
Capybara.default_selector = :css
|
|
21
36
|
expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
|
|
22
37
|
end
|
|
23
38
|
|
|
24
|
-
it
|
|
39
|
+
it 'should respect scopes' do
|
|
25
40
|
@session.within "//p[@id='first']" do
|
|
26
41
|
expect(@session).to have_xpath(".//a[@id='foo']")
|
|
27
42
|
expect(@session).not_to have_xpath(".//a[@id='red']")
|
|
28
43
|
end
|
|
29
44
|
end
|
|
30
45
|
|
|
31
|
-
it
|
|
46
|
+
it 'should wait for content to appear', requires: [:js] do
|
|
32
47
|
Capybara.using_wait_time(3) do
|
|
33
48
|
@session.visit('/with_js')
|
|
34
49
|
@session.click_link('Click me') # updates page after 500ms
|
|
@@ -36,31 +51,34 @@ Capybara::SpecHelper.spec '#has_xpath?' do
|
|
|
36
51
|
end
|
|
37
52
|
end
|
|
38
53
|
|
|
39
|
-
context
|
|
40
|
-
it
|
|
41
|
-
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)
|
|
42
57
|
expect(@session).to have_xpath("//p//a[@id='foo']", count: 1)
|
|
43
58
|
expect(@session).to have_xpath("//p[contains(.,'est')]", count: 1)
|
|
44
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)
|
|
45
63
|
end
|
|
46
64
|
|
|
47
|
-
it
|
|
48
|
-
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)
|
|
49
67
|
expect(@session).not_to have_xpath("//p//a[@id='foo']", count: 2)
|
|
50
68
|
expect(@session).not_to have_xpath("//p[contains(.,'est')]", count: 5)
|
|
51
69
|
expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']", count: 1)
|
|
52
70
|
end
|
|
53
71
|
end
|
|
54
72
|
|
|
55
|
-
context
|
|
56
|
-
it
|
|
57
|
-
expect(@session).to have_xpath(
|
|
58
|
-
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')
|
|
59
77
|
end
|
|
60
78
|
|
|
61
|
-
it
|
|
62
|
-
expect(@session).to have_xpath(
|
|
63
|
-
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$/)
|
|
64
82
|
end
|
|
65
83
|
end
|
|
66
84
|
end
|
|
@@ -70,61 +88,62 @@ Capybara::SpecHelper.spec '#has_no_xpath?' do
|
|
|
70
88
|
@session.visit('/with_html')
|
|
71
89
|
end
|
|
72
90
|
|
|
73
|
-
it
|
|
74
|
-
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')
|
|
75
93
|
expect(@session).not_to have_no_xpath("//p//a[@id='foo']")
|
|
76
94
|
expect(@session).not_to have_no_xpath("//p[contains(.,'est')]")
|
|
77
95
|
end
|
|
78
96
|
|
|
79
|
-
it
|
|
80
|
-
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')
|
|
81
99
|
expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
|
|
82
100
|
expect(@session).to have_no_xpath("//p[contains(.,'thisstringisnotonpage')]")
|
|
83
101
|
end
|
|
84
102
|
|
|
85
|
-
it
|
|
103
|
+
it 'should use xpath even if default selector is CSS' do
|
|
86
104
|
Capybara.default_selector = :css
|
|
87
105
|
expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
|
|
88
106
|
end
|
|
89
107
|
|
|
90
|
-
it
|
|
108
|
+
it 'should respect scopes' do
|
|
91
109
|
@session.within "//p[@id='first']" do
|
|
92
110
|
expect(@session).not_to have_no_xpath(".//a[@id='foo']")
|
|
93
111
|
expect(@session).to have_no_xpath(".//a[@id='red']")
|
|
94
112
|
end
|
|
95
113
|
end
|
|
96
114
|
|
|
97
|
-
it
|
|
115
|
+
it 'should wait for content to disappear', requires: [:js] do
|
|
116
|
+
Capybara.default_max_wait_time = 2
|
|
98
117
|
@session.visit('/with_js')
|
|
99
118
|
@session.click_link('Click me')
|
|
100
119
|
expect(@session).to have_no_xpath("//p[@id='change']")
|
|
101
120
|
end
|
|
102
121
|
|
|
103
|
-
context
|
|
104
|
-
it
|
|
105
|
-
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)
|
|
106
125
|
expect(@session).not_to have_no_xpath("//p//a[@id='foo']", count: 1)
|
|
107
126
|
expect(@session).not_to have_no_xpath("//p[contains(.,'est')]", count: 1)
|
|
108
127
|
expect(@session).not_to have_no_xpath("//p//a[@id='doesnotexist']", count: 0)
|
|
109
128
|
end
|
|
110
129
|
|
|
111
|
-
it
|
|
112
|
-
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)
|
|
113
132
|
expect(@session).to have_no_xpath("//p//a[@id='foo']", count: 2)
|
|
114
133
|
expect(@session).to have_no_xpath("//p[contains(.,'est')]", count: 5)
|
|
115
134
|
expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']", count: 1)
|
|
116
135
|
end
|
|
117
136
|
end
|
|
118
137
|
|
|
119
|
-
context
|
|
120
|
-
it
|
|
121
|
-
expect(@session).not_to have_no_xpath(
|
|
122
|
-
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')
|
|
123
142
|
end
|
|
124
143
|
|
|
125
|
-
it
|
|
126
|
-
expect(@session).not_to have_no_xpath(
|
|
127
|
-
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$/)
|
|
128
147
|
end
|
|
129
148
|
end
|
|
130
149
|
end
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#response_headers' do
|
|
3
|
-
it
|
|
4
|
+
it 'should return response headers', requires: [:response_headers] do
|
|
4
5
|
@session.visit('/with_simple_html')
|
|
5
|
-
expect(@session.response_headers['Content-Type']).to match %r
|
|
6
|
+
expect(@session.response_headers['Content-Type']).to match %r{text/html}
|
|
6
7
|
end
|
|
7
8
|
end
|
|
@@ -1,38 +1,46 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
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
|
+
|
|
2
7
|
Capybara::SpecHelper.spec '#html' do
|
|
3
|
-
it
|
|
8
|
+
it 'should return the unmodified page body' do
|
|
4
9
|
@session.visit('/')
|
|
5
10
|
expect(@session.html).to include('Hello world!')
|
|
6
11
|
end
|
|
7
12
|
|
|
8
|
-
it
|
|
13
|
+
it 'should return the current state of the page', requires: [:js] do
|
|
9
14
|
@session.visit('/with_js')
|
|
15
|
+
sleep 1
|
|
10
16
|
expect(@session.html).to include('I changed it')
|
|
11
17
|
expect(@session.html).not_to include('This is text')
|
|
12
18
|
end
|
|
13
19
|
end
|
|
14
20
|
|
|
15
21
|
Capybara::SpecHelper.spec '#source' do
|
|
16
|
-
it
|
|
22
|
+
it 'should return the unmodified page source' do
|
|
17
23
|
@session.visit('/')
|
|
18
24
|
expect(@session.source).to include('Hello world!')
|
|
19
25
|
end
|
|
20
26
|
|
|
21
|
-
it
|
|
27
|
+
it 'should return the current state of the page', requires: [:js] do
|
|
22
28
|
@session.visit('/with_js')
|
|
29
|
+
sleep 1
|
|
23
30
|
expect(@session.source).to include('I changed it')
|
|
24
31
|
expect(@session.source).not_to include('This is text')
|
|
25
32
|
end
|
|
26
33
|
end
|
|
27
34
|
|
|
28
35
|
Capybara::SpecHelper.spec '#body' do
|
|
29
|
-
it
|
|
36
|
+
it 'should return the unmodified page source' do
|
|
30
37
|
@session.visit('/')
|
|
31
38
|
expect(@session.body).to include('Hello world!')
|
|
32
39
|
end
|
|
33
40
|
|
|
34
|
-
it
|
|
41
|
+
it 'should return the current state of the page', requires: [:js] do
|
|
35
42
|
@session.visit('/with_js')
|
|
43
|
+
sleep 1
|
|
36
44
|
expect(@session.body).to include('I changed it')
|
|
37
45
|
expect(@session.body).not_to include('This is text')
|
|
38
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
|