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,127 +1,155 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#first' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
+
it 'should find the first element using the given locator' do
|
|
8
9
|
expect(@session.first('//h1').text).to eq('This is a test')
|
|
9
10
|
expect(@session.first("//input[@id='test_field']").value).to eq('monkey')
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
it
|
|
13
|
-
expect
|
|
13
|
+
it 'should raise ElementNotFound when nothing was found' do
|
|
14
|
+
expect do
|
|
15
|
+
@session.first('//div[@id="nosuchthing"]')
|
|
16
|
+
end.to raise_error Capybara::ElementNotFound
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'should return nil when nothing was found if count options allow no results' do
|
|
20
|
+
expect(@session.first('//div[@id="nosuchthing"]', minimum: 0)).to be_nil
|
|
21
|
+
expect(@session.first('//div[@id="nosuchthing"]', count: 0)).to be_nil
|
|
22
|
+
expect(@session.first('//div[@id="nosuchthing"]', between: (0..3))).to be_nil
|
|
14
23
|
end
|
|
15
24
|
|
|
16
|
-
it
|
|
25
|
+
it 'should accept an XPath instance' do
|
|
17
26
|
@session.visit('/form')
|
|
18
|
-
@xpath = Capybara::Selector.
|
|
19
|
-
expect(@xpath).to be_a(
|
|
27
|
+
@xpath = Capybara::Selector.new(:fillable_field, config: {}, format: :xpath).call('First Name')
|
|
28
|
+
expect(@xpath).to be_a(XPath::Union)
|
|
20
29
|
expect(@session.first(@xpath).value).to eq('John')
|
|
21
30
|
end
|
|
22
31
|
|
|
23
|
-
it
|
|
24
|
-
|
|
25
|
-
|
|
32
|
+
it 'should raise when unused parameters are passed' do
|
|
33
|
+
expect do
|
|
34
|
+
@session.first(:css, 'h1', 'unused text')
|
|
35
|
+
end.to raise_error ArgumentError, /Unused parameters passed.*unused text/
|
|
26
36
|
end
|
|
27
37
|
|
|
28
|
-
context
|
|
29
|
-
it
|
|
38
|
+
context 'with css selectors' do
|
|
39
|
+
it 'should find the first element using the given selector' do
|
|
30
40
|
expect(@session.first(:css, 'h1').text).to eq('This is a test')
|
|
31
41
|
expect(@session.first(:css, "input[id='test_field']").value).to eq('monkey')
|
|
32
42
|
end
|
|
33
43
|
end
|
|
34
44
|
|
|
35
|
-
context
|
|
36
|
-
it
|
|
45
|
+
context 'with xpath selectors' do
|
|
46
|
+
it 'should find the first element using the given locator' do
|
|
37
47
|
expect(@session.first(:xpath, '//h1').text).to eq('This is a test')
|
|
38
48
|
expect(@session.first(:xpath, "//input[@id='test_field']").value).to eq('monkey')
|
|
39
49
|
end
|
|
40
50
|
end
|
|
41
51
|
|
|
42
|
-
context
|
|
52
|
+
context 'with css as default selector' do
|
|
43
53
|
before { Capybara.default_selector = :css }
|
|
44
|
-
|
|
54
|
+
|
|
55
|
+
it 'should find the first element using the given locator' do
|
|
45
56
|
expect(@session.first('h1').text).to eq('This is a test')
|
|
46
57
|
expect(@session.first("input[id='test_field']").value).to eq('monkey')
|
|
47
58
|
end
|
|
48
59
|
end
|
|
49
60
|
|
|
50
|
-
context
|
|
51
|
-
it
|
|
52
|
-
expect
|
|
61
|
+
context 'with visible filter' do
|
|
62
|
+
it 'should only find visible nodes when true' do
|
|
63
|
+
expect do
|
|
64
|
+
@session.first(:css, 'a#invisible', visible: true)
|
|
65
|
+
end.to raise_error Capybara::ElementNotFound
|
|
53
66
|
end
|
|
54
67
|
|
|
55
|
-
it
|
|
56
|
-
expect(@session.first(:css,
|
|
57
|
-
expect(@session.first(:css,
|
|
58
|
-
expect(@session.first(:css,
|
|
68
|
+
it 'should find nodes regardless of whether they are invisible when false' do
|
|
69
|
+
expect(@session.first(:css, 'a#invisible', visible: false)).to be_truthy
|
|
70
|
+
expect(@session.first(:css, 'a#invisible', visible: false, text: 'hidden link')).to be_truthy
|
|
71
|
+
expect(@session.first(:css, 'a#visible', visible: false)).to be_truthy
|
|
59
72
|
end
|
|
60
73
|
|
|
61
|
-
it
|
|
62
|
-
expect(@session.first(:css,
|
|
63
|
-
expect(@session.first(:css,
|
|
64
|
-
expect(@session.first(:css,
|
|
74
|
+
it 'should find nodes regardless of whether they are invisible when :all' do
|
|
75
|
+
expect(@session.first(:css, 'a#invisible', visible: :all)).to be_truthy
|
|
76
|
+
expect(@session.first(:css, 'a#invisible', visible: :all, text: 'hidden link')).to be_truthy
|
|
77
|
+
expect(@session.first(:css, 'a#visible', visible: :all)).to be_truthy
|
|
65
78
|
end
|
|
66
79
|
|
|
67
|
-
it
|
|
68
|
-
expect(@session.first(:css,
|
|
69
|
-
expect(@session.first(:css,
|
|
70
|
-
expect
|
|
71
|
-
|
|
80
|
+
it 'should find only hidden nodes when :hidden' do
|
|
81
|
+
expect(@session.first(:css, 'a#invisible', visible: :hidden)).to be_truthy
|
|
82
|
+
expect(@session.first(:css, 'a#invisible', visible: :hidden, text: 'hidden link')).to be_truthy
|
|
83
|
+
expect do
|
|
84
|
+
@session.first(:css, 'a#invisible', visible: :hidden, text: 'not hidden link')
|
|
85
|
+
end.to raise_error Capybara::ElementNotFound
|
|
86
|
+
expect do
|
|
87
|
+
@session.first(:css, 'a#visible', visible: :hidden)
|
|
88
|
+
end.to raise_error Capybara::ElementNotFound
|
|
72
89
|
end
|
|
73
90
|
|
|
74
|
-
it
|
|
75
|
-
expect
|
|
76
|
-
|
|
77
|
-
|
|
91
|
+
it 'should find only visible nodes when :visible' do
|
|
92
|
+
expect do
|
|
93
|
+
@session.first(:css, 'a#invisible', visible: :visible)
|
|
94
|
+
end.to raise_error Capybara::ElementNotFound
|
|
95
|
+
expect do
|
|
96
|
+
@session.first(:css, 'a#invisible', visible: :visible, text: 'hidden link')
|
|
97
|
+
end.to raise_error Capybara::ElementNotFound
|
|
98
|
+
expect(@session.first(:css, 'a#visible', visible: :visible)).to be_truthy
|
|
78
99
|
end
|
|
79
100
|
|
|
80
|
-
it
|
|
101
|
+
it 'should default to Capybara.ignore_hidden_elements' do
|
|
81
102
|
Capybara.ignore_hidden_elements = true
|
|
82
|
-
expect
|
|
103
|
+
expect do
|
|
104
|
+
@session.first(:css, 'a#invisible')
|
|
105
|
+
end.to raise_error Capybara::ElementNotFound
|
|
83
106
|
Capybara.ignore_hidden_elements = false
|
|
84
|
-
expect(@session.first(:css,
|
|
85
|
-
expect(@session.first(:css,
|
|
107
|
+
expect(@session.first(:css, 'a#invisible')).to be_truthy
|
|
108
|
+
expect(@session.first(:css, 'a')).to be_truthy
|
|
86
109
|
end
|
|
87
110
|
end
|
|
88
111
|
|
|
89
|
-
context
|
|
112
|
+
context 'within a scope' do
|
|
90
113
|
before do
|
|
91
114
|
@session.visit('/with_scope')
|
|
92
115
|
end
|
|
93
116
|
|
|
94
|
-
it
|
|
117
|
+
it 'should find the first element using the given locator' do
|
|
95
118
|
@session.within(:xpath, "//div[@id='for_bar']") do
|
|
96
|
-
expect(@session.first('.//form')).
|
|
119
|
+
expect(@session.first('.//form')).to be_truthy
|
|
97
120
|
end
|
|
98
121
|
end
|
|
99
122
|
end
|
|
100
123
|
|
|
101
|
-
context
|
|
124
|
+
context 'waiting behavior', requires: [:js] do
|
|
102
125
|
before do
|
|
103
126
|
@session.visit('/with_js')
|
|
104
127
|
end
|
|
105
128
|
|
|
106
|
-
it
|
|
107
|
-
Capybara.wait_on_first_by_default = false
|
|
129
|
+
it 'should not wait if minimum: 0' do
|
|
108
130
|
@session.click_link('clickable')
|
|
109
|
-
|
|
131
|
+
Capybara.using_wait_time(3) do
|
|
132
|
+
start_time = Time.now
|
|
133
|
+
expect(@session.first(:css, 'a#has-been-clicked', minimum: 0)).to be_nil
|
|
134
|
+
expect(Time.now - start_time).to be < 3
|
|
135
|
+
end
|
|
110
136
|
end
|
|
111
137
|
|
|
112
|
-
it
|
|
113
|
-
Capybara.wait_on_first_by_default = true
|
|
138
|
+
it 'should wait for at least one match by default' do
|
|
114
139
|
Capybara.using_wait_time(3) do
|
|
115
140
|
@session.click_link('clickable')
|
|
116
141
|
expect(@session.first(:css, 'a#has-been-clicked')).not_to be_nil
|
|
117
142
|
end
|
|
118
143
|
end
|
|
119
144
|
|
|
120
|
-
it
|
|
121
|
-
|
|
145
|
+
it 'should raise an error after waiting if no match' do
|
|
146
|
+
@session.click_link('clickable')
|
|
122
147
|
Capybara.using_wait_time(3) do
|
|
123
|
-
|
|
124
|
-
expect
|
|
148
|
+
start_time = Time.now
|
|
149
|
+
expect do
|
|
150
|
+
@session.first(:css, 'a#not-a-real-link')
|
|
151
|
+
end.to raise_error Capybara::ElementNotFound
|
|
152
|
+
expect(Time.now - start_time).to be > 3
|
|
125
153
|
end
|
|
126
154
|
end
|
|
127
155
|
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#frame_title', requires: [:frames] do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/within_frames')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should return the title in a frame' do
|
|
9
|
+
@session.within_frame('frameOne') do
|
|
10
|
+
expect(@session.driver.frame_title).to eq 'This is the title of frame one'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'should return the title in FrameTwo' do
|
|
15
|
+
@session.within_frame('frameTwo') do
|
|
16
|
+
expect(@session.driver.frame_title).to eq 'This is the title of frame two'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'should return the title in the main frame' do
|
|
21
|
+
expect(@session.driver.frame_title).to eq 'With Frames'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#frame_url', requires: [:frames] do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/within_frames')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should return the url in a frame' do
|
|
9
|
+
@session.within_frame('frameOne') do
|
|
10
|
+
expect(@session.driver.frame_url).to end_with '/frame_one'
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'should return the url in FrameTwo' do
|
|
15
|
+
@session.within_frame('frameTwo') do
|
|
16
|
+
expect(@session.driver.frame_url).to end_with '/frame_two'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'should return the url in the main frame' do
|
|
21
|
+
expect(@session.driver.frame_url).to end_with('/within_frames')
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -1,69 +1,82 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#switch_to_frame', requires: [:frames] do
|
|
3
|
-
before
|
|
4
|
+
before do
|
|
4
5
|
@session.visit('/within_frames')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
after
|
|
8
|
+
after do
|
|
8
9
|
# Ensure we clean up after the frame changes
|
|
9
10
|
@session.switch_to_frame(:top)
|
|
10
11
|
end
|
|
11
12
|
|
|
12
|
-
it
|
|
13
|
-
frame = @session.find(:frame,
|
|
13
|
+
it 'should find the div in frameOne' do
|
|
14
|
+
frame = @session.find(:frame, 'frameOne')
|
|
14
15
|
@session.switch_to_frame(frame)
|
|
15
16
|
expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
|
|
16
17
|
end
|
|
17
18
|
|
|
18
|
-
it
|
|
19
|
-
frame = @session.find(:frame,
|
|
19
|
+
it 'should find the div in FrameTwo' do
|
|
20
|
+
frame = @session.find(:frame, 'frameTwo')
|
|
20
21
|
@session.switch_to_frame(frame)
|
|
21
22
|
expect(@session.find("//*[@id='divInFrameTwo']").text).to eql 'This is the text of divInFrameTwo'
|
|
22
23
|
end
|
|
23
24
|
|
|
24
|
-
it
|
|
25
|
-
frame = @session.find(:frame,
|
|
25
|
+
it 'should return to the parent frame when told to' do
|
|
26
|
+
frame = @session.find(:frame, 'frameOne')
|
|
26
27
|
@session.switch_to_frame(frame)
|
|
27
28
|
@session.switch_to_frame(:parent)
|
|
28
29
|
expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
|
|
29
30
|
end
|
|
30
31
|
|
|
31
|
-
it
|
|
32
|
-
frame = @session.find(:frame,
|
|
32
|
+
it 'should be able to switch to nested frames' do
|
|
33
|
+
frame = @session.find(:frame, 'parentFrame')
|
|
33
34
|
@session.switch_to_frame frame
|
|
34
|
-
frame = @session.find(:frame,
|
|
35
|
+
frame = @session.find(:frame, 'childFrame')
|
|
35
36
|
@session.switch_to_frame frame
|
|
36
|
-
frame = @session.find(:frame,
|
|
37
|
+
frame = @session.find(:frame, 'grandchildFrame1')
|
|
37
38
|
@session.switch_to_frame frame
|
|
38
39
|
expect(@session).to have_selector(:css, '#divInFrameOne', text: 'This is the text of divInFrameOne')
|
|
39
40
|
end
|
|
40
41
|
|
|
41
|
-
it
|
|
42
|
+
it 'should reset scope when changing frames' do
|
|
42
43
|
frame = @session.find(:frame, 'parentFrame')
|
|
43
44
|
@session.within(:css, '#divInMainWindow') do
|
|
44
45
|
@session.switch_to_frame(frame)
|
|
45
|
-
expect(@session.has_selector?(:css,
|
|
46
|
+
expect(@session.has_selector?(:css, 'iframe#childFrame')).to be true
|
|
46
47
|
@session.switch_to_frame(:parent)
|
|
47
48
|
end
|
|
48
49
|
end
|
|
49
50
|
|
|
50
|
-
it
|
|
51
|
+
it 'works if the frame is closed', requires: %i[frames js] do
|
|
51
52
|
frame = @session.find(:frame, 'parentFrame')
|
|
52
53
|
@session.switch_to_frame frame
|
|
53
54
|
frame = @session.find(:frame, 'childFrame')
|
|
54
55
|
@session.switch_to_frame frame
|
|
56
|
+
@session.click_link 'Close Window Now'
|
|
57
|
+
@session.switch_to_frame :parent # Go back to parentFrame
|
|
58
|
+
expect(@session).to have_selector(:css, 'body#parentBody')
|
|
59
|
+
expect(@session).not_to have_selector(:css, '#childFrame')
|
|
60
|
+
@session.switch_to_frame :parent # Go back to top
|
|
61
|
+
end
|
|
55
62
|
|
|
56
|
-
|
|
63
|
+
it 'works if the frame is closed with a slight delay', requires: %i[frames js] do
|
|
64
|
+
frame = @session.find(:frame, 'parentFrame')
|
|
65
|
+
@session.switch_to_frame frame
|
|
66
|
+
frame = @session.find(:frame, 'childFrame')
|
|
67
|
+
@session.switch_to_frame frame
|
|
68
|
+
@session.click_link 'Close Window Soon'
|
|
69
|
+
sleep 1
|
|
57
70
|
@session.switch_to_frame :parent # Go back to parentFrame
|
|
58
71
|
expect(@session).to have_selector(:css, 'body#parentBody')
|
|
59
72
|
expect(@session).not_to have_selector(:css, '#childFrame')
|
|
60
73
|
@session.switch_to_frame :parent # Go back to top
|
|
61
74
|
end
|
|
62
75
|
|
|
63
|
-
it
|
|
64
|
-
frame = @session.find(:frame,
|
|
76
|
+
it 'can return to the top frame', requires: [:frames] do
|
|
77
|
+
frame = @session.find(:frame, 'parentFrame')
|
|
65
78
|
@session.switch_to_frame frame
|
|
66
|
-
frame = @session.find(:frame,
|
|
79
|
+
frame = @session.find(:frame, 'childFrame')
|
|
67
80
|
@session.switch_to_frame frame
|
|
68
81
|
@session.switch_to_frame :top
|
|
69
82
|
expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
|
|
@@ -93,7 +106,7 @@ Capybara::SpecHelper.spec '#switch_to_frame', requires: [:frames] do
|
|
|
93
106
|
frame = @session.find(:frame, 'parentFrame')
|
|
94
107
|
@session.switch_to_frame(frame)
|
|
95
108
|
@session.within(:css, '#parentBody') do
|
|
96
|
-
@session.switch_to_frame(@session.find(:frame,
|
|
109
|
+
@session.switch_to_frame(@session.find(:frame, 'childFrame'))
|
|
97
110
|
expect do
|
|
98
111
|
@session.switch_to_frame(:top)
|
|
99
112
|
end.to raise_error(Capybara::ScopeError, "`switch_to_frame(:top)` cannot be called from inside a descendant frame's `within` block.")
|
|
@@ -1,94 +1,114 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#within_frame', requires: [:frames] do
|
|
3
|
-
before
|
|
4
|
+
before do
|
|
4
5
|
@session.visit('/within_frames')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
-
@session.within_frame(
|
|
8
|
+
it 'should find the div in frameOne' do
|
|
9
|
+
@session.within_frame('frameOne') do
|
|
9
10
|
expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
|
|
10
11
|
end
|
|
11
12
|
end
|
|
12
13
|
|
|
13
|
-
it
|
|
14
|
-
@session.within_frame(
|
|
14
|
+
it 'should find the div in FrameTwo' do
|
|
15
|
+
@session.within_frame('frameTwo') do
|
|
15
16
|
expect(@session.find("//*[@id='divInFrameTwo']").text).to eql 'This is the text of divInFrameTwo'
|
|
16
17
|
end
|
|
17
18
|
end
|
|
18
19
|
|
|
19
|
-
it
|
|
20
|
-
@session.within_frame(
|
|
20
|
+
it 'should find the text div in the main window after finding text in frameOne' do
|
|
21
|
+
@session.within_frame('frameOne') do
|
|
21
22
|
expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
|
|
22
23
|
end
|
|
23
24
|
expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
|
|
24
25
|
end
|
|
25
26
|
|
|
26
|
-
it
|
|
27
|
-
@session.within_frame(
|
|
27
|
+
it 'should find the text div in the main window after finding text in frameTwo' do
|
|
28
|
+
@session.within_frame('frameTwo') do
|
|
28
29
|
expect(@session.find("//*[@id='divInFrameTwo']").text).to eql 'This is the text of divInFrameTwo'
|
|
29
30
|
end
|
|
30
31
|
expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
|
|
31
32
|
end
|
|
32
33
|
|
|
33
|
-
it
|
|
34
|
-
expect(@session.within_frame(
|
|
34
|
+
it 'should return the result of executing the block' do
|
|
35
|
+
expect(@session.within_frame('frameOne') { 'return value' }).to eql 'return value'
|
|
35
36
|
end
|
|
36
37
|
|
|
37
|
-
it
|
|
38
|
+
it 'should find the div given Element' do
|
|
38
39
|
element = @session.find(:id, 'frameOne')
|
|
39
40
|
@session.within_frame element do
|
|
40
41
|
expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
|
|
41
42
|
end
|
|
42
43
|
end
|
|
43
44
|
|
|
44
|
-
it
|
|
45
|
+
it 'should find the div given selector and locator' do
|
|
45
46
|
@session.within_frame(:css, '#frameOne') do
|
|
46
47
|
expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
|
|
47
48
|
end
|
|
48
49
|
end
|
|
49
50
|
|
|
50
|
-
it
|
|
51
|
+
it 'should default to the :frame selector kind when only options passed' do
|
|
51
52
|
@session.within_frame(name: 'my frame one') do
|
|
52
53
|
expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
|
|
53
54
|
end
|
|
54
55
|
end
|
|
55
56
|
|
|
56
|
-
it
|
|
57
|
+
it 'should default to the :frame selector when no options passed' do
|
|
58
|
+
container = @session.find(:css, '#divInMainWindow')
|
|
59
|
+
@session.within(container) do
|
|
60
|
+
# Ensure only one frame in scope
|
|
61
|
+
@session.within_frame do
|
|
62
|
+
expect(@session).to have_css('body#parentBody')
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
expect do
|
|
66
|
+
# Multiple frames in scope here
|
|
67
|
+
# rubocop:disable Style/Semicolon
|
|
68
|
+
@session.within_frame { ; }
|
|
69
|
+
# rubocop:enable Style/Semicolon
|
|
70
|
+
end.to raise_error Capybara::Ambiguous
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'should find multiple nested frames' do
|
|
57
74
|
@session.within_frame 'parentFrame' do
|
|
58
75
|
@session.within_frame 'childFrame' do
|
|
59
|
-
@session.within_frame 'grandchildFrame1' do
|
|
60
|
-
|
|
76
|
+
@session.within_frame 'grandchildFrame1' do
|
|
77
|
+
# dummy
|
|
78
|
+
end
|
|
79
|
+
@session.within_frame 'grandchildFrame2' do
|
|
80
|
+
# dummy
|
|
81
|
+
end
|
|
61
82
|
end
|
|
62
83
|
end
|
|
63
84
|
end
|
|
64
85
|
|
|
65
|
-
it
|
|
86
|
+
it 'should reset scope when changing frames' do
|
|
66
87
|
@session.within(:css, '#divInMainWindow') do
|
|
67
|
-
@session.within_frame '
|
|
68
|
-
expect(@session.has_selector?(:css,
|
|
88
|
+
@session.within_frame 'innerParentFrame' do
|
|
89
|
+
expect(@session.has_selector?(:css, 'iframe#childFrame')).to be true
|
|
69
90
|
end
|
|
70
91
|
end
|
|
71
92
|
end
|
|
72
93
|
|
|
73
|
-
it
|
|
94
|
+
it 'works if the frame is closed', requires: %i[frames js] do
|
|
74
95
|
@session.within_frame 'parentFrame' do
|
|
75
96
|
@session.within_frame 'childFrame' do
|
|
76
|
-
@session.click_link 'Close Window'
|
|
97
|
+
@session.click_link 'Close Window Now'
|
|
77
98
|
end
|
|
78
99
|
expect(@session).to have_selector(:css, 'body#parentBody')
|
|
79
100
|
expect(@session).not_to have_selector(:css, '#childFrame')
|
|
80
101
|
end
|
|
81
102
|
end
|
|
82
103
|
|
|
83
|
-
it
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
@session.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}.not_to raise_error
|
|
104
|
+
it 'works if the frame is closed with a slight delay', requires: %i[frames js] do
|
|
105
|
+
@session.within_frame 'parentFrame' do
|
|
106
|
+
@session.within_frame 'childFrame' do
|
|
107
|
+
@session.click_link 'Close Window Soon'
|
|
108
|
+
sleep 1
|
|
109
|
+
end
|
|
110
|
+
expect(@session).to have_selector(:css, 'body#parentBody')
|
|
111
|
+
expect(@session).not_to have_selector(:css, '#childFrame')
|
|
112
|
+
end
|
|
93
113
|
end
|
|
94
114
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#go_back', requires: [:js] do
|
|
3
|
-
it
|
|
4
|
+
it 'should fetch a response from the driver from the previous page' do
|
|
4
5
|
@session.visit('/')
|
|
5
6
|
expect(@session).to have_content('Hello world!')
|
|
6
7
|
@session.visit('/foo')
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#go_forward', requires: [:js] do
|
|
3
|
-
it
|
|
4
|
+
it 'should fetch a response from the driver from the previous page' do
|
|
4
5
|
@session.visit('/')
|
|
5
6
|
expect(@session).to have_content('Hello world!')
|
|
6
7
|
@session.visit('/foo')
|
|
@@ -1,69 +1,69 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#have_all_of_selectors' do
|
|
3
4
|
before do
|
|
4
5
|
@session.visit('/with_html')
|
|
5
6
|
end
|
|
6
7
|
|
|
7
|
-
it
|
|
8
|
-
expect(@session).to have_all_of_selectors(:css,
|
|
8
|
+
it 'should be true if the given selectors are on the page' do
|
|
9
|
+
expect(@session).to have_all_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
|
|
9
10
|
end
|
|
10
11
|
|
|
11
|
-
it
|
|
12
|
-
expect
|
|
13
|
-
expect(@session).to have_all_of_selectors(:css,
|
|
14
|
-
|
|
12
|
+
it 'should be false if any of the given selectors are not on the page' do
|
|
13
|
+
expect do
|
|
14
|
+
expect(@session).to have_all_of_selectors(:css, 'p a#foo', 'h2#h2three', 'h2#h2one')
|
|
15
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
15
16
|
end
|
|
16
17
|
|
|
17
|
-
it
|
|
18
|
+
it 'should use default selector' do
|
|
18
19
|
Capybara.default_selector = :css
|
|
19
|
-
expect(@session).to have_all_of_selectors(
|
|
20
|
-
expect
|
|
21
|
-
expect(@session).to have_all_of_selectors(
|
|
22
|
-
|
|
20
|
+
expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2two', 'h2#h2one')
|
|
21
|
+
expect do
|
|
22
|
+
expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2three', 'h2#h2one')
|
|
23
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
23
24
|
end
|
|
24
25
|
|
|
25
|
-
context
|
|
26
|
-
it
|
|
26
|
+
context 'should respect scopes' do
|
|
27
|
+
it 'when used with `within`' do
|
|
27
28
|
@session.within "//p[@id='first']" do
|
|
28
29
|
expect(@session).to have_all_of_selectors(".//a[@id='foo']")
|
|
29
|
-
expect
|
|
30
|
+
expect do
|
|
30
31
|
expect(@session).to have_all_of_selectors(".//a[@id='red']")
|
|
31
|
-
|
|
32
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
32
33
|
end
|
|
33
34
|
end
|
|
34
35
|
|
|
35
|
-
it
|
|
36
|
+
it 'when called on elements' do
|
|
36
37
|
el = @session.find "//p[@id='first']"
|
|
37
38
|
expect(el).to have_all_of_selectors(".//a[@id='foo']")
|
|
38
|
-
expect
|
|
39
|
+
expect do
|
|
39
40
|
expect(el).to have_all_of_selectors(".//a[@id='red']")
|
|
40
|
-
|
|
41
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
41
42
|
end
|
|
42
43
|
end
|
|
43
44
|
|
|
44
|
-
context
|
|
45
|
-
it
|
|
45
|
+
context 'with options' do
|
|
46
|
+
it 'should apply options to all locators' do
|
|
46
47
|
expect(@session).to have_all_of_selectors(:field, 'normal', 'additional_newline', type: :textarea)
|
|
47
|
-
expect
|
|
48
|
+
expect do
|
|
48
49
|
expect(@session).to have_all_of_selectors(:field, 'normal', 'test_field', 'additional_newline', type: :textarea)
|
|
49
|
-
|
|
50
|
+
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
|
50
51
|
end
|
|
51
52
|
end
|
|
52
53
|
|
|
53
|
-
context
|
|
54
|
-
it
|
|
54
|
+
context 'with wait', requires: [:js] do
|
|
55
|
+
it 'should not raise error if all the elements appear before given wait duration' do
|
|
55
56
|
Capybara.using_wait_time(0.1) do
|
|
56
57
|
@session.visit('/with_js')
|
|
57
58
|
@session.click_link('Click me')
|
|
58
|
-
expect(@session).to have_all_of_selectors(:css,
|
|
59
|
+
expect(@session).to have_all_of_selectors(:css, 'a#clickable', 'a#has-been-clicked', '#drag', wait: 5)
|
|
59
60
|
end
|
|
60
61
|
end
|
|
61
62
|
end
|
|
62
63
|
|
|
63
|
-
it
|
|
64
|
-
expect
|
|
65
|
-
expect(@session).not_to have_all_of_selectors(:css,
|
|
66
|
-
|
|
64
|
+
it 'cannot be negated' do
|
|
65
|
+
expect do
|
|
66
|
+
expect(@session).not_to have_all_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
|
|
67
|
+
end.to raise_error ArgumentError
|
|
67
68
|
end
|
|
68
69
|
end
|
|
69
|
-
|