capybara 3.3.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 -0
- data/History.md +803 -13
- data/License.txt +1 -1
- data/README.md +257 -84
- data/lib/capybara/config.rb +25 -9
- data/lib/capybara/cucumber.rb +1 -1
- data/lib/capybara/driver/base.rb +17 -3
- data/lib/capybara/driver/node.rb +31 -6
- data/lib/capybara/dsl.rb +9 -7
- data/lib/capybara/helpers.rb +31 -7
- data/lib/capybara/minitest/spec.rb +180 -88
- data/lib/capybara/minitest.rb +262 -149
- data/lib/capybara/node/actions.rb +202 -116
- data/lib/capybara/node/base.rb +34 -19
- data/lib/capybara/node/document.rb +14 -2
- data/lib/capybara/node/document_matchers.rb +10 -12
- data/lib/capybara/node/element.rb +269 -115
- data/lib/capybara/node/finders.rb +99 -77
- data/lib/capybara/node/matchers.rb +327 -151
- data/lib/capybara/node/simple.rb +48 -13
- 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 +8 -9
- data/lib/capybara/queries/base_query.rb +23 -16
- data/lib/capybara/queries/current_path_query.rb +16 -6
- data/lib/capybara/queries/match_query.rb +1 -0
- data/lib/capybara/queries/selector_query.rb +587 -130
- data/lib/capybara/queries/sibling_query.rb +8 -6
- data/lib/capybara/queries/style_query.rb +6 -2
- data/lib/capybara/queries/text_query.rb +28 -14
- data/lib/capybara/queries/title_query.rb +2 -2
- data/lib/capybara/rack_test/browser.rb +92 -25
- 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 +68 -41
- data/lib/capybara/rack_test/node.rb +106 -39
- 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 +75 -52
- data/lib/capybara/rspec/features.rb +7 -7
- 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 +141 -339
- data/lib/capybara/rspec.rb +2 -0
- 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 +27 -25
- 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 +73 -25
- data/lib/capybara/selector/filters/base.rb +24 -5
- data/lib/capybara/selector/filters/expression_filter.rb +3 -3
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +16 -2
- data/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/lib/capybara/selector/selector.rb +85 -348
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +474 -447
- 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 +255 -143
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +93 -11
- 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 +436 -134
- 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 +56 -19
- data/lib/capybara/server/checker.rb +9 -3
- data/lib/capybara/server/middleware.rb +28 -12
- data/lib/capybara/server.rb +33 -10
- data/lib/capybara/session/config.rb +34 -10
- data/lib/capybara/session/matchers.rb +23 -16
- data/lib/capybara/session.rb +230 -170
- 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 +121 -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 +127 -40
- 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_spec.rb +21 -18
- data/lib/capybara/spec/session/assert_selector_spec.rb +52 -58
- data/lib/capybara/spec/session/assert_style_spec.rb +7 -7
- data/lib/capybara/spec/session/assert_text_spec.rb +74 -50
- data/lib/capybara/spec/session/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 +6 -6
- data/lib/capybara/spec/session/check_spec.rb +102 -47
- data/lib/capybara/spec/session/choose_spec.rb +58 -32
- data/lib/capybara/spec/session/click_button_spec.rb +219 -163
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -23
- data/lib/capybara/spec/session/click_link_spec.rb +77 -54
- data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
- data/lib/capybara/spec/session/current_url_spec.rb +38 -29
- 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_spec.rb +8 -8
- data/lib/capybara/spec/session/element/match_css_spec.rb +16 -10
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +68 -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 +101 -46
- data/lib/capybara/spec/session/find_button_spec.rb +23 -23
- data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
- data/lib/capybara/spec/session/find_field_spec.rb +32 -30
- data/lib/capybara/spec/session/find_link_spec.rb +31 -21
- data/lib/capybara/spec/session/find_spec.rb +244 -141
- data/lib/capybara/spec/session/first_spec.rb +43 -43
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +30 -18
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +45 -18
- 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 +94 -13
- data/lib/capybara/spec/session/has_css_spec.rb +272 -132
- 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 +44 -4
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +31 -31
- data/lib/capybara/spec/session/has_select_spec.rb +84 -50
- data/lib/capybara/spec/session/has_selector_spec.rb +111 -71
- 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_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 +894 -142
- data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
- data/lib/capybara/spec/session/refresh_spec.rb +9 -7
- data/lib/capybara/spec/session/reset_session_spec.rb +63 -35
- data/lib/capybara/spec/session/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 +2 -2
- data/lib/capybara/spec/session/save_page_spec.rb +37 -37
- data/lib/capybara/spec/session/save_screenshot_spec.rb +10 -10
- 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 +85 -85
- data/lib/capybara/spec/session/selectors_spec.rb +49 -18
- data/lib/capybara/spec/session/sibling_spec.rb +9 -9
- data/lib/capybara/spec/session/text_spec.rb +25 -24
- data/lib/capybara/spec/session/title_spec.rb +7 -6
- data/lib/capybara/spec/session/uncheck_spec.rb +33 -21
- data/lib/capybara/spec/session/unselect_spec.rb +37 -37
- data/lib/capybara/spec/session/visit_spec.rb +68 -49
- data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +20 -16
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +6 -2
- data/lib/capybara/spec/session/window/window_spec.rb +62 -63
- data/lib/capybara/spec/session/window/windows_spec.rb +5 -1
- data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
- data/lib/capybara/spec/session/within_spec.rb +79 -42
- data/lib/capybara/spec/spec_helper.rb +41 -53
- data/lib/capybara/spec/test_app.rb +132 -43
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +139 -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 +67 -0
- data/lib/capybara/spec/views/with_animation.erb +39 -4
- 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 +37 -9
- 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 +26 -5
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +1 -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 +19 -25
- data/lib/capybara.rb +126 -111
- data/spec/basic_node_spec.rb +59 -34
- data/spec/capybara_spec.rb +56 -44
- data/spec/counter_spec.rb +35 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +8 -8
- data/spec/dsl_spec.rb +79 -52
- data/spec/filter_set_spec.rb +9 -9
- 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 +45 -7
- data/spec/minitest_spec_spec.rb +87 -64
- data/spec/per_session_config_spec.rb +6 -6
- data/spec/rack_test_spec.rb +172 -116
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +80 -72
- data/spec/rspec/features_spec.rb +21 -16
- data/spec/rspec/scenarios_spec.rb +10 -6
- data/spec/rspec/shared_spec_matchers.rb +407 -365
- data/spec/rspec/views_spec.rb +3 -3
- data/spec/rspec_matchers_spec.rb +35 -10
- data/spec/rspec_spec.rb +63 -41
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +334 -89
- data/spec/selenium_spec_chrome.rb +176 -62
- data/spec/selenium_spec_chrome_remote.rb +54 -14
- 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 +171 -97
- data/spec/session_spec.rb +34 -18
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +344 -80
- data/spec/spec_helper.rb +124 -2
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +326 -28
- data/lib/capybara/rspec/compound.rb +0 -94
- data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +0 -31
- data/lib/capybara/selenium/nodes/marionette_node.rb +0 -31
- data/lib/capybara/spec/session/has_style_spec.rb +0 -25
- 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 -167
|
@@ -1,182 +1,214 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
Capybara::SpecHelper.spec
|
|
3
|
+
Capybara::SpecHelper.spec '#check' do
|
|
4
4
|
before do
|
|
5
5
|
@session.visit('/form')
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
describe "'checked' attribute" do
|
|
9
|
-
it
|
|
10
|
-
@session.check(
|
|
9
|
+
it 'should be true if checked' do
|
|
10
|
+
@session.check('Terms of Use')
|
|
11
11
|
expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_truthy
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
it
|
|
14
|
+
it 'should be false if unchecked' do
|
|
15
15
|
expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_falsey
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
it
|
|
19
|
+
it 'should trigger associated events', requires: [:js] do
|
|
20
20
|
@session.visit('/with_js')
|
|
21
21
|
@session.check('checkbox_with_event')
|
|
22
22
|
expect(@session).to have_css('#checkbox_event_triggered')
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
describe
|
|
26
|
-
it
|
|
25
|
+
describe 'checking' do
|
|
26
|
+
it 'should not change an already checked checkbox' do
|
|
27
27
|
expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
|
|
28
28
|
@session.check('form_pets_dog')
|
|
29
29
|
expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
it
|
|
32
|
+
it 'should check an unchecked checkbox' do
|
|
33
33
|
expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
|
|
34
34
|
@session.check('form_pets_cat')
|
|
35
35
|
expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).to be_checked
|
|
36
36
|
end
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
-
describe
|
|
40
|
-
it
|
|
39
|
+
describe 'unchecking' do
|
|
40
|
+
it 'should not change an already unchecked checkbox' do
|
|
41
41
|
expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
|
|
42
42
|
@session.uncheck('form_pets_cat')
|
|
43
43
|
expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
it
|
|
46
|
+
it 'should uncheck a checked checkbox' do
|
|
47
47
|
expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
|
|
48
48
|
@session.uncheck('form_pets_dog')
|
|
49
49
|
expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).not_to be_checked
|
|
50
50
|
end
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
it
|
|
54
|
-
@session.check(
|
|
53
|
+
it 'should check a checkbox by id' do
|
|
54
|
+
@session.check('form_pets_cat')
|
|
55
55
|
@session.click_button('awesome')
|
|
56
56
|
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
|
57
57
|
end
|
|
58
58
|
|
|
59
|
-
it
|
|
60
|
-
@session.check(
|
|
59
|
+
it 'should check a checkbox by label' do
|
|
60
|
+
@session.check('Cat')
|
|
61
61
|
@session.click_button('awesome')
|
|
62
62
|
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
it
|
|
66
|
-
@session.check(id:
|
|
65
|
+
it 'should work without a locator string' do
|
|
66
|
+
@session.check(id: 'form_pets_cat')
|
|
67
67
|
@session.click_button('awesome')
|
|
68
68
|
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
|
69
69
|
end
|
|
70
70
|
|
|
71
|
-
it
|
|
71
|
+
it 'should be able to check itself if no locator specified' do
|
|
72
|
+
cb = @session.find(:id, 'form_pets_cat')
|
|
73
|
+
cb.check
|
|
74
|
+
@session.click_button('awesome')
|
|
75
|
+
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it 'casts to string' do
|
|
72
79
|
@session.check(:form_pets_cat)
|
|
73
80
|
@session.click_button('awesome')
|
|
74
81
|
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
|
75
82
|
end
|
|
76
83
|
|
|
77
84
|
context "with a locator that doesn't exist" do
|
|
78
|
-
it
|
|
79
|
-
msg =
|
|
85
|
+
it 'should raise an error' do
|
|
86
|
+
msg = /Unable to find checkbox "does not exist"/
|
|
80
87
|
expect do
|
|
81
88
|
@session.check('does not exist')
|
|
82
89
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
83
90
|
end
|
|
84
91
|
end
|
|
85
92
|
|
|
86
|
-
context
|
|
87
|
-
it
|
|
93
|
+
context 'with a disabled checkbox' do
|
|
94
|
+
it 'should raise an error' do
|
|
95
|
+
msg = 'Unable to find visible checkbox "Disabled Checkbox" that is not disabled'
|
|
88
96
|
expect do
|
|
89
97
|
@session.check('Disabled Checkbox')
|
|
90
|
-
end.to raise_error(Capybara::ElementNotFound)
|
|
98
|
+
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
91
99
|
end
|
|
92
100
|
end
|
|
93
101
|
|
|
94
|
-
context
|
|
95
|
-
it
|
|
102
|
+
context 'with :exact option' do
|
|
103
|
+
it 'should accept partial matches when false' do
|
|
96
104
|
@session.check('Ham', exact: false)
|
|
97
105
|
@session.click_button('awesome')
|
|
98
106
|
expect(extract_results(@session)['pets']).to include('hamster')
|
|
99
107
|
end
|
|
100
108
|
|
|
101
|
-
it
|
|
109
|
+
it 'should not accept partial matches when true' do
|
|
102
110
|
expect do
|
|
103
111
|
@session.check('Ham', exact: true)
|
|
104
112
|
end.to raise_error(Capybara::ElementNotFound)
|
|
105
113
|
end
|
|
106
114
|
end
|
|
107
115
|
|
|
108
|
-
context
|
|
109
|
-
it
|
|
110
|
-
@session.check('form[pets][]', option:
|
|
116
|
+
context 'with `option` option' do
|
|
117
|
+
it 'can check boxes by their value' do
|
|
118
|
+
@session.check('form[pets][]', option: 'cat')
|
|
111
119
|
@session.click_button('awesome')
|
|
112
120
|
expect(extract_results(@session)['pets']).to include('cat')
|
|
113
121
|
end
|
|
114
122
|
|
|
115
|
-
it
|
|
123
|
+
it 'should alias `with`' do
|
|
124
|
+
@session.check('form[pets][]', with: 'cat')
|
|
125
|
+
@session.click_button('awesome')
|
|
126
|
+
expect(extract_results(@session)['pets']).to include('cat')
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it 'should raise an error if option not found' do
|
|
116
130
|
expect do
|
|
117
|
-
@session.check('form[pets][]', option:
|
|
131
|
+
@session.check('form[pets][]', option: 'elephant')
|
|
118
132
|
end.to raise_error(Capybara::ElementNotFound)
|
|
119
133
|
end
|
|
120
134
|
end
|
|
121
135
|
|
|
122
|
-
context
|
|
123
|
-
context
|
|
136
|
+
context 'when checkbox hidden' do
|
|
137
|
+
context 'with Capybara.automatic_label_click == true' do
|
|
124
138
|
around do |spec|
|
|
125
139
|
old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
|
|
126
140
|
spec.run
|
|
127
141
|
Capybara.automatic_label_click = old_click_label
|
|
128
142
|
end
|
|
129
143
|
|
|
130
|
-
it
|
|
144
|
+
it 'should check via clicking the label with :for attribute if possible' do
|
|
131
145
|
expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
|
|
132
146
|
@session.check('form_cars_tesla')
|
|
133
147
|
@session.click_button('awesome')
|
|
134
148
|
expect(extract_results(@session)['cars']).to include('tesla')
|
|
135
149
|
end
|
|
136
150
|
|
|
137
|
-
it
|
|
151
|
+
it 'should check via clicking the wrapping label if possible' do
|
|
138
152
|
expect(@session.find(:checkbox, 'form_cars_mclaren', unchecked: true, visible: :hidden)).to be_truthy
|
|
139
153
|
@session.check('form_cars_mclaren')
|
|
140
154
|
@session.click_button('awesome')
|
|
141
155
|
expect(extract_results(@session)['cars']).to include('mclaren')
|
|
142
156
|
end
|
|
143
157
|
|
|
144
|
-
it
|
|
158
|
+
it 'should check via clicking the label with :for attribute if locator nil' do
|
|
159
|
+
cb = @session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)
|
|
160
|
+
cb.check
|
|
161
|
+
@session.click_button('awesome')
|
|
162
|
+
expect(extract_results(@session)['cars']).to include('tesla')
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it 'should check self via clicking the wrapping label if locator nil' do
|
|
166
|
+
cb = @session.find(:checkbox, 'form_cars_mclaren', unchecked: true, visible: :hidden)
|
|
167
|
+
cb.check
|
|
168
|
+
@session.click_button('awesome')
|
|
169
|
+
expect(extract_results(@session)['cars']).to include('mclaren')
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
it 'should not click the label if unneeded' do
|
|
145
173
|
expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be_truthy
|
|
146
174
|
@session.check('form_cars_jaguar')
|
|
147
175
|
@session.click_button('awesome')
|
|
148
176
|
expect(extract_results(@session)['cars']).to include('jaguar')
|
|
149
177
|
end
|
|
150
178
|
|
|
151
|
-
it
|
|
152
|
-
expect { @session.check('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound,
|
|
179
|
+
it 'should raise original error when no label available' do
|
|
180
|
+
expect { @session.check('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_ariel"/)
|
|
153
181
|
end
|
|
154
182
|
|
|
155
|
-
it
|
|
156
|
-
expect { @session.check('form_cars_mclaren', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound,
|
|
183
|
+
it 'should raise error if not allowed to click label' do
|
|
184
|
+
expect { @session.check('form_cars_mclaren', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_mclaren"/)
|
|
157
185
|
end
|
|
158
186
|
end
|
|
159
187
|
|
|
160
|
-
context
|
|
188
|
+
context 'with Capybara.automatic_label_click == false' do
|
|
161
189
|
around do |spec|
|
|
162
190
|
old_label_click, Capybara.automatic_label_click = Capybara.automatic_label_click, false
|
|
163
191
|
spec.run
|
|
164
192
|
Capybara.automatic_label_click = old_label_click
|
|
165
193
|
end
|
|
166
194
|
|
|
167
|
-
it
|
|
168
|
-
expect { @session.check('form_cars_mclaren') }.to raise_error(Capybara::ElementNotFound,
|
|
195
|
+
it 'should raise error if checkbox not visible' do
|
|
196
|
+
expect { @session.check('form_cars_mclaren') }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_mclaren"/)
|
|
169
197
|
end
|
|
170
198
|
|
|
171
|
-
|
|
172
|
-
|
|
199
|
+
it 'should include node filter in error if verified' do
|
|
200
|
+
expect { @session.check('form_cars_maserati') }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_maserati" that is not disabled')
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
context 'with allow_label_click == true' do
|
|
204
|
+
it 'should check via the label if input is hidden' do
|
|
173
205
|
expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
|
|
174
206
|
@session.check('form_cars_tesla', allow_label_click: true)
|
|
175
207
|
@session.click_button('awesome')
|
|
176
208
|
expect(extract_results(@session)['cars']).to include('tesla')
|
|
177
209
|
end
|
|
178
210
|
|
|
179
|
-
it
|
|
211
|
+
it 'should not wait the full time if label can be clicked' do
|
|
180
212
|
expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
|
|
181
213
|
start_time = Time.now
|
|
182
214
|
@session.check('form_cars_tesla', allow_label_click: true, wait: 10)
|
|
@@ -184,12 +216,35 @@ Capybara::SpecHelper.spec "#check" do
|
|
|
184
216
|
expect(end_time - start_time).to be < 10
|
|
185
217
|
end
|
|
186
218
|
|
|
187
|
-
it
|
|
219
|
+
it 'should check via the label if input is moved off the left edge of the page' do
|
|
188
220
|
expect(@session.find(:checkbox, 'form_cars_pagani', unchecked: true, visible: :all)).to be_truthy
|
|
189
221
|
@session.check('form_cars_pagani', allow_label_click: true)
|
|
190
222
|
@session.click_button('awesome')
|
|
191
223
|
expect(extract_results(@session)['cars']).to include('pagani')
|
|
192
224
|
end
|
|
225
|
+
|
|
226
|
+
it 'should check via the label if input is visible but blocked by another element' do
|
|
227
|
+
expect(@session.find(:checkbox, 'form_cars_bugatti', unchecked: true, visible: :all)).to be_truthy
|
|
228
|
+
@session.check('form_cars_bugatti', allow_label_click: true)
|
|
229
|
+
@session.click_button('awesome')
|
|
230
|
+
expect(extract_results(@session)['cars']).to include('bugatti')
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
it 'should check via label if multiple labels' do
|
|
234
|
+
expect(@session).to have_field('multi_label_checkbox', checked: false, visible: :hidden)
|
|
235
|
+
@session.check('Label to click', allow_label_click: true)
|
|
236
|
+
expect(@session).to have_field('multi_label_checkbox', checked: true, visible: :hidden)
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
context 'with allow_label_click options', requires: [:js] do
|
|
241
|
+
it 'should allow offsets to click location on label' do
|
|
242
|
+
Capybara.w3c_click_offset = false
|
|
243
|
+
expect(@session.find(:checkbox, 'form_cars_lotus', unchecked: true, visible: :hidden)).to be_truthy
|
|
244
|
+
@session.check('form_cars_lotus', allow_label_click: { x: 90, y: 10 })
|
|
245
|
+
@session.click_button('awesome')
|
|
246
|
+
expect(extract_results(@session)['cars']).to include('lotus')
|
|
247
|
+
end
|
|
193
248
|
end
|
|
194
249
|
end
|
|
195
250
|
end
|
|
@@ -1,101 +1,127 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
Capybara::SpecHelper.spec
|
|
3
|
+
Capybara::SpecHelper.spec '#choose' do
|
|
4
4
|
before do
|
|
5
5
|
@session.visit('/form')
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
it
|
|
9
|
-
@session.choose(
|
|
8
|
+
it 'should choose a radio button by id' do
|
|
9
|
+
@session.choose('gender_male')
|
|
10
10
|
@session.click_button('awesome')
|
|
11
11
|
expect(extract_results(@session)['gender']).to eq('male')
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
it
|
|
15
|
-
@session.choose(
|
|
14
|
+
it 'ignores readonly attribute on radio buttons' do
|
|
15
|
+
@session.choose('gender_both')
|
|
16
16
|
@session.click_button('awesome')
|
|
17
17
|
expect(extract_results(@session)['gender']).to eq('both')
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
it
|
|
21
|
-
@session.choose(
|
|
20
|
+
it 'should choose a radio button by label' do
|
|
21
|
+
@session.choose('Both')
|
|
22
|
+
@session.click_button('awesome')
|
|
23
|
+
expect(extract_results(@session)['gender']).to eq('both')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'should work without a locator string' do
|
|
27
|
+
@session.choose(id: 'gender_male')
|
|
22
28
|
@session.click_button('awesome')
|
|
23
29
|
expect(extract_results(@session)['gender']).to eq('male')
|
|
24
30
|
end
|
|
25
31
|
|
|
26
|
-
it
|
|
27
|
-
@session.
|
|
32
|
+
it 'should be able to choose self when no locator string specified' do
|
|
33
|
+
rb = @session.find(:id, 'gender_male')
|
|
34
|
+
rb.choose
|
|
35
|
+
@session.click_button('awesome')
|
|
36
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it 'casts to string' do
|
|
40
|
+
@session.choose('Both')
|
|
28
41
|
@session.click_button(:awesome)
|
|
29
42
|
expect(extract_results(@session)['gender']).to eq('both')
|
|
30
43
|
end
|
|
31
44
|
|
|
32
45
|
context "with a locator that doesn't exist" do
|
|
33
|
-
it
|
|
34
|
-
msg =
|
|
46
|
+
it 'should raise an error' do
|
|
47
|
+
msg = /Unable to find radio button "does not exist"/
|
|
35
48
|
expect do
|
|
36
49
|
@session.choose('does not exist')
|
|
37
50
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
38
51
|
end
|
|
39
52
|
end
|
|
40
53
|
|
|
41
|
-
context
|
|
42
|
-
it
|
|
54
|
+
context 'with a disabled radio button' do
|
|
55
|
+
it 'should raise an error' do
|
|
43
56
|
expect do
|
|
44
57
|
@session.choose('Disabled Radio')
|
|
45
58
|
end.to raise_error(Capybara::ElementNotFound)
|
|
46
59
|
end
|
|
47
60
|
end
|
|
48
61
|
|
|
49
|
-
context
|
|
50
|
-
it
|
|
51
|
-
@session.choose(
|
|
62
|
+
context 'with :exact option' do
|
|
63
|
+
it 'should accept partial matches when false' do
|
|
64
|
+
@session.choose('Mal', exact: false)
|
|
52
65
|
@session.click_button('awesome')
|
|
53
66
|
expect(extract_results(@session)['gender']).to eq('male')
|
|
54
67
|
end
|
|
55
68
|
|
|
56
|
-
it
|
|
69
|
+
it 'should not accept partial matches when true' do
|
|
57
70
|
expect do
|
|
58
|
-
@session.choose(
|
|
71
|
+
@session.choose('Mal', exact: true)
|
|
59
72
|
end.to raise_error(Capybara::ElementNotFound)
|
|
60
73
|
end
|
|
61
74
|
end
|
|
62
75
|
|
|
63
|
-
context
|
|
64
|
-
it
|
|
65
|
-
@session.choose('form[gender]', option:
|
|
76
|
+
context 'with `option` option' do
|
|
77
|
+
it 'can check radio buttons by their value' do
|
|
78
|
+
@session.choose('form[gender]', option: 'male')
|
|
66
79
|
@session.click_button('awesome')
|
|
67
|
-
expect(extract_results(@session)['gender']).to eq(
|
|
80
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
|
68
81
|
end
|
|
69
82
|
|
|
70
|
-
it
|
|
83
|
+
it 'should alias `:with` option' do
|
|
84
|
+
@session.choose('form[gender]', with: 'male')
|
|
85
|
+
@session.click_button('awesome')
|
|
86
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'should raise an error if option not found' do
|
|
71
90
|
expect do
|
|
72
|
-
@session.choose('form[gender]', option:
|
|
91
|
+
@session.choose('form[gender]', option: 'hermaphrodite')
|
|
73
92
|
end.to raise_error(Capybara::ElementNotFound)
|
|
74
93
|
end
|
|
75
94
|
end
|
|
76
95
|
|
|
77
|
-
context
|
|
78
|
-
context
|
|
96
|
+
context 'with hidden radio buttons' do
|
|
97
|
+
context 'with Capybara.automatic_label_click == true' do
|
|
79
98
|
around do |spec|
|
|
80
99
|
old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
|
|
81
100
|
spec.run
|
|
82
101
|
Capybara.automatic_label_click = old_click_label
|
|
83
102
|
end
|
|
84
103
|
|
|
85
|
-
it
|
|
86
|
-
@session.choose(
|
|
104
|
+
it 'should select by clicking the label if available' do
|
|
105
|
+
@session.choose('party_democrat')
|
|
106
|
+
@session.click_button('awesome')
|
|
107
|
+
expect(extract_results(@session)['party']).to eq('democrat')
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it 'should select self by clicking the label if no locator specified' do
|
|
111
|
+
cb = @session.find(:id, 'party_democrat', visible: :hidden)
|
|
112
|
+
cb.choose
|
|
87
113
|
@session.click_button('awesome')
|
|
88
114
|
expect(extract_results(@session)['party']).to eq('democrat')
|
|
89
115
|
end
|
|
90
116
|
|
|
91
|
-
it
|
|
92
|
-
expect { @session.choose(
|
|
117
|
+
it 'should raise error if not allowed to click label' do
|
|
118
|
+
expect { @session.choose('party_democrat', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, /Unable to find visible radio button "party_democrat"/)
|
|
93
119
|
end
|
|
94
120
|
end
|
|
95
121
|
end
|
|
96
122
|
|
|
97
|
-
it
|
|
123
|
+
it 'should return the chosen radio button' do
|
|
98
124
|
el = @session.find(:radio_button, 'gender_male')
|
|
99
|
-
expect(@session.choose(
|
|
125
|
+
expect(@session.choose('gender_male')).to eq el
|
|
100
126
|
end
|
|
101
127
|
end
|