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,169 +1,273 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#all' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
+
it 'should find all elements using the given locator' do
|
|
8
9
|
expect(@session.all('//p').size).to eq(3)
|
|
9
10
|
expect(@session.all('//h1').first.text).to eq('This is a test')
|
|
10
11
|
expect(@session.all("//input[@id='test_field']").first.value).to eq('monkey')
|
|
11
12
|
end
|
|
12
13
|
|
|
13
|
-
it
|
|
14
|
+
it 'should return an empty array when nothing was found' do
|
|
14
15
|
expect(@session.all('//div[@id="nosuchthing"]')).to be_empty
|
|
15
16
|
end
|
|
16
17
|
|
|
17
|
-
it
|
|
18
|
+
it 'should wait for matching elements to appear', requires: [:js] do
|
|
19
|
+
Capybara.default_max_wait_time = 2
|
|
20
|
+
@session.visit('/with_js')
|
|
21
|
+
@session.click_link('Click me')
|
|
22
|
+
expect(@session.all(:css, 'a#has-been-clicked')).not_to be_empty
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it 'should not wait if `minimum: 0` option is specified', requires: [:js] do
|
|
26
|
+
@session.visit('/with_js')
|
|
27
|
+
@session.click_link('Click me')
|
|
28
|
+
expect(@session.all(:css, 'a#has-been-clicked', minimum: 0)).to be_empty
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it 'should accept an XPath instance', :exact_false do
|
|
18
32
|
@session.visit('/form')
|
|
19
|
-
@xpath = Capybara::Selector.
|
|
20
|
-
expect(@xpath).to be_a(
|
|
21
|
-
@result = @session.all(@xpath).map
|
|
33
|
+
@xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('Name')
|
|
34
|
+
expect(@xpath).to be_a(XPath::Union)
|
|
35
|
+
@result = @session.all(@xpath).map(&:value)
|
|
22
36
|
expect(@result).to include('Smith', 'John', 'John Smith')
|
|
23
37
|
end
|
|
24
38
|
|
|
25
|
-
it
|
|
26
|
-
|
|
39
|
+
it 'should allow reversing the order' do
|
|
40
|
+
@session.visit('/form')
|
|
41
|
+
fields = @session.all(:fillable_field, 'Name', exact: false).to_a
|
|
42
|
+
reverse_fields = @session.all(:fillable_field, 'Name', order: :reverse, exact: false).to_a
|
|
43
|
+
expect(fields).to eq(reverse_fields.reverse)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'should raise an error when given invalid options' do
|
|
47
|
+
expect { @session.all('//p', schmoo: 'foo') }.to raise_error(ArgumentError)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it 'should not reload by default', requires: [:driver] do
|
|
51
|
+
paras = @session.all(:css, 'p', minimum: 3)
|
|
52
|
+
expect { paras[0].text }.not_to raise_error
|
|
53
|
+
@session.refresh
|
|
54
|
+
expect { paras[0].text }.to raise_error do |err|
|
|
55
|
+
expect(err).to be_an_invalid_element_error(@session)
|
|
56
|
+
end
|
|
27
57
|
end
|
|
28
58
|
|
|
29
|
-
context
|
|
30
|
-
it
|
|
59
|
+
context 'with allow_reload' do
|
|
60
|
+
it 'should reload if true' do
|
|
61
|
+
paras = @session.all(:css, 'p', allow_reload: true, minimum: 3)
|
|
62
|
+
expect { paras[0].text }.not_to raise_error
|
|
63
|
+
@session.refresh
|
|
64
|
+
sleep 1 # Ensure page has started to reload
|
|
65
|
+
expect(paras[0]).to have_text('Lorem ipsum dolor')
|
|
66
|
+
expect(paras[1]).to have_text('Duis aute irure dolor')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'should not reload if false', requires: [:driver] do
|
|
70
|
+
paras = @session.all(:css, 'p', allow_reload: false, minimum: 3)
|
|
71
|
+
expect { paras[0].text }.not_to raise_error
|
|
72
|
+
@session.refresh
|
|
73
|
+
sleep 1 # Ensure page has started to reload
|
|
74
|
+
expect { paras[0].text }.to raise_error do |err|
|
|
75
|
+
expect(err).to be_an_invalid_element_error(@session)
|
|
76
|
+
end
|
|
77
|
+
expect { paras[2].text }.to raise_error do |err|
|
|
78
|
+
expect(err).to be_an_invalid_element_error(@session)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
context 'with css selectors' do
|
|
84
|
+
it 'should find all elements using the given selector' do
|
|
31
85
|
expect(@session.all(:css, 'h1').first.text).to eq('This is a test')
|
|
32
86
|
expect(@session.all(:css, "input[id='test_field']").first.value).to eq('monkey')
|
|
33
87
|
end
|
|
34
88
|
|
|
35
|
-
it
|
|
89
|
+
it 'should find all elements when given a list of selectors' do
|
|
36
90
|
expect(@session.all(:css, 'h1, p').size).to eq(4)
|
|
37
91
|
end
|
|
38
92
|
end
|
|
39
93
|
|
|
40
|
-
context
|
|
41
|
-
it
|
|
94
|
+
context 'with xpath selectors' do
|
|
95
|
+
it 'should find the first element using the given locator' do
|
|
42
96
|
expect(@session.all(:xpath, '//h1').first.text).to eq('This is a test')
|
|
43
97
|
expect(@session.all(:xpath, "//input[@id='test_field']").first.value).to eq('monkey')
|
|
44
98
|
end
|
|
99
|
+
|
|
100
|
+
it 'should use alternated regex for :id' do
|
|
101
|
+
expect(@session.all(:xpath, './/h2', id: /h2/).unfiltered_size).to eq 3
|
|
102
|
+
expect(@session.all(:xpath, './/h2', id: /h2(one|two)/).unfiltered_size).to eq 2
|
|
103
|
+
end
|
|
45
104
|
end
|
|
46
105
|
|
|
47
|
-
context
|
|
106
|
+
context 'with css as default selector' do
|
|
48
107
|
before { Capybara.default_selector = :css }
|
|
49
|
-
|
|
108
|
+
|
|
109
|
+
it 'should find the first element using the given locator' do
|
|
50
110
|
expect(@session.all('h1').first.text).to eq('This is a test')
|
|
51
111
|
expect(@session.all("input[id='test_field']").first.value).to eq('monkey')
|
|
52
112
|
end
|
|
53
113
|
end
|
|
54
114
|
|
|
55
|
-
context
|
|
56
|
-
it
|
|
57
|
-
expect(@session.all(:css,
|
|
115
|
+
context 'with visible filter' do
|
|
116
|
+
it 'should only find visible nodes when true' do
|
|
117
|
+
expect(@session.all(:css, 'a.simple', visible: true).size).to eq(1)
|
|
58
118
|
end
|
|
59
119
|
|
|
60
|
-
it
|
|
61
|
-
expect(@session.all(:css,
|
|
120
|
+
it 'should find nodes regardless of whether they are invisible when false' do
|
|
121
|
+
expect(@session.all(:css, 'a.simple', visible: false).size).to eq(2)
|
|
62
122
|
end
|
|
63
123
|
|
|
64
|
-
it
|
|
124
|
+
it 'should default to Capybara.ignore_hidden_elements' do
|
|
65
125
|
Capybara.ignore_hidden_elements = true
|
|
66
|
-
expect(@session.all(:css,
|
|
126
|
+
expect(@session.all(:css, 'a.simple').size).to eq(1)
|
|
67
127
|
Capybara.ignore_hidden_elements = false
|
|
68
|
-
expect(@session.all(:css,
|
|
128
|
+
expect(@session.all(:css, 'a.simple').size).to eq(2)
|
|
69
129
|
end
|
|
70
130
|
|
|
71
|
-
context
|
|
72
|
-
it
|
|
131
|
+
context 'with per session config', requires: [:psc] do
|
|
132
|
+
it 'should use the sessions ignore_hidden_elements', :psc do
|
|
73
133
|
Capybara.ignore_hidden_elements = true
|
|
74
134
|
@session.config.ignore_hidden_elements = false
|
|
75
|
-
expect(Capybara.ignore_hidden_elements).to
|
|
76
|
-
expect(@session.all(:css,
|
|
135
|
+
expect(Capybara.ignore_hidden_elements).to be(true)
|
|
136
|
+
expect(@session.all(:css, 'a.simple').size).to eq(2)
|
|
77
137
|
@session.config.ignore_hidden_elements = true
|
|
78
|
-
expect(@session.all(:css,
|
|
138
|
+
expect(@session.all(:css, 'a.simple').size).to eq(1)
|
|
79
139
|
end
|
|
80
140
|
end
|
|
81
141
|
end
|
|
82
142
|
|
|
143
|
+
context 'with obscured filter', requires: [:css] do
|
|
144
|
+
it 'should only find nodes on top in the viewport when false' do
|
|
145
|
+
expect(@session.all(:css, 'a.simple', obscured: false).size).to eq(1)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it 'should not find nodes on top outside the viewport when false' do
|
|
149
|
+
expect(@session.all(:link, 'Download Me', obscured: false).size).to eq(0)
|
|
150
|
+
@session.scroll_to(@session.find_link('Download Me'))
|
|
151
|
+
expect(@session.all(:link, 'Download Me', obscured: false).size).to eq(1)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
it 'should find top nodes outside the viewport when true' do
|
|
155
|
+
expect(@session.all(:link, 'Download Me', obscured: true).size).to eq(1)
|
|
156
|
+
@session.scroll_to(@session.find_link('Download Me'))
|
|
157
|
+
expect(@session.all(:link, 'Download Me', obscured: true).size).to eq(0)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
it 'should only find non-top nodes when true' do
|
|
161
|
+
# Also need visible: false so visibility is ignored
|
|
162
|
+
expect(@session.all(:css, 'a.simple', visible: false, obscured: true).size).to eq(1)
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
83
166
|
context 'with element count filters' do
|
|
84
167
|
context ':count' do
|
|
85
168
|
it 'should succeed when the number of elements founds matches the expectation' do
|
|
86
|
-
expect { @session.all(:css, 'h1, p', count: 4) }.
|
|
169
|
+
expect { @session.all(:css, 'h1, p', count: 4) }.not_to raise_error
|
|
87
170
|
end
|
|
171
|
+
|
|
88
172
|
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
|
89
173
|
expect { @session.all(:css, 'h1, p', count: 5) }.to raise_error(Capybara::ExpectationNotMet)
|
|
90
174
|
end
|
|
91
175
|
end
|
|
176
|
+
|
|
92
177
|
context ':minimum' do
|
|
93
178
|
it 'should succeed when the number of elements founds matches the expectation' do
|
|
94
|
-
expect { @session.all(:css, 'h1, p', minimum: 0) }.
|
|
179
|
+
expect { @session.all(:css, 'h1, p', minimum: 0) }.not_to raise_error
|
|
95
180
|
end
|
|
181
|
+
|
|
96
182
|
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
|
97
183
|
expect { @session.all(:css, 'h1, p', minimum: 5) }.to raise_error(Capybara::ExpectationNotMet)
|
|
98
184
|
end
|
|
99
185
|
end
|
|
186
|
+
|
|
100
187
|
context ':maximum' do
|
|
101
188
|
it 'should succeed when the number of elements founds matches the expectation' do
|
|
102
|
-
expect { @session.all(:css, 'h1, p', maximum: 4) }.
|
|
189
|
+
expect { @session.all(:css, 'h1, p', maximum: 4) }.not_to raise_error
|
|
103
190
|
end
|
|
191
|
+
|
|
104
192
|
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
|
105
193
|
expect { @session.all(:css, 'h1, p', maximum: 0) }.to raise_error(Capybara::ExpectationNotMet)
|
|
106
194
|
end
|
|
107
195
|
end
|
|
196
|
+
|
|
108
197
|
context ':between' do
|
|
109
198
|
it 'should succeed when the number of elements founds matches the expectation' do
|
|
110
|
-
expect { @session.all(:css, 'h1, p', between: 2..7) }.
|
|
199
|
+
expect { @session.all(:css, 'h1, p', between: 2..7) }.not_to raise_error
|
|
111
200
|
end
|
|
201
|
+
|
|
112
202
|
it 'should raise ExpectationNotMet when the number of elements founds does not match the expectation' do
|
|
113
203
|
expect { @session.all(:css, 'h1, p', between: 0..3) }.to raise_error(Capybara::ExpectationNotMet)
|
|
114
204
|
end
|
|
205
|
+
|
|
206
|
+
it 'treats an endless range as minimum' do
|
|
207
|
+
expect { @session.all(:css, 'h1, p', between: 2..) }.not_to raise_error
|
|
208
|
+
expect { @session.all(:css, 'h1, p', between: 5..) }.to raise_error(Capybara::ExpectationNotMet)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it 'treats a beginless range as maximum' do
|
|
212
|
+
expect { @session.all(:css, 'h1, p', between: ..7) }.not_to raise_error
|
|
213
|
+
expect { @session.all(:css, 'h1, p', between: ..3) }.to raise_error(Capybara::ExpectationNotMet)
|
|
214
|
+
end
|
|
115
215
|
end
|
|
116
216
|
|
|
117
217
|
context 'with multiple count filters' do
|
|
118
218
|
it 'ignores other filters when :count is specified' do
|
|
119
|
-
o = {count: 4,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
expect { @session.all(:css, 'h1, p', o) }.
|
|
219
|
+
o = { count: 4,
|
|
220
|
+
minimum: 5,
|
|
221
|
+
maximum: 0,
|
|
222
|
+
between: 0..3 }
|
|
223
|
+
expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
|
|
124
224
|
end
|
|
225
|
+
|
|
125
226
|
context 'with no :count expectation' do
|
|
126
227
|
it 'fails if :minimum is not met' do
|
|
127
|
-
o = {minimum: 5,
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
228
|
+
o = { minimum: 5,
|
|
229
|
+
maximum: 4,
|
|
230
|
+
between: 2..7 }
|
|
231
|
+
expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
131
232
|
end
|
|
233
|
+
|
|
132
234
|
it 'fails if :maximum is not met' do
|
|
133
|
-
o = {minimum: 0,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
235
|
+
o = { minimum: 0,
|
|
236
|
+
maximum: 0,
|
|
237
|
+
between: 2..7 }
|
|
238
|
+
expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
137
239
|
end
|
|
240
|
+
|
|
138
241
|
it 'fails if :between is not met' do
|
|
139
|
-
o = {minimum: 0,
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
expect { @session.all(:css, 'h1, p', o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
242
|
+
o = { minimum: 0,
|
|
243
|
+
maximum: 4,
|
|
244
|
+
between: 0..3 }
|
|
245
|
+
expect { @session.all(:css, 'h1, p', **o) }.to raise_error(Capybara::ExpectationNotMet)
|
|
143
246
|
end
|
|
247
|
+
|
|
144
248
|
it 'succeeds if all combineable expectations are met' do
|
|
145
|
-
o = {minimum: 0,
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
expect { @session.all(:css, 'h1, p', o) }.
|
|
249
|
+
o = { minimum: 0,
|
|
250
|
+
maximum: 4,
|
|
251
|
+
between: 2..7 }
|
|
252
|
+
expect { @session.all(:css, 'h1, p', **o) }.not_to raise_error
|
|
149
253
|
end
|
|
150
254
|
end
|
|
151
255
|
end
|
|
152
256
|
end
|
|
153
257
|
|
|
154
|
-
context
|
|
258
|
+
context 'within a scope' do
|
|
155
259
|
before do
|
|
156
260
|
@session.visit('/with_scope')
|
|
157
261
|
end
|
|
158
262
|
|
|
159
|
-
it
|
|
263
|
+
it 'should find any element using the given locator' do
|
|
160
264
|
@session.within(:xpath, "//div[@id='for_bar']") do
|
|
161
265
|
expect(@session.all('.//li').size).to eq(2)
|
|
162
266
|
end
|
|
163
267
|
end
|
|
164
268
|
end
|
|
165
269
|
|
|
166
|
-
it
|
|
270
|
+
it 'should have #find_all as an alias' do
|
|
167
271
|
expect(Capybara::Node::Finders.instance_method(:all)).to eq Capybara::Node::Finders.instance_method(:find_all)
|
|
168
272
|
expect(@session.find_all('//p').size).to eq(3)
|
|
169
273
|
end
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#ancestor' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_html')
|
|
@@ -8,75 +9,77 @@ Capybara::SpecHelper.spec '#ancestor' do
|
|
|
8
9
|
Capybara::Selector.remove(:monkey)
|
|
9
10
|
end
|
|
10
11
|
|
|
11
|
-
it
|
|
12
|
+
it 'should find the ancestor element using the given locator' do
|
|
12
13
|
el = @session.find(:css, '#first_image')
|
|
13
14
|
expect(el.ancestor('//p')).to have_text('Lorem ipsum dolor')
|
|
14
|
-
expect(el.ancestor(
|
|
15
|
+
expect(el.ancestor('//a')[:'aria-label']).to eq('Go to simple')
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'should find the ancestor element using the given locator and options' do
|
|
19
|
+
el = @session.find(:css, '#child')
|
|
20
|
+
expect(el.ancestor('//div', text: "Ancestor\nAncestor\nAncestor")[:id]).to eq('ancestor3')
|
|
15
21
|
end
|
|
16
22
|
|
|
17
|
-
it
|
|
23
|
+
it 'should find the closest ancestor' do
|
|
18
24
|
el = @session.find(:css, '#child')
|
|
19
|
-
expect(el.ancestor('
|
|
25
|
+
expect(el.ancestor('.//div', order: :reverse, match: :first)[:id]).to eq('ancestor1')
|
|
20
26
|
end
|
|
21
27
|
|
|
22
|
-
it
|
|
28
|
+
it 'should raise an error if there are multiple matches' do
|
|
23
29
|
el = @session.find(:css, '#child')
|
|
24
30
|
expect { el.ancestor('//div') }.to raise_error(Capybara::Ambiguous)
|
|
25
31
|
expect { el.ancestor('//div', text: 'Ancestor') }.to raise_error(Capybara::Ambiguous)
|
|
26
32
|
end
|
|
27
33
|
|
|
28
|
-
context
|
|
29
|
-
it
|
|
34
|
+
context 'with css selectors' do
|
|
35
|
+
it 'should find the first element using the given locator' do
|
|
30
36
|
el = @session.find(:css, '#first_image')
|
|
31
37
|
expect(el.ancestor(:css, 'p')).to have_text('Lorem ipsum dolor')
|
|
32
38
|
expect(el.ancestor(:css, 'a')[:'aria-label']).to eq('Go to simple')
|
|
33
39
|
end
|
|
34
40
|
|
|
35
|
-
it
|
|
41
|
+
it 'should support pseudo selectors' do
|
|
36
42
|
el = @session.find(:css, '#button_img')
|
|
37
43
|
expect(el.ancestor(:css, 'button:disabled')[:id]).to eq('ancestor_button')
|
|
38
44
|
end
|
|
39
45
|
end
|
|
40
46
|
|
|
41
|
-
context
|
|
42
|
-
it
|
|
47
|
+
context 'with xpath selectors' do
|
|
48
|
+
it 'should find the first element using the given locator' do
|
|
43
49
|
el = @session.find(:css, '#first_image')
|
|
44
50
|
expect(el.ancestor(:xpath, '//p')).to have_text('Lorem ipsum dolor')
|
|
45
|
-
expect(el.ancestor(:xpath,
|
|
51
|
+
expect(el.ancestor(:xpath, '//a')[:'aria-label']).to eq('Go to simple')
|
|
46
52
|
end
|
|
47
53
|
end
|
|
48
54
|
|
|
49
|
-
context
|
|
50
|
-
it
|
|
55
|
+
context 'with custom selector' do
|
|
56
|
+
it 'should use the custom selector' do
|
|
51
57
|
Capybara.add_selector(:level) do
|
|
52
58
|
xpath { |num| ".//*[@id='ancestor#{num}']" }
|
|
53
59
|
end
|
|
54
60
|
el = @session.find(:css, '#child')
|
|
55
|
-
expect(el.ancestor(:level, 1)
|
|
56
|
-
expect(el.ancestor(:level, 3)
|
|
61
|
+
expect(el.ancestor(:level, 1)[:id]).to eq 'ancestor1'
|
|
62
|
+
expect(el.ancestor(:level, 3)[:id]).to eq 'ancestor3'
|
|
57
63
|
end
|
|
58
64
|
end
|
|
59
65
|
|
|
60
|
-
|
|
61
|
-
it "should raise ElementNotFound with a useful default message if nothing was found" do
|
|
66
|
+
it 'should raise ElementNotFound with a useful default message if nothing was found' do
|
|
62
67
|
el = @session.find(:css, '#child')
|
|
63
68
|
expect do
|
|
64
69
|
el.ancestor(:xpath, '//div[@id="nosuchthing"]')
|
|
65
|
-
end.to raise_error(Capybara::ElementNotFound,
|
|
70
|
+
end.to raise_error(Capybara::ElementNotFound, 'Unable to find xpath "//div[@id=\\"nosuchthing\\"]" that is an ancestor of visible css "#child"')
|
|
66
71
|
end
|
|
67
72
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
context "within a scope" do
|
|
71
|
-
it "should limit the ancestors to inside the scope" do
|
|
73
|
+
context 'within a scope' do
|
|
74
|
+
it 'should limit the ancestors to inside the scope' do
|
|
72
75
|
@session.within(:css, '#ancestor2') do
|
|
73
76
|
el = @session.find(:css, '#child')
|
|
74
|
-
expect(el.ancestor(:css,'div', text: 'Ancestor')[:id]).to eq('ancestor1')
|
|
77
|
+
expect(el.ancestor(:css, 'div', text: 'Ancestor')[:id]).to eq('ancestor1')
|
|
75
78
|
end
|
|
76
79
|
end
|
|
77
80
|
end
|
|
78
81
|
|
|
79
|
-
it
|
|
82
|
+
it 'should raise if selector type is unknown' do
|
|
80
83
|
el = @session.find(:css, '#child')
|
|
81
84
|
expect do
|
|
82
85
|
el.ancestor(:unknown, '//h1')
|
|
@@ -1,51 +1,56 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#assert_all_of_selectors' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
-
@session.assert_all_of_selectors(:css,
|
|
8
|
+
it 'should be true if the given selectors are on the page' do
|
|
9
|
+
@session.assert_all_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
|
|
9
10
|
end
|
|
10
11
|
|
|
11
|
-
it
|
|
12
|
-
expect { @session.assert_all_of_selectors(:css,
|
|
12
|
+
it 'should be false if any of the given selectors are not on the page' do
|
|
13
|
+
expect { @session.assert_all_of_selectors(:css, 'p a#foo', 'h2#h2three', 'h2#h2one') }.to raise_error(Capybara::ElementNotFound)
|
|
13
14
|
end
|
|
14
15
|
|
|
15
|
-
it
|
|
16
|
+
it 'should use default selector' do
|
|
16
17
|
Capybara.default_selector = :css
|
|
17
|
-
expect { @session.assert_all_of_selectors(
|
|
18
|
-
@session.assert_all_of_selectors(
|
|
18
|
+
expect { @session.assert_all_of_selectors('p a#foo', 'h2#h2three', 'h2#h2one') }.to raise_error(Capybara::ElementNotFound)
|
|
19
|
+
@session.assert_all_of_selectors('p a#foo', 'h2#h2two', 'h2#h2one')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'should support filter block' do
|
|
23
|
+
expect { @session.assert_all_of_selectors(:css, 'h2#h2one', 'h2#h2two') { |n| n[:id] == 'h2one' } }.to raise_error(Capybara::ElementNotFound, /custom filter block/)
|
|
19
24
|
end
|
|
20
25
|
|
|
21
|
-
context
|
|
22
|
-
it
|
|
26
|
+
context 'should respect scopes' do
|
|
27
|
+
it 'when used with `within`' do
|
|
23
28
|
@session.within "//p[@id='first']" do
|
|
24
29
|
@session.assert_all_of_selectors(".//a[@id='foo']")
|
|
25
30
|
expect { @session.assert_all_of_selectors(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
|
|
26
31
|
end
|
|
27
32
|
end
|
|
28
33
|
|
|
29
|
-
it
|
|
34
|
+
it 'when called on elements' do
|
|
30
35
|
el = @session.find "//p[@id='first']"
|
|
31
36
|
el.assert_all_of_selectors(".//a[@id='foo']")
|
|
32
37
|
expect { el.assert_all_of_selectors(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
|
|
33
38
|
end
|
|
34
39
|
end
|
|
35
40
|
|
|
36
|
-
context
|
|
37
|
-
it
|
|
41
|
+
context 'with options' do
|
|
42
|
+
it 'should apply options to all locators' do
|
|
38
43
|
@session.assert_all_of_selectors(:field, 'normal', 'additional_newline', type: :textarea)
|
|
39
44
|
expect { @session.assert_all_of_selectors(:field, 'normal', 'test_field', 'additional_newline', type: :textarea) }.to raise_error(Capybara::ElementNotFound)
|
|
40
45
|
end
|
|
41
46
|
end
|
|
42
47
|
|
|
43
|
-
context
|
|
44
|
-
it
|
|
48
|
+
context 'with wait', requires: [:js] do
|
|
49
|
+
it 'should not raise error if all the elements appear before given wait duration' do
|
|
45
50
|
Capybara.using_wait_time(0.1) do
|
|
46
51
|
@session.visit('/with_js')
|
|
47
52
|
@session.click_link('Click me')
|
|
48
|
-
@session.assert_all_of_selectors(:css,
|
|
53
|
+
@session.assert_all_of_selectors(:css, 'a#clickable', 'a#has-been-clicked', '#drag', wait: 1.5)
|
|
49
54
|
end
|
|
50
55
|
end
|
|
51
56
|
end
|
|
@@ -56,55 +61,80 @@ Capybara::SpecHelper.spec '#assert_none_of_selectors' do
|
|
|
56
61
|
@session.visit('/with_html')
|
|
57
62
|
end
|
|
58
63
|
|
|
59
|
-
it
|
|
60
|
-
expect { @session.assert_none_of_selectors(:xpath,
|
|
61
|
-
expect { @session.assert_none_of_selectors(:xpath,
|
|
62
|
-
expect { @session.assert_none_of_selectors(:css,
|
|
64
|
+
it 'should be false if any of the given locators are on the page' do
|
|
65
|
+
expect { @session.assert_none_of_selectors(:xpath, '//p', '//a') }.to raise_error(Capybara::ElementNotFound)
|
|
66
|
+
expect { @session.assert_none_of_selectors(:xpath, '//abbr', '//a') }.to raise_error(Capybara::ElementNotFound)
|
|
67
|
+
expect { @session.assert_none_of_selectors(:css, 'p a#foo') }.to raise_error(Capybara::ElementNotFound)
|
|
63
68
|
end
|
|
64
69
|
|
|
65
|
-
it
|
|
66
|
-
@session.assert_none_of_selectors(:xpath,
|
|
67
|
-
@session.assert_none_of_selectors(:css,
|
|
70
|
+
it 'should be true if none of the given locators are on the page' do
|
|
71
|
+
@session.assert_none_of_selectors(:xpath, '//abbr', '//td')
|
|
72
|
+
@session.assert_none_of_selectors(:css, 'p a#doesnotexist', 'abbr')
|
|
68
73
|
end
|
|
69
74
|
|
|
70
|
-
it
|
|
75
|
+
it 'should use default selector' do
|
|
71
76
|
Capybara.default_selector = :css
|
|
72
|
-
@session.assert_none_of_selectors(
|
|
73
|
-
expect { @session.assert_none_of_selectors(
|
|
77
|
+
@session.assert_none_of_selectors('p a#doesnotexist', 'abbr')
|
|
78
|
+
expect { @session.assert_none_of_selectors('abbr', 'p a#foo') }.to raise_error(Capybara::ElementNotFound)
|
|
74
79
|
end
|
|
75
80
|
|
|
76
|
-
context
|
|
77
|
-
it
|
|
81
|
+
context 'should respect scopes' do
|
|
82
|
+
it 'when used with `within`' do
|
|
78
83
|
@session.within "//p[@id='first']" do
|
|
79
84
|
expect { @session.assert_none_of_selectors(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
|
|
80
85
|
@session.assert_none_of_selectors(".//a[@id='red']")
|
|
81
86
|
end
|
|
82
87
|
end
|
|
83
88
|
|
|
84
|
-
it
|
|
89
|
+
it 'when called on an element' do
|
|
85
90
|
el = @session.find "//p[@id='first']"
|
|
86
91
|
expect { el.assert_none_of_selectors(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
|
|
87
92
|
el.assert_none_of_selectors(".//a[@id='red']")
|
|
88
93
|
end
|
|
89
94
|
end
|
|
90
95
|
|
|
91
|
-
context
|
|
92
|
-
it
|
|
93
|
-
expect { @session.assert_none_of_selectors(
|
|
94
|
-
@session.assert_none_of_selectors(
|
|
96
|
+
context 'with options' do
|
|
97
|
+
it 'should apply the options to all locators' do
|
|
98
|
+
expect { @session.assert_none_of_selectors('//p//a', text: 'Redirect') }.to raise_error(Capybara::ElementNotFound)
|
|
99
|
+
@session.assert_none_of_selectors('//p', text: 'Doesnotexist')
|
|
95
100
|
end
|
|
96
101
|
|
|
97
|
-
it
|
|
98
|
-
expect { @session.assert_none_of_selectors(
|
|
99
|
-
@session.assert_none_of_selectors(
|
|
102
|
+
it 'should discard all matches where the given regexp is matched' do
|
|
103
|
+
expect { @session.assert_none_of_selectors('//p//a', text: /re[dab]i/i, count: 1) }.to raise_error(Capybara::ElementNotFound)
|
|
104
|
+
@session.assert_none_of_selectors('//p//a', text: /Red$/)
|
|
100
105
|
end
|
|
101
106
|
end
|
|
102
107
|
|
|
103
|
-
context
|
|
104
|
-
it
|
|
108
|
+
context 'with wait', requires: [:js] do
|
|
109
|
+
it 'should not find elements if they appear after given wait duration' do
|
|
105
110
|
@session.visit('/with_js')
|
|
106
111
|
@session.click_link('Click me')
|
|
107
|
-
@session.assert_none_of_selectors(:css,
|
|
112
|
+
@session.assert_none_of_selectors(:css, '#new_field', 'a#has-been-clicked', wait: 0.1)
|
|
108
113
|
end
|
|
109
114
|
end
|
|
110
115
|
end
|
|
116
|
+
|
|
117
|
+
Capybara::SpecHelper.spec '#assert_any_of_selectors' do
|
|
118
|
+
before do
|
|
119
|
+
@session.visit('/with_html')
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it 'should be true if any of the given selectors are on the page' do
|
|
123
|
+
@session.assert_any_of_selectors(:css, 'a#foo', 'h2#h2three')
|
|
124
|
+
@session.assert_any_of_selectors(:css, 'h2#h2three', 'a#foo')
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it 'should be false if none of the given selectors are on the page' do
|
|
128
|
+
expect { @session.assert_any_of_selectors(:css, 'h2#h2three', 'h4#h4four') }.to raise_error(Capybara::ElementNotFound)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it 'should use default selector' do
|
|
132
|
+
Capybara.default_selector = :css
|
|
133
|
+
expect { @session.assert_any_of_selectors('h2#h2three', 'h5#h5five') }.to raise_error(Capybara::ElementNotFound)
|
|
134
|
+
@session.assert_any_of_selectors('p a#foo', 'h2#h2two', 'h2#h2one')
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it 'should support filter block' do
|
|
138
|
+
expect { @session.assert_any_of_selectors(:css, 'h2#h2one', 'h2#h2two') { |_n| false } }.to raise_error(Capybara::ElementNotFound, /custom filter block/)
|
|
139
|
+
end
|
|
140
|
+
end
|