capybara 3.0.0 → 3.36.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 +777 -10
- data/License.txt +1 -1
- data/README.md +75 -58
- 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 +34 -9
- data/lib/capybara/dsl.rb +14 -6
- data/lib/capybara/helpers.rb +52 -7
- data/lib/capybara/minitest/spec.rb +173 -84
- data/lib/capybara/minitest.rb +250 -144
- data/lib/capybara/node/actions.rb +248 -124
- data/lib/capybara/node/base.rb +34 -20
- data/lib/capybara/node/document.rb +14 -2
- data/lib/capybara/node/document_matchers.rb +13 -15
- data/lib/capybara/node/element.rb +339 -113
- data/lib/capybara/node/finders.rb +95 -82
- data/lib/capybara/node/matchers.rb +338 -157
- data/lib/capybara/node/simple.rb +54 -15
- 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 +600 -103
- 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 +47 -28
- data/lib/capybara/rack_test/driver.rb +12 -3
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +53 -50
- data/lib/capybara/rack_test/node.rb +114 -37
- data/lib/capybara/rails.rb +1 -1
- data/lib/capybara/registration_container.rb +44 -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 +45 -0
- data/lib/capybara/result.rb +86 -52
- data/lib/capybara/rspec/features.rb +8 -10
- data/lib/capybara/rspec/matcher_proxies.rb +39 -18
- data/lib/capybara/rspec/matchers/base.rb +111 -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 +77 -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 +138 -316
- 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 +89 -12
- 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 +54 -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 +279 -0
- data/lib/capybara/selector/filter.rb +1 -0
- data/lib/capybara/selector/filter_set.rb +72 -27
- 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 +214 -0
- data/lib/capybara/selector/selector.rb +85 -200
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +226 -537
- 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 +296 -238
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -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 +228 -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/logger_suppressor.rb +40 -0
- data/lib/capybara/selenium/node.rb +436 -166
- data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +104 -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/action_pauser.rb +26 -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 +69 -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 +38 -6
- data/lib/capybara/session/matchers.rb +26 -19
- data/lib/capybara/session.rb +258 -190
- 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 +122 -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 -42
- 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} +62 -38
- data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +120 -72
- data/lib/capybara/spec/session/body_spec.rb +11 -13
- data/lib/capybara/spec/session/check_spec.rb +111 -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 +78 -55
- data/lib/capybara/spec/session/current_scope_spec.rb +7 -7
- 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 +104 -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 +32 -14
- data/lib/capybara/spec/session/find_spec.rb +236 -141
- data/lib/capybara/spec/session/first_spec.rb +44 -43
- 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 +44 -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 +18 -18
- 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 +92 -12
- data/lib/capybara/spec/session/has_css_spec.rb +271 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +48 -33
- data/lib/capybara/spec/session/has_field_spec.rb +137 -58
- data/lib/capybara/spec/session/has_link_spec.rb +30 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +26 -24
- data/lib/capybara/spec/session/has_select_spec.rb +75 -47
- data/lib/capybara/spec/session/has_selector_spec.rb +102 -69
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +170 -4
- data/lib/capybara/spec/session/has_text_spec.rb +108 -52
- 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 +35 -0
- data/lib/capybara/spec/session/node_spec.rb +871 -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 +52 -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 +117 -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 +40 -21
- data/lib/capybara/spec/session/unselect_spec.rb +37 -37
- data/lib/capybara/spec/session/visit_spec.rb +59 -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 +10 -7
- data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
- data/lib/capybara/spec/session/within_spec.rb +69 -44
- data/lib/capybara/spec/spec_helper.rb +41 -53
- data/lib/capybara/spec/test_app.rb +79 -40
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +134 -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 +43 -10
- 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_other.erb +6 -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 +31 -25
- data/lib/capybara.rb +120 -100
- data/spec/basic_node_spec.rb +59 -34
- data/spec/capybara_spec.rb +54 -52
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +80 -53
- 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 +4 -4
- data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
- data/spec/minitest_spec.rb +38 -5
- data/spec/minitest_spec_spec.rb +88 -62
- data/spec/per_session_config_spec.rb +5 -5
- data/spec/rack_test_spec.rb +169 -115
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +86 -33
- data/spec/rspec/features_spec.rb +26 -23
- data/spec/rspec/scenarios_spec.rb +8 -4
- data/spec/rspec/shared_spec_matchers.rb +393 -363
- data/spec/rspec/views_spec.rb +4 -3
- data/spec/rspec_matchers_spec.rb +10 -10
- data/spec/rspec_spec.rb +109 -85
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +391 -61
- data/spec/selenium_spec_chrome.rb +180 -41
- data/spec/selenium_spec_chrome_remote.rb +101 -0
- data/spec/selenium_spec_edge.rb +28 -8
- data/spec/selenium_spec_firefox.rb +211 -0
- data/spec/selenium_spec_firefox_remote.rb +80 -0
- data/spec/selenium_spec_ie.rb +127 -11
- data/spec/selenium_spec_safari.rb +156 -0
- data/spec/server_spec.rb +177 -78
- data/spec/session_spec.rb +52 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +455 -123
- data/spec/spec_helper.rb +91 -2
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +343 -42
- data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
- data/.yard/templates_custom/default/class/html/setup.rb +0 -17
- data/.yard/yard_extensions.rb +0 -78
- data/lib/capybara/rspec/compound.rb +0 -90
- data/lib/capybara/spec/session/assert_selector.rb +0 -149
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/views/with_title.erb +0 -5
- data/spec/selenium_spec_marionette.rb +0 -143
|
@@ -5,50 +5,68 @@ module Capybara
|
|
|
5
5
|
module Finders
|
|
6
6
|
##
|
|
7
7
|
#
|
|
8
|
-
# Find an {Capybara::Node::Element} based on the given arguments.
|
|
8
|
+
# Find an {Capybara::Node::Element} based on the given arguments. {#find} will raise an error if the element
|
|
9
9
|
# is not found.
|
|
10
10
|
#
|
|
11
|
-
# @!macro waiting_behavior
|
|
12
|
-
# If the driver is capable of executing JavaScript, +$0+ will wait for a set amount of time
|
|
13
|
-
# and continuously retry finding the element until either the element is found or the time
|
|
14
|
-
# expires. The length of time +find+ will wait is controlled through {Capybara.default_max_wait_time}
|
|
15
|
-
# and defaults to 2 seconds.
|
|
16
|
-
# @option options [false, Numeric] wait (Capybara.default_max_wait_time) Maximum time to wait for matching element to appear.
|
|
17
|
-
#
|
|
18
|
-
# +find+ takes the same options as +all+.
|
|
19
|
-
#
|
|
20
11
|
# page.find('#foo').find('.bar')
|
|
21
12
|
# page.find(:xpath, './/div[contains(., "bar")]')
|
|
22
13
|
# page.find('li', text: 'Quox').click_link('Delete')
|
|
23
14
|
#
|
|
24
|
-
# @param (see
|
|
15
|
+
# @param (see #all)
|
|
25
16
|
#
|
|
26
|
-
# @
|
|
17
|
+
# @macro waiting_behavior
|
|
18
|
+
#
|
|
19
|
+
# @!macro system_filters
|
|
20
|
+
# @option options [String, Regexp] text Only find elements which contain this text or match this regexp
|
|
21
|
+
# @option options [String, Boolean] exact_text
|
|
22
|
+
# When String the elements contained text must match exactly, when Boolean controls whether the `text` option must match exactly.
|
|
23
|
+
# Defaults to {Capybara.configure exact_text}.
|
|
24
|
+
# @option options [Boolean] normalize_ws
|
|
25
|
+
# Whether the `text`/`exact_text` options are compared against element text with whitespace normalized or as returned by the driver.
|
|
26
|
+
# Defaults to {Capybara.configure default_normalize_ws}.
|
|
27
|
+
# @option options [Boolean, Symbol] visible
|
|
28
|
+
# Only find elements with the specified visibility. Defaults to behavior indicated by {Capybara.configure ignore_hidden_elements}.
|
|
29
|
+
# * true - only finds visible elements.
|
|
30
|
+
# * false - finds invisible _and_ visible elements.
|
|
31
|
+
# * :all - same as false; finds visible and invisible elements.
|
|
32
|
+
# * :hidden - only finds invisible elements.
|
|
33
|
+
# * :visible - same as true; only finds visible elements.
|
|
34
|
+
# @option options [Boolean] obscured Only find elements with the specified obscured state:
|
|
35
|
+
# * true - only find elements whose centerpoint is not in the viewport or is obscured by another non-descendant element.
|
|
36
|
+
# * false - only find elements whose centerpoint is in the viewport and is not obscured by other non-descendant elements.
|
|
37
|
+
# @option options [String, Regexp] id Only find elements with an id that matches the value passed
|
|
38
|
+
# @option options [String, Array<String>, Regexp] class Only find elements with matching class/classes.
|
|
39
|
+
# * Absence of a class can be checked by prefixing the class name with `!`
|
|
40
|
+
# * If you need to check for existence of a class name that starts with `!` then prefix with `!!`
|
|
41
|
+
#
|
|
42
|
+
# class:['a', '!b', '!!!c'] # limit to elements with class 'a' and '!c' but not class 'b'
|
|
43
|
+
#
|
|
44
|
+
# @option options [String, Regexp, Hash] style Only find elements with matching style. String and Regexp will be checked against text of the elements `style` attribute, while a Hash will be compared against the elements full style
|
|
45
|
+
# @option options [Boolean] exact Control whether `is` expressions in the given XPath match exactly or partially. Defaults to {Capybara.configure exact}.
|
|
46
|
+
# @option options [Symbol] match The matching strategy to use. Defaults to {Capybara.configure match}.
|
|
27
47
|
#
|
|
28
48
|
# @return [Capybara::Node::Element] The found element
|
|
29
49
|
# @raise [Capybara::ElementNotFound] If the element can't be found before time expires
|
|
30
50
|
#
|
|
31
51
|
def find(*args, **options, &optional_filter_block)
|
|
32
52
|
options[:session_options] = session_options
|
|
33
|
-
synced_resolve Capybara::Queries::SelectorQuery.new(*args, options, &optional_filter_block)
|
|
53
|
+
synced_resolve Capybara::Queries::SelectorQuery.new(*args, **options, &optional_filter_block)
|
|
34
54
|
end
|
|
35
55
|
|
|
36
56
|
##
|
|
37
57
|
#
|
|
38
|
-
# Find an {Capybara::Node::Element} based on the given arguments that is also an ancestor of the element called on.
|
|
39
|
-
# is not found.
|
|
58
|
+
# Find an {Capybara::Node::Element} based on the given arguments that is also an ancestor of the element called on.
|
|
59
|
+
# {#ancestor} will raise an error if the element is not found.
|
|
40
60
|
#
|
|
41
|
-
#
|
|
61
|
+
# {#ancestor} takes the same options as {#find}.
|
|
42
62
|
#
|
|
43
63
|
# element.ancestor('#foo').find('.bar')
|
|
44
64
|
# element.ancestor(:xpath, './/div[contains(., "bar")]')
|
|
45
65
|
# element.ancestor('ul', text: 'Quox').click_link('Delete')
|
|
46
66
|
#
|
|
47
|
-
# @param (see
|
|
67
|
+
# @param (see #find)
|
|
48
68
|
#
|
|
49
|
-
#
|
|
50
|
-
#
|
|
51
|
-
# @option options [Boolean] match The matching strategy to use.
|
|
69
|
+
# @macro waiting_behavior
|
|
52
70
|
#
|
|
53
71
|
# @return [Capybara::Node::Element] The found element
|
|
54
72
|
# @raise [Capybara::ElementNotFound] If the element can't be found before time expires
|
|
@@ -60,22 +78,19 @@ module Capybara
|
|
|
60
78
|
|
|
61
79
|
##
|
|
62
80
|
#
|
|
63
|
-
# Find an {Capybara::Node::Element} based on the given arguments that is also a sibling of the element called on.
|
|
64
|
-
# is not found.
|
|
81
|
+
# Find an {Capybara::Node::Element} based on the given arguments that is also a sibling of the element called on.
|
|
82
|
+
# {#sibling} will raise an error if the element is not found.
|
|
65
83
|
#
|
|
66
|
-
#
|
|
67
|
-
# +sibling+ takes the same options as +find+.
|
|
84
|
+
# {#sibling} takes the same options as {#find}.
|
|
68
85
|
#
|
|
69
86
|
# element.sibling('#foo').find('.bar')
|
|
70
87
|
# element.sibling(:xpath, './/div[contains(., "bar")]')
|
|
71
88
|
# element.sibling('ul', text: 'Quox').click_link('Delete')
|
|
72
89
|
#
|
|
73
|
-
# @param (see
|
|
90
|
+
# @param (see #find)
|
|
74
91
|
#
|
|
75
92
|
# @macro waiting_behavior
|
|
76
93
|
#
|
|
77
|
-
# @option options [Boolean] match The matching strategy to use.
|
|
78
|
-
#
|
|
79
94
|
# @return [Capybara::Node::Element] The found element
|
|
80
95
|
# @raise [Capybara::ElementNotFound] If the element can't be found before time expires
|
|
81
96
|
#
|
|
@@ -88,8 +103,8 @@ module Capybara
|
|
|
88
103
|
#
|
|
89
104
|
# Find a form field on the page. The field can be found by its name, id or label text.
|
|
90
105
|
#
|
|
91
|
-
# @overload find_field([locator], options
|
|
92
|
-
# @param [String] locator name, id, placeholder or text of associated label element
|
|
106
|
+
# @overload find_field([locator], **options)
|
|
107
|
+
# @param [String] locator name, id, {Capybara.configure test_id} attribute, placeholder or text of associated label element
|
|
93
108
|
#
|
|
94
109
|
# @macro waiting_behavior
|
|
95
110
|
#
|
|
@@ -104,48 +119,45 @@ module Capybara
|
|
|
104
119
|
# @option options [String, Regexp] with Value of field to match on
|
|
105
120
|
# @option options [String] type Type of field to match on
|
|
106
121
|
# @option options [Boolean] multiple Match fields that can have multiple values?
|
|
107
|
-
# @option options [String] id
|
|
122
|
+
# @option options [String, Regexp] id Match fields that match the id attribute
|
|
108
123
|
# @option options [String] name Match fields that match the name attribute
|
|
109
124
|
# @option options [String] placeholder Match fields that match the placeholder attribute
|
|
110
|
-
# @option options [String, Array<String
|
|
125
|
+
# @option options [String, Array<String>, Regexp] class Match fields that match the class(es) passed
|
|
111
126
|
# @return [Capybara::Node::Element] The found element
|
|
112
127
|
#
|
|
113
|
-
|
|
114
128
|
def find_field(locator = nil, **options, &optional_filter_block)
|
|
115
|
-
find(:field, locator, options, &optional_filter_block)
|
|
129
|
+
find(:field, locator, **options, &optional_filter_block)
|
|
116
130
|
end
|
|
117
131
|
|
|
118
132
|
##
|
|
119
133
|
#
|
|
120
134
|
# Find a link on the page. The link can be found by its id or text.
|
|
121
135
|
#
|
|
122
|
-
# @overload find_link([locator], options
|
|
123
|
-
# @param [String] locator id, title, text, or alt of enclosed img element
|
|
136
|
+
# @overload find_link([locator], **options)
|
|
137
|
+
# @param [String] locator id, {Capybara.configure test_id} attribute, title, text, or alt of enclosed img element
|
|
124
138
|
#
|
|
125
139
|
# @macro waiting_behavior
|
|
126
140
|
#
|
|
127
|
-
# @option options [String,Regexp,nil] href
|
|
128
|
-
# @option options [String] id
|
|
141
|
+
# @option options [String,Regexp,nil] href Value to match against the links href, if `nil` finds link placeholders (`<a>` elements with no href attribute), if `false` ignores the href
|
|
142
|
+
# @option options [String, Regexp] id Match links with the id provided
|
|
129
143
|
# @option options [String] title Match links with the title provided
|
|
130
144
|
# @option options [String] alt Match links with a contained img element whose alt matches
|
|
131
|
-
# @option options [String, Array<String
|
|
145
|
+
# @option options [String, Array<String>, Regexp] class Match links that match the class(es) provided
|
|
132
146
|
# @return [Capybara::Node::Element] The found element
|
|
133
147
|
#
|
|
134
148
|
def find_link(locator = nil, **options, &optional_filter_block)
|
|
135
|
-
find(:link, locator, options, &optional_filter_block)
|
|
149
|
+
find(:link, locator, **options, &optional_filter_block)
|
|
136
150
|
end
|
|
137
151
|
|
|
138
152
|
##
|
|
139
153
|
#
|
|
140
154
|
# Find a button on the page.
|
|
141
|
-
# This can be any
|
|
142
|
-
#
|
|
143
|
-
# by their text content, and image
|
|
144
|
-
#
|
|
145
|
-
# @overload find_button([locator], options={})
|
|
146
|
-
# @param [String] locator id, value, title, text content, alt of image
|
|
155
|
+
# This can be any `<input>` element of type submit, reset, image, button or it can be a
|
|
156
|
+
# `<button>` element. All buttons can be found by their id, name, {Capybara.configure test_id} attribute, value, or title.
|
|
157
|
+
# `<button>` elements can also be found by their text content, and image `<input>` elements by their alt attribute.
|
|
147
158
|
#
|
|
148
|
-
#
|
|
159
|
+
# @overload find_button([locator], **options)
|
|
160
|
+
# @param [String] locator id, name, {Capybara.configure test_id} attribute, value, title, text content, alt of image
|
|
149
161
|
#
|
|
150
162
|
# @macro waiting_behavior
|
|
151
163
|
#
|
|
@@ -153,14 +165,15 @@ module Capybara
|
|
|
153
165
|
# * true - only finds a disabled button
|
|
154
166
|
# * false - only finds an enabled button
|
|
155
167
|
# * :all - finds either an enabled or disabled button
|
|
156
|
-
# @option options [String] id Match buttons with the id provided
|
|
157
|
-
# @option options [String]
|
|
158
|
-
# @option options [String]
|
|
159
|
-
# @option options [String
|
|
168
|
+
# @option options [String, Regexp] id Match buttons with the id provided
|
|
169
|
+
# @option options [String] name Match buttons with the name provided
|
|
170
|
+
# @option options [String] title Match buttons with the title provided
|
|
171
|
+
# @option options [String] value Match buttons with the value provided
|
|
172
|
+
# @option options [String, Array<String>, Regexp] class Match buttons that match the class(es) provided
|
|
160
173
|
# @return [Capybara::Node::Element] The found element
|
|
161
174
|
#
|
|
162
175
|
def find_button(locator = nil, **options, &optional_filter_block)
|
|
163
|
-
find(:button, locator, options, &optional_filter_block)
|
|
176
|
+
find(:button, locator, **options, &optional_filter_block)
|
|
164
177
|
end
|
|
165
178
|
|
|
166
179
|
##
|
|
@@ -174,11 +187,11 @@ module Capybara
|
|
|
174
187
|
# @return [Capybara::Node::Element] The found element
|
|
175
188
|
#
|
|
176
189
|
def find_by_id(id, **options, &optional_filter_block)
|
|
177
|
-
find(:id, id, options, &optional_filter_block)
|
|
190
|
+
find(:id, id, **options, &optional_filter_block)
|
|
178
191
|
end
|
|
179
192
|
|
|
180
193
|
##
|
|
181
|
-
# @!method all([kind = Capybara.default_selector], locator = nil, options
|
|
194
|
+
# @!method all([kind = Capybara.default_selector], locator = nil, **options)
|
|
182
195
|
#
|
|
183
196
|
# Find all elements on the page matching the given selector
|
|
184
197
|
# and options.
|
|
@@ -190,9 +203,8 @@ module Capybara
|
|
|
190
203
|
# page.all(:css, 'a#person_123')
|
|
191
204
|
# page.all(:xpath, './/a[@id="person_123"]')
|
|
192
205
|
#
|
|
193
|
-
#
|
|
194
206
|
# If the type of selector is left out, Capybara uses
|
|
195
|
-
# {Capybara.default_selector}. It's set to
|
|
207
|
+
# {Capybara.configure default_selector}. It's set to `:css` by default.
|
|
196
208
|
#
|
|
197
209
|
# page.all("a#person_123")
|
|
198
210
|
#
|
|
@@ -205,56 +217,51 @@ module Capybara
|
|
|
205
217
|
# page.all('a', text: 'Home')
|
|
206
218
|
# page.all('#menu li', visible: true)
|
|
207
219
|
#
|
|
208
|
-
# By default Capybara's waiting behavior will wait up to
|
|
220
|
+
# By default Capybara's waiting behavior will wait up to {Capybara.configure default_max_wait_time}
|
|
209
221
|
# seconds for matching elements to be available and then return an empty result if none
|
|
210
222
|
# are available. It is possible to set expectations on the number of results located and
|
|
211
223
|
# Capybara will raise an exception if the number of elements located don't satisfy the
|
|
212
|
-
# specified conditions.
|
|
224
|
+
# specified conditions. The expectations can be set using:
|
|
213
225
|
#
|
|
214
226
|
# page.assert_selector('p#foo', count: 4)
|
|
215
227
|
# page.assert_selector('p#foo', maximum: 10)
|
|
216
228
|
# page.assert_selector('p#foo', minimum: 1)
|
|
217
229
|
# page.assert_selector('p#foo', between: 1..10)
|
|
218
230
|
#
|
|
219
|
-
#
|
|
220
|
-
# count matching.
|
|
221
|
-
#
|
|
222
|
-
# @param [Symbol] kind Optional selector type (:css, :xpath, :field, etc.) - Defaults to Capybara.default_selector
|
|
231
|
+
# @param [Symbol] kind Optional selector type (:css, :xpath, :field, etc.). Defaults to {Capybara.configure default_selector}.
|
|
223
232
|
# @param [String] locator The locator for the specified selector
|
|
224
|
-
# @
|
|
225
|
-
# @
|
|
226
|
-
# @option options [Boolean, Symbol] visible Only find elements with the specified visibility:
|
|
227
|
-
# * true - only finds visible elements.
|
|
228
|
-
# * false - finds invisible _and_ visible elements.
|
|
229
|
-
# * :all - same as false; finds visible and invisible elements.
|
|
230
|
-
# * :hidden - only finds invisible elements.
|
|
231
|
-
# * :visible - same as true; only finds visible elements.
|
|
233
|
+
# @macro system_filters
|
|
234
|
+
# @macro waiting_behavior
|
|
232
235
|
# @option options [Integer] count Exact number of matches that are expected to be found
|
|
233
236
|
# @option options [Integer] maximum Maximum number of matches that are expected to be found
|
|
234
237
|
# @option options [Integer] minimum Minimum number of matches that are expected to be found
|
|
235
238
|
# @option options [Range] between Number of matches found must be within the given range
|
|
236
|
-
# @option options [Boolean]
|
|
237
|
-
#
|
|
238
|
-
#
|
|
239
|
-
# @overload all([kind = Capybara.default_selector], locator = nil, options
|
|
239
|
+
# @option options [Boolean] allow_reload Beta feature - May be removed in any version.
|
|
240
|
+
# When `true` allows elements to be reloaded if they become stale. This is an advanced behavior and should only be used
|
|
241
|
+
# if you fully understand the potential ramifications. The results can be confusing on dynamic pages. Defaults to `false`
|
|
242
|
+
# @overload all([kind = Capybara.default_selector], locator = nil, **options)
|
|
243
|
+
# @overload all([kind = Capybara.default_selector], locator = nil, **options, &filter_block)
|
|
240
244
|
# @yieldparam element [Capybara::Node::Element] The element being considered for inclusion in the results
|
|
241
245
|
# @yieldreturn [Boolean] Should the element be considered in the results?
|
|
242
246
|
# @return [Capybara::Result] A collection of found elements
|
|
243
247
|
# @raise [Capybara::ExpectationNotMet] The number of elements found doesn't match the specified conditions
|
|
244
|
-
def all(*args, **options, &optional_filter_block)
|
|
248
|
+
def all(*args, allow_reload: false, **options, &optional_filter_block)
|
|
245
249
|
minimum_specified = options_include_minimum?(options)
|
|
246
250
|
options = { minimum: 1 }.merge(options) unless minimum_specified
|
|
247
251
|
options[:session_options] = session_options
|
|
248
|
-
query = Capybara::Queries::SelectorQuery.new(*args
|
|
252
|
+
query = Capybara::Queries::SelectorQuery.new(*args, **options, &optional_filter_block)
|
|
249
253
|
result = nil
|
|
250
254
|
begin
|
|
251
255
|
synchronize(query.wait) do
|
|
252
256
|
result = query.resolve_for(self)
|
|
257
|
+
result.allow_reload! if allow_reload
|
|
253
258
|
raise Capybara::ExpectationNotMet, result.failure_message unless result.matches_count?
|
|
259
|
+
|
|
254
260
|
result
|
|
255
261
|
end
|
|
256
262
|
rescue Capybara::ExpectationNotMet
|
|
257
263
|
raise if minimum_specified || (result.compare_count == 1)
|
|
264
|
+
|
|
258
265
|
Result.new([], nil)
|
|
259
266
|
end
|
|
260
267
|
end
|
|
@@ -263,12 +270,12 @@ module Capybara
|
|
|
263
270
|
##
|
|
264
271
|
#
|
|
265
272
|
# Find the first element on the page matching the given selector
|
|
266
|
-
# and options. By default
|
|
273
|
+
# and options. By default {#first} will wait up to {Capybara.configure default_max_wait_time}
|
|
267
274
|
# seconds for matching elements to appear and then raise an error if no matching
|
|
268
275
|
# element is found, or `nil` if the provided count options allow for empty results.
|
|
269
276
|
#
|
|
270
277
|
# @overload first([kind], locator, options)
|
|
271
|
-
# @param [
|
|
278
|
+
# @param [Symbol] kind The type of selector
|
|
272
279
|
# @param [String] locator The selector
|
|
273
280
|
# @param [Hash] options Additional options; see {#all}
|
|
274
281
|
# @return [Capybara::Node::Element] The found element or nil
|
|
@@ -290,23 +297,29 @@ module Capybara
|
|
|
290
297
|
result = query.resolve_for(self)
|
|
291
298
|
end
|
|
292
299
|
|
|
293
|
-
|
|
294
|
-
|
|
300
|
+
if ambiguous?(query, result)
|
|
301
|
+
raise Capybara::Ambiguous, "Ambiguous match, found #{result.size} elements matching #{query.applied_description}"
|
|
302
|
+
end
|
|
303
|
+
raise Capybara::ElementNotFound, "Unable to find #{query.applied_description}" if result.empty?
|
|
295
304
|
|
|
296
305
|
result.first
|
|
297
306
|
end.tap(&:allow_reload!)
|
|
298
307
|
end
|
|
299
308
|
|
|
300
309
|
def ambiguous?(query, result)
|
|
301
|
-
|
|
310
|
+
%i[one smart].include?(query.match) && (result.size > 1)
|
|
302
311
|
end
|
|
303
312
|
|
|
304
313
|
def prefer_exact?(query)
|
|
305
|
-
|
|
314
|
+
%i[smart prefer_exact].include?(query.match)
|
|
306
315
|
end
|
|
307
316
|
|
|
308
317
|
def options_include_minimum?(opts)
|
|
309
|
-
%i[count minimum between].any? { |
|
|
318
|
+
%i[count minimum between].any? { |key| opts.key?(key) }
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
def parent
|
|
322
|
+
first(:xpath, './parent::*', minimum: 0)
|
|
310
323
|
end
|
|
311
324
|
end
|
|
312
325
|
end
|