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