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
@@ -0,0 +1,119 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
Capybara::SpecHelper.spec '#scroll_to', requires: [:scroll] do
|
4
|
+
before do
|
5
|
+
@session.visit('/scroll')
|
6
|
+
end
|
7
|
+
|
8
|
+
it 'can scroll an element to the top of the viewport' do
|
9
|
+
el = @session.find(:css, '#scroll')
|
10
|
+
@session.scroll_to(el, align: :top)
|
11
|
+
expect(el.evaluate_script('this.getBoundingClientRect().top')).to be_within(1).of(0)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'can scroll an element to the bottom of the viewport' do
|
15
|
+
el = @session.find(:css, '#scroll')
|
16
|
+
@session.scroll_to(el, align: :bottom)
|
17
|
+
el_bottom = el.evaluate_script('this.getBoundingClientRect().bottom')
|
18
|
+
viewport_bottom = el.evaluate_script('document.documentElement.clientHeight')
|
19
|
+
expect(el_bottom).to be_within(1).of(viewport_bottom)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'can scroll an element to the center of the viewport' do
|
23
|
+
el = @session.find(:css, '#scroll')
|
24
|
+
@session.scroll_to(el, align: :center)
|
25
|
+
el_center = el.evaluate_script('(function(rect){return (rect.top + rect.bottom)/2})(this.getBoundingClientRect())')
|
26
|
+
viewport_bottom = el.evaluate_script('document.documentElement.clientHeight')
|
27
|
+
expect(el_center).to be_within(2).of(viewport_bottom / 2)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'can scroll the window to the vertical top' do
|
31
|
+
@session.scroll_to :bottom
|
32
|
+
@session.scroll_to :top
|
33
|
+
expect(@session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')).to eq [0, 0]
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'can scroll the window to the vertical bottom' do
|
37
|
+
@session.scroll_to :bottom
|
38
|
+
max_scroll = @session.evaluate_script('document.documentElement.scrollHeight - document.documentElement.clientHeight')
|
39
|
+
scrolled_location_x, scrolled_location_y = @session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')
|
40
|
+
expect(scrolled_location_x).to be_within(0.5).of(0)
|
41
|
+
expect(scrolled_location_y).to be_within(0.5).of(max_scroll)
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'can scroll the window to the vertical center' do
|
45
|
+
@session.scroll_to :center
|
46
|
+
max_scroll = @session.evaluate_script('document.documentElement.scrollHeight - document.documentElement.clientHeight')
|
47
|
+
expect(@session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')).to eq [0, max_scroll / 2]
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'can scroll the window to specific location' do
|
51
|
+
@session.scroll_to 100, 100
|
52
|
+
expect(@session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')).to eq [100, 100]
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'can scroll an element to the top of the scrolling element' do
|
56
|
+
scrolling_element = @session.find(:css, '#scrollable')
|
57
|
+
el = scrolling_element.find(:css, '#inner')
|
58
|
+
scrolling_element.scroll_to(el, align: :top)
|
59
|
+
scrolling_element_top = scrolling_element.evaluate_script('this.getBoundingClientRect().top')
|
60
|
+
expect(el.evaluate_script('this.getBoundingClientRect().top')).to be_within(3).of(scrolling_element_top)
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'can scroll an element to the bottom of the scrolling element' do
|
64
|
+
scrolling_element = @session.find(:css, '#scrollable')
|
65
|
+
el = scrolling_element.find(:css, '#inner')
|
66
|
+
scrolling_element.scroll_to(el, align: :bottom)
|
67
|
+
el_bottom = el.evaluate_script('this.getBoundingClientRect().bottom')
|
68
|
+
scroller_bottom = scrolling_element.evaluate_script('this.getBoundingClientRect().top + this.clientHeight')
|
69
|
+
expect(el_bottom).to be_within(1).of(scroller_bottom)
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'can scroll an element to the center of the scrolling element' do
|
73
|
+
scrolling_element = @session.find(:css, '#scrollable')
|
74
|
+
el = scrolling_element.find(:css, '#inner')
|
75
|
+
scrolling_element.scroll_to(el, align: :center)
|
76
|
+
el_center = el.evaluate_script('(function(rect){return (rect.top + rect.bottom)/2})(this.getBoundingClientRect())')
|
77
|
+
scrollable_center = scrolling_element.evaluate_script('(this.clientHeight / 2) + this.getBoundingClientRect().top')
|
78
|
+
expect(el_center).to be_within(1).of(scrollable_center)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'can scroll the scrolling element to the top' do
|
82
|
+
scrolling_element = @session.find(:css, '#scrollable')
|
83
|
+
scrolling_element.scroll_to :bottom
|
84
|
+
scrolling_element.scroll_to :top
|
85
|
+
expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [0, 0]
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'can scroll the scrolling element to the bottom' do
|
89
|
+
scrolling_element = @session.find(:css, '#scrollable')
|
90
|
+
scrolling_element.scroll_to :bottom
|
91
|
+
max_scroll = scrolling_element.evaluate_script('this.scrollHeight - this.clientHeight')
|
92
|
+
expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [0, max_scroll]
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'can scroll the scrolling element to the vertical center' do
|
96
|
+
scrolling_element = @session.find(:css, '#scrollable')
|
97
|
+
scrolling_element.scroll_to :center
|
98
|
+
max_scroll = scrolling_element.evaluate_script('this.scrollHeight - this.clientHeight')
|
99
|
+
expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [0, max_scroll / 2]
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'can scroll the scrolling element to specific location' do
|
103
|
+
scrolling_element = @session.find(:css, '#scrollable')
|
104
|
+
scrolling_element.scroll_to 100, 100
|
105
|
+
expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [100, 100]
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'can scroll the window by a specific amount' do
|
109
|
+
@session.scroll_to(:current, offset: [50, 75])
|
110
|
+
expect(@session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')).to eq [50, 75]
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'can scroll the scroll the scrolling element by a specific amount' do
|
114
|
+
scrolling_element = @session.find(:css, '#scrollable')
|
115
|
+
scrolling_element.scroll_to 100, 100
|
116
|
+
scrolling_element.scroll_to(:current, offset: [-50, 50])
|
117
|
+
expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [50, 150]
|
118
|
+
end
|
119
|
+
end
|
@@ -1,92 +1,118 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
Capybara::SpecHelper.spec
|
3
|
+
Capybara::SpecHelper.spec '#select' do
|
4
4
|
before do
|
5
5
|
@session.visit('/form')
|
6
6
|
end
|
7
7
|
|
8
|
-
it
|
8
|
+
it 'should return value of the first option' do
|
9
9
|
expect(@session.find_field('Title').value).to eq('Mrs')
|
10
10
|
end
|
11
11
|
|
12
|
-
it
|
13
|
-
@session.select(
|
12
|
+
it 'should return value of the selected option' do
|
13
|
+
@session.select('Miss', from: 'Title')
|
14
14
|
expect(@session.find_field('Title').value).to eq('Miss')
|
15
15
|
end
|
16
16
|
|
17
|
-
it
|
18
|
-
@session.select(
|
17
|
+
it 'should allow selecting exact options where there are inexact matches', :exact_false do
|
18
|
+
@session.select('Mr', from: 'Title')
|
19
19
|
expect(@session.find_field('Title').value).to eq('Mr')
|
20
20
|
end
|
21
21
|
|
22
|
-
it
|
23
|
-
@session.select(
|
22
|
+
it 'should allow selecting options where they are the only inexact match', :exact_false do
|
23
|
+
@session.select('Mis', from: 'Title')
|
24
24
|
expect(@session.find_field('Title').value).to eq('Miss')
|
25
25
|
end
|
26
26
|
|
27
|
-
it
|
27
|
+
it 'should not allow selecting options where they are the only inexact match if `exact: true` is specified' do
|
28
28
|
sel = @session.find(:select, 'Title')
|
29
29
|
expect do
|
30
|
-
sel.select(
|
30
|
+
sel.select('Mis', exact: true)
|
31
31
|
end.to raise_error(Capybara::ElementNotFound)
|
32
32
|
end
|
33
33
|
|
34
|
-
it
|
34
|
+
it 'should not allow selecting an option if the match is ambiguous', :exact_false do
|
35
35
|
expect do
|
36
|
-
@session.select(
|
36
|
+
@session.select('M', from: 'Title')
|
37
37
|
end.to raise_error(Capybara::Ambiguous)
|
38
38
|
end
|
39
39
|
|
40
|
-
it
|
40
|
+
it 'should return the value attribute rather than content if present' do
|
41
41
|
expect(@session.find_field('Locale').value).to eq('en')
|
42
42
|
end
|
43
43
|
|
44
|
-
it
|
45
|
-
@session.select(
|
44
|
+
it 'should select an option from a select box by id' do
|
45
|
+
@session.select('Finnish', from: 'form_locale')
|
46
46
|
@session.click_button('awesome')
|
47
47
|
expect(extract_results(@session)['locale']).to eq('fi')
|
48
48
|
end
|
49
49
|
|
50
|
-
it
|
51
|
-
@session.select(
|
50
|
+
it 'should select an option from a select box by label' do
|
51
|
+
@session.select('Finnish', from: 'Locale')
|
52
52
|
@session.click_button('awesome')
|
53
53
|
expect(extract_results(@session)['locale']).to eq('fi')
|
54
54
|
end
|
55
55
|
|
56
|
-
it
|
57
|
-
@session.select(
|
56
|
+
it 'should select an option without giving a select box' do
|
57
|
+
@session.select('Swedish')
|
58
58
|
@session.click_button('awesome')
|
59
59
|
expect(extract_results(@session)['locale']).to eq('sv')
|
60
60
|
end
|
61
61
|
|
62
|
-
it
|
62
|
+
it 'should escape quotes' do
|
63
63
|
@session.select("John's made-up language", from: 'Locale')
|
64
64
|
@session.click_button('awesome')
|
65
65
|
expect(extract_results(@session)['locale']).to eq('jo')
|
66
66
|
end
|
67
67
|
|
68
|
-
it
|
69
|
-
@session.select(
|
68
|
+
it 'should obey from' do
|
69
|
+
@session.select('Miss', from: 'Other title')
|
70
70
|
@session.click_button('awesome')
|
71
71
|
results = extract_results(@session)
|
72
|
-
expect(results['other_title']).to eq(
|
73
|
-
expect(results['title']).not_to eq(
|
72
|
+
expect(results['other_title']).to eq('Miss')
|
73
|
+
expect(results['title']).not_to eq('Miss')
|
74
74
|
end
|
75
75
|
|
76
|
-
it
|
77
|
-
@session.select(
|
76
|
+
it 'show match labels with preceding or trailing whitespace' do
|
77
|
+
@session.select('Lojban', from: 'Locale')
|
78
78
|
@session.click_button('awesome')
|
79
79
|
expect(extract_results(@session)['locale']).to eq('jbo')
|
80
80
|
end
|
81
81
|
|
82
|
-
it
|
82
|
+
it 'casts to string' do
|
83
83
|
@session.select(:Miss, from: :Title)
|
84
84
|
expect(@session.find_field('Title').value).to eq('Miss')
|
85
85
|
end
|
86
86
|
|
87
|
+
context 'input with datalist' do
|
88
|
+
it 'should select an option' do
|
89
|
+
@session.select('Audi', from: 'manufacturer')
|
90
|
+
@session.click_button('awesome')
|
91
|
+
expect(extract_results(@session)['manufacturer']).to eq('Audi')
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should not find an input without a datalist' do
|
95
|
+
expect do
|
96
|
+
@session.select('Thomas', from: 'form_first_name')
|
97
|
+
end.to raise_error(/Unable to find input box with datalist completion "form_first_name"/)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should not select an option that doesn't exist" do
|
101
|
+
expect do
|
102
|
+
@session.select('Tata', from: 'manufacturer')
|
103
|
+
end.to raise_error(/Unable to find datalist option "Tata"/)
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should not select a disabled option' do
|
107
|
+
expect do
|
108
|
+
@session.select('Mercedes', from: 'manufacturer')
|
109
|
+
end.to raise_error(/Unable to find datalist option "Mercedes"/)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
87
113
|
context "with a locator that doesn't exist" do
|
88
|
-
it
|
89
|
-
msg =
|
114
|
+
it 'should raise an error' do
|
115
|
+
msg = /Unable to find select box "does not exist"/
|
90
116
|
expect do
|
91
117
|
@session.select('foo', from: 'does not exist')
|
92
118
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -94,110 +120,110 @@ Capybara::SpecHelper.spec "#select" do
|
|
94
120
|
end
|
95
121
|
|
96
122
|
context "with an option that doesn't exist" do
|
97
|
-
it
|
98
|
-
msg = /^Unable to find
|
123
|
+
it 'should raise an error' do
|
124
|
+
msg = /^Unable to find option "Does not Exist" within/
|
99
125
|
expect do
|
100
126
|
@session.select('Does not Exist', from: 'form_locale')
|
101
127
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
102
128
|
end
|
103
129
|
end
|
104
130
|
|
105
|
-
context
|
106
|
-
it
|
131
|
+
context 'on a disabled select' do
|
132
|
+
it 'should raise an error' do
|
107
133
|
expect do
|
108
134
|
@session.select('Should not see me', from: 'Disabled Select')
|
109
135
|
end.to raise_error(Capybara::ElementNotFound)
|
110
136
|
end
|
111
137
|
end
|
112
138
|
|
113
|
-
context
|
114
|
-
it
|
139
|
+
context 'on a disabled option' do
|
140
|
+
it 'should not select' do
|
115
141
|
@session.select('Other', from: 'form_title')
|
116
142
|
expect(@session.find_field('form_title').value).not_to eq 'Other'
|
117
143
|
end
|
118
|
-
|
119
|
-
it "should warn" do
|
120
|
-
expect_any_instance_of(Capybara::Node::Element).to receive(:warn).once
|
121
|
-
@session.select('Other', from: 'form_title')
|
122
|
-
end
|
123
144
|
end
|
124
145
|
|
125
|
-
context
|
126
|
-
it
|
146
|
+
context 'with multiple select' do
|
147
|
+
it 'should return an empty value' do
|
127
148
|
expect(@session.find_field('Languages').value).to eq([])
|
128
149
|
end
|
129
150
|
|
130
|
-
it
|
131
|
-
@session.select(
|
132
|
-
@session.select(
|
151
|
+
it 'should return value of the selected options' do
|
152
|
+
@session.select('Ruby', from: 'Languages')
|
153
|
+
@session.select('Javascript', from: 'Languages')
|
133
154
|
expect(@session.find_field('Languages').value).to include('Ruby', 'Javascript')
|
134
155
|
end
|
135
156
|
|
136
|
-
it
|
137
|
-
@session.select(
|
157
|
+
it 'should select one option' do
|
158
|
+
@session.select('Ruby', from: 'Languages')
|
138
159
|
@session.click_button('awesome')
|
139
160
|
expect(extract_results(@session)['languages']).to eq(['Ruby'])
|
140
161
|
end
|
141
162
|
|
142
|
-
it
|
143
|
-
@session.select(
|
144
|
-
@session.select(
|
163
|
+
it 'should select multiple options' do
|
164
|
+
@session.select('Ruby', from: 'Languages')
|
165
|
+
@session.select('Javascript', from: 'Languages')
|
145
166
|
@session.click_button('awesome')
|
146
167
|
expect(extract_results(@session)['languages']).to include('Ruby', 'Javascript')
|
147
168
|
end
|
148
169
|
|
149
|
-
it
|
150
|
-
@session.select(
|
151
|
-
@session.select(
|
152
|
-
@session.select(
|
170
|
+
it 'should remain selected if already selected' do
|
171
|
+
@session.select('Ruby', from: 'Languages')
|
172
|
+
@session.select('Javascript', from: 'Languages')
|
173
|
+
@session.select('Ruby', from: 'Languages')
|
153
174
|
@session.click_button('awesome')
|
154
175
|
expect(extract_results(@session)['languages']).to include('Ruby', 'Javascript')
|
155
176
|
end
|
156
177
|
|
157
|
-
it
|
178
|
+
it 'should return value attribute rather than content if present' do
|
158
179
|
expect(@session.find_field('Underwear').value).to include('thermal')
|
159
180
|
end
|
160
181
|
end
|
161
182
|
|
162
|
-
context
|
163
|
-
context
|
164
|
-
it
|
165
|
-
@session.select(
|
166
|
-
@session.click_button(
|
167
|
-
expect(extract_results(@session)[
|
183
|
+
context 'with :exact option' do
|
184
|
+
context 'when `false`' do
|
185
|
+
it 'can match select box approximately' do
|
186
|
+
@session.select('Finnish', from: 'Loc', exact: false)
|
187
|
+
@session.click_button('awesome')
|
188
|
+
expect(extract_results(@session)['locale']).to eq('fi')
|
168
189
|
end
|
169
190
|
|
170
|
-
it
|
171
|
-
@session.select(
|
172
|
-
@session.click_button(
|
173
|
-
expect(extract_results(@session)[
|
191
|
+
it 'can match option approximately' do
|
192
|
+
@session.select('Fin', from: 'Locale', exact: false)
|
193
|
+
@session.click_button('awesome')
|
194
|
+
expect(extract_results(@session)['locale']).to eq('fi')
|
174
195
|
end
|
175
196
|
|
176
|
-
it
|
177
|
-
@session.select(
|
178
|
-
@session.click_button(
|
179
|
-
expect(extract_results(@session)[
|
197
|
+
it 'can match option approximately when :from not given' do
|
198
|
+
@session.select('made-up language', exact: false)
|
199
|
+
@session.click_button('awesome')
|
200
|
+
expect(extract_results(@session)['locale']).to eq('jo')
|
180
201
|
end
|
181
202
|
end
|
182
203
|
|
183
|
-
context
|
184
|
-
it
|
204
|
+
context 'when `true`' do
|
205
|
+
it 'can match select box approximately' do
|
185
206
|
expect do
|
186
|
-
@session.select(
|
207
|
+
@session.select('Finnish', from: 'Loc', exact: true)
|
187
208
|
end.to raise_error(Capybara::ElementNotFound)
|
188
209
|
end
|
189
210
|
|
190
|
-
it
|
211
|
+
it 'can match option approximately' do
|
191
212
|
expect do
|
192
|
-
@session.select(
|
213
|
+
@session.select('Fin', from: 'Locale', exact: true)
|
193
214
|
end.to raise_error(Capybara::ElementNotFound)
|
194
215
|
end
|
195
216
|
|
196
|
-
it
|
217
|
+
it 'can match option approximately when :from not given' do
|
197
218
|
expect do
|
198
|
-
@session.select(
|
219
|
+
@session.select('made-up language', exact: true)
|
199
220
|
end.to raise_error(Capybara::ElementNotFound)
|
200
221
|
end
|
201
222
|
end
|
202
223
|
end
|
224
|
+
|
225
|
+
it 'should error when not passed a locator for :from option' do
|
226
|
+
select = @session.find(:select, 'Title')
|
227
|
+
expect { @session.select('Mr', from: select) }.to raise_error(ArgumentError, /does not take an element/)
|
228
|
+
end
|
203
229
|
end
|
@@ -1,33 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
Capybara::SpecHelper.spec Capybara::Selector do
|
2
4
|
before do
|
3
5
|
@session.visit('/form')
|
4
6
|
end
|
5
7
|
|
6
|
-
describe
|
7
|
-
it
|
8
|
+
describe ':label selector' do
|
9
|
+
it 'finds a label by text' do
|
8
10
|
expect(@session.find(:label, 'Customer Name').text).to eq 'Customer Name'
|
9
11
|
end
|
10
12
|
|
11
|
-
it
|
13
|
+
it 'finds a label by for attribute string' do
|
12
14
|
expect(@session.find(:label, for: 'form_other_title')['for']).to eq 'form_other_title'
|
13
15
|
end
|
14
16
|
|
15
|
-
it
|
17
|
+
it 'finds a label for for attribute regex' do
|
18
|
+
expect(@session.find(:label, for: /_other_title/)['for']).to eq 'form_other_title'
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'finds a label from nested input using :for filter with id string' do
|
16
22
|
expect(@session.find(:label, for: 'nested_label').text).to eq 'Nested Label'
|
17
23
|
end
|
18
24
|
|
19
|
-
it
|
25
|
+
it 'finds a label from nested input using :for filter with id regexp' do
|
26
|
+
expect(@session.find(:label, for: /nested_lab/).text).to eq 'Nested Label'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'finds a label from nested input using :for filter with element' do
|
20
30
|
input = @session.find(:id, 'nested_label')
|
21
31
|
expect(@session.find(:label, for: input).text).to eq 'Nested Label'
|
22
32
|
end
|
23
33
|
|
24
|
-
it
|
34
|
+
it 'finds a label from nested input using :for filter with element when no id on label' do
|
35
|
+
input = @session.find(:css, '#wrapper_label').find(:css, 'input')
|
36
|
+
expect(@session.find(:label, for: input).text).to eq 'Wrapper Label'
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'finds the label for an non-nested element when using :for filter' do
|
25
40
|
select = @session.find(:id, 'form_other_title')
|
26
41
|
expect(@session.find(:label, for: select)['for']).to eq 'form_other_title'
|
27
42
|
end
|
28
43
|
|
29
|
-
context
|
30
|
-
it
|
44
|
+
context 'with exact option' do
|
45
|
+
it 'matches substrings' do
|
31
46
|
expect(@session.find(:label, 'Customer Na', exact: false).text).to eq 'Customer Name'
|
32
47
|
end
|
33
48
|
|
@@ -37,29 +52,47 @@ Capybara::SpecHelper.spec Capybara::Selector do
|
|
37
52
|
end
|
38
53
|
end
|
39
54
|
|
40
|
-
describe
|
41
|
-
|
42
|
-
|
55
|
+
describe 'field selectors' do
|
56
|
+
context 'with :id option' do
|
57
|
+
it 'can find specifically by id' do
|
58
|
+
expect(@session.find(:field, id: 'customer_email').value).to eq 'ben@ben.com'
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'can find by regex' do
|
62
|
+
expect(@session.find(:field, id: /ustomer.emai/).value).to eq 'ben@ben.com'
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'can find by case-insensitive id' do
|
66
|
+
expect(@session.find(:field, id: /StOmer.emAI/i).value).to eq 'ben@ben.com'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'can find specifically by name string' do
|
71
|
+
expect(@session.find(:field, name: 'form[other_title]')['id']).to eq 'form_other_title'
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'can find specifically by name regex' do
|
75
|
+
expect(@session.find(:field, name: /form\[other_.*\]/)['id']).to eq 'form_other_title'
|
43
76
|
end
|
44
77
|
|
45
|
-
it
|
46
|
-
expect(@session.find(:field,
|
78
|
+
it 'can find specifically by placeholder string' do
|
79
|
+
expect(@session.find(:field, placeholder: 'FirstName')['id']).to eq 'form_first_name'
|
47
80
|
end
|
48
81
|
|
49
|
-
it
|
50
|
-
expect(@session.find(:field, placeholder:
|
82
|
+
it 'can find specifically by placeholder regex' do
|
83
|
+
expect(@session.find(:field, placeholder: /FirstN.*/)['id']).to eq 'form_first_name'
|
51
84
|
end
|
52
85
|
|
53
|
-
it
|
86
|
+
it 'can find by type' do
|
54
87
|
expect(@session.find(:field, 'Confusion', type: 'checkbox')['id']).to eq 'confusion_checkbox'
|
55
88
|
expect(@session.find(:field, 'Confusion', type: 'text')['id']).to eq 'confusion_text'
|
56
89
|
expect(@session.find(:field, 'Confusion', type: 'textarea')['id']).to eq 'confusion_textarea'
|
57
90
|
end
|
58
91
|
|
59
|
-
it
|
92
|
+
it 'can find by class' do
|
60
93
|
expect(@session.find(:field, class: 'confusion-checkbox')['id']).to eq 'confusion_checkbox'
|
61
94
|
expect(@session).to have_selector(:field, class: 'confusion', count: 3)
|
62
|
-
expect(@session.find(:field, class: [
|
95
|
+
expect(@session.find(:field, class: %w[confusion confusion-textarea])['id']).to eq 'confusion_textarea'
|
63
96
|
end
|
64
97
|
end
|
65
98
|
end
|
@@ -9,31 +9,31 @@ Capybara::SpecHelper.spec '#sibling' do
|
|
9
9
|
Capybara::Selector.remove(:monkey)
|
10
10
|
end
|
11
11
|
|
12
|
-
it
|
12
|
+
it 'should find a prior sibling element using the given locator' do
|
13
13
|
el = @session.find(:css, '#mid_sibling')
|
14
14
|
expect(el.sibling('//div[@data-pre]')[:id]).to eq('pre_sibling')
|
15
15
|
end
|
16
16
|
|
17
|
-
it
|
17
|
+
it 'should find a following sibling element using the given locator' do
|
18
18
|
el = @session.find(:css, '#mid_sibling')
|
19
19
|
expect(el.sibling('//div[@data-post]')[:id]).to eq('post_sibling')
|
20
20
|
end
|
21
21
|
|
22
|
-
it
|
22
|
+
it 'should raise an error if there are multiple matches' do
|
23
23
|
el = @session.find(:css, '#mid_sibling')
|
24
24
|
expect { el.sibling('//div') }.to raise_error(Capybara::Ambiguous)
|
25
25
|
end
|
26
26
|
|
27
|
-
context
|
28
|
-
it
|
27
|
+
context 'with css selectors' do
|
28
|
+
it 'should find the first element using the given locator' do
|
29
29
|
el = @session.find(:css, '#mid_sibling')
|
30
30
|
expect(el.sibling(:css, '#pre_sibling')).to have_text('Pre Sibling')
|
31
31
|
expect(el.sibling(:css, '#post_sibling')).to have_text('Post Sibling')
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
context
|
36
|
-
it
|
35
|
+
context 'with custom selector' do
|
36
|
+
it 'should use the custom selector' do
|
37
37
|
Capybara.add_selector(:data_attribute) do
|
38
38
|
xpath { |attr| ".//*[@data-#{attr}]" }
|
39
39
|
end
|
@@ -43,10 +43,10 @@ Capybara::SpecHelper.spec '#sibling' do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
it
|
46
|
+
it 'should raise ElementNotFound with a useful default message if nothing was found' do
|
47
47
|
el = @session.find(:css, '#child')
|
48
48
|
expect do
|
49
49
|
el.sibling(:xpath, '//div[@id="nosuchthing"]')
|
50
|
-
end.to raise_error(Capybara::ElementNotFound,
|
50
|
+
end.to raise_error(Capybara::ElementNotFound, 'Unable to find xpath "//div[@id=\\"nosuchthing\\"]" that is a sibling of visible css "#child"')
|
51
51
|
end
|
52
52
|
end
|