capybara 3.32.2
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 +7 -0
- data/.yardopts +1 -0
- data/History.md +1813 -0
- data/License.txt +22 -0
- data/README.md +1099 -0
- data/lib/capybara.rb +511 -0
- data/lib/capybara/config.rb +94 -0
- data/lib/capybara/cucumber.rb +27 -0
- data/lib/capybara/driver/base.rb +170 -0
- data/lib/capybara/driver/node.rb +139 -0
- data/lib/capybara/dsl.rb +65 -0
- data/lib/capybara/helpers.rb +108 -0
- data/lib/capybara/minitest.rb +386 -0
- data/lib/capybara/minitest/spec.rb +264 -0
- data/lib/capybara/node/actions.rb +420 -0
- data/lib/capybara/node/base.rb +143 -0
- data/lib/capybara/node/document.rb +48 -0
- data/lib/capybara/node/document_matchers.rb +67 -0
- data/lib/capybara/node/element.rb +606 -0
- data/lib/capybara/node/finders.rb +325 -0
- data/lib/capybara/node/matchers.rb +883 -0
- data/lib/capybara/node/simple.rb +208 -0
- data/lib/capybara/queries/ancestor_query.rb +27 -0
- data/lib/capybara/queries/base_query.rb +106 -0
- data/lib/capybara/queries/current_path_query.rb +51 -0
- data/lib/capybara/queries/match_query.rb +26 -0
- data/lib/capybara/queries/selector_query.rb +710 -0
- data/lib/capybara/queries/sibling_query.rb +26 -0
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +110 -0
- data/lib/capybara/queries/title_query.rb +39 -0
- data/lib/capybara/rack_test/browser.rb +140 -0
- data/lib/capybara/rack_test/css_handlers.rb +13 -0
- data/lib/capybara/rack_test/driver.rb +109 -0
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +127 -0
- data/lib/capybara/rack_test/node.rb +325 -0
- data/lib/capybara/rails.rb +16 -0
- data/lib/capybara/registrations/drivers.rb +36 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
- data/lib/capybara/registrations/servers.rb +44 -0
- data/lib/capybara/result.rb +190 -0
- data/lib/capybara/rspec.rb +29 -0
- data/lib/capybara/rspec/features.rb +23 -0
- data/lib/capybara/rspec/matcher_proxies.rb +82 -0
- data/lib/capybara/rspec/matchers.rb +201 -0
- data/lib/capybara/rspec/matchers/base.rb +111 -0
- data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
- data/lib/capybara/rspec/matchers/compound.rb +88 -0
- data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
- data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
- data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
- data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
- data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/lib/capybara/rspec/matchers/have_text.rb +33 -0
- data/lib/capybara/rspec/matchers/have_title.rb +29 -0
- data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
- data/lib/capybara/rspec/matchers/match_style.rb +38 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/selector.rb +233 -0
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
- data/lib/capybara/selector/css.rb +102 -0
- data/lib/capybara/selector/definition.rb +276 -0
- data/lib/capybara/selector/definition/button.rb +51 -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 +27 -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 +46 -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/filter.rb +5 -0
- data/lib/capybara/selector/filter_set.rb +124 -0
- data/lib/capybara/selector/filters/base.rb +77 -0
- data/lib/capybara/selector/filters/expression_filter.rb +22 -0
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +31 -0
- data/lib/capybara/selector/regexp_disassembler.rb +214 -0
- data/lib/capybara/selector/selector.rb +147 -0
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- 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 +496 -0
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +110 -0
- data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +78 -0
- data/lib/capybara/selenium/logger_suppressor.rb +34 -0
- data/lib/capybara/selenium/node.rb +610 -0
- data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +131 -0
- data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
- data/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +47 -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.rb +126 -0
- data/lib/capybara/server/animation_disabler.rb +58 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +69 -0
- data/lib/capybara/session.rb +942 -0
- data/lib/capybara/session/config.rb +124 -0
- data/lib/capybara/session/matchers.rb +87 -0
- data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
- data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- data/lib/capybara/spec/fixtures/test_file.txt +1 -0
- data/lib/capybara/spec/public/jquery-ui.js +13 -0
- data/lib/capybara/spec/public/jquery.js +5 -0
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +268 -0
- data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
- data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
- data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
- data/lib/capybara/spec/session/all_spec.rb +278 -0
- data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
- 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_spec.rb +93 -0
- data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
- data/lib/capybara/spec/session/body_spec.rb +23 -0
- data/lib/capybara/spec/session/check_spec.rb +235 -0
- data/lib/capybara/spec/session/choose_spec.rb +121 -0
- data/lib/capybara/spec/session/click_button_spec.rb +506 -0
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
- data/lib/capybara/spec/session/click_link_spec.rb +229 -0
- data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
- data/lib/capybara/spec/session/current_url_spec.rb +115 -0
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
- data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
- data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
- data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
- data/lib/capybara/spec/session/find_button_spec.rb +74 -0
- data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
- data/lib/capybara/spec/session/find_field_spec.rb +113 -0
- data/lib/capybara/spec/session/find_link_spec.rb +70 -0
- data/lib/capybara/spec/session/find_spec.rb +531 -0
- data/lib/capybara/spec/session/first_spec.rb +156 -0
- 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 +116 -0
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
- data/lib/capybara/spec/session/go_back_spec.rb +12 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
- data/lib/capybara/spec/session/has_button_spec.rb +69 -0
- data/lib/capybara/spec/session/has_css_spec.rb +374 -0
- data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
- data/lib/capybara/spec/session/has_field_spec.rb +349 -0
- data/lib/capybara/spec/session/has_link_spec.rb +39 -0
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
- data/lib/capybara/spec/session/has_select_spec.rb +310 -0
- data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +198 -0
- data/lib/capybara/spec/session/has_text_spec.rb +394 -0
- data/lib/capybara/spec/session/has_title_spec.rb +71 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
- data/lib/capybara/spec/session/headers_spec.rb +8 -0
- data/lib/capybara/spec/session/html_spec.rb +47 -0
- data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +1292 -0
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +33 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
- data/lib/capybara/spec/session/response_code_spec.rb +8 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
- data/lib/capybara/spec/session/save_page_spec.rb +110 -0
- data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
- data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
- data/lib/capybara/spec/session/scroll_spec.rb +117 -0
- data/lib/capybara/spec/session/select_spec.rb +229 -0
- data/lib/capybara/spec/session/selectors_spec.rb +98 -0
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/session/text_spec.rb +74 -0
- data/lib/capybara/spec/session/title_spec.rb +29 -0
- data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
- data/lib/capybara/spec/session/unselect_spec.rb +116 -0
- data/lib/capybara/spec/session/visit_spec.rb +204 -0
- data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
- data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
- data/lib/capybara/spec/session/window/window_spec.rb +203 -0
- data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
- data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
- data/lib/capybara/spec/session/within_spec.rb +199 -0
- data/lib/capybara/spec/spec_helper.rb +134 -0
- data/lib/capybara/spec/test_app.rb +226 -0
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/buttons.erb +5 -0
- data/lib/capybara/spec/views/fieldsets.erb +30 -0
- data/lib/capybara/spec/views/form.erb +685 -0
- data/lib/capybara/spec/views/frame_child.erb +18 -0
- data/lib/capybara/spec/views/frame_one.erb +10 -0
- data/lib/capybara/spec/views/frame_parent.erb +9 -0
- data/lib/capybara/spec/views/frame_two.erb +9 -0
- data/lib/capybara/spec/views/header_links.erb +8 -0
- data/lib/capybara/spec/views/host_links.erb +13 -0
- data/lib/capybara/spec/views/initial_alert.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +32 -0
- data/lib/capybara/spec/views/path.erb +13 -0
- data/lib/capybara/spec/views/popup_one.erb +9 -0
- data/lib/capybara/spec/views/popup_two.erb +9 -0
- data/lib/capybara/spec/views/postback.erb +14 -0
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +20 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +130 -0
- data/lib/capybara/spec/views/with_animation.erb +74 -0
- data/lib/capybara/spec/views/with_base_tag.erb +11 -0
- data/lib/capybara/spec/views/with_count.erb +8 -0
- data/lib/capybara/spec/views/with_dragula.erb +22 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +24 -0
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +208 -0
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_html_entities.erb +2 -0
- data/lib/capybara/spec/views/with_js.erb +160 -0
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +20 -0
- data/lib/capybara/spec/views/with_scope.erb +42 -0
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_simple_html.erb +2 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_title.erb +5 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
- data/lib/capybara/spec/views/with_windows.erb +54 -0
- data/lib/capybara/spec/views/within_frames.erb +15 -0
- data/lib/capybara/version.rb +5 -0
- data/lib/capybara/window.rb +146 -0
- data/spec/basic_node_spec.rb +154 -0
- data/spec/capybara_spec.rb +112 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +276 -0
- data/spec/filter_set_spec.rb +46 -0
- data/spec/fixtures/capybara.csv +1 -0
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
- data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
- data/spec/minitest_spec.rb +163 -0
- data/spec/minitest_spec_spec.rb +162 -0
- data/spec/per_session_config_spec.rb +68 -0
- data/spec/rack_test_spec.rb +268 -0
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +196 -0
- data/spec/rspec/features_spec.rb +99 -0
- data/spec/rspec/scenarios_spec.rb +19 -0
- data/spec/rspec/shared_spec_matchers.rb +947 -0
- data/spec/rspec/views_spec.rb +14 -0
- data/spec/rspec_matchers_spec.rb +62 -0
- data/spec/rspec_spec.rb +145 -0
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +513 -0
- data/spec/selenium_spec_chrome.rb +188 -0
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +47 -0
- data/spec/selenium_spec_firefox.rb +208 -0
- data/spec/selenium_spec_firefox_remote.rb +80 -0
- data/spec/selenium_spec_ie.rb +150 -0
- data/spec/selenium_spec_safari.rb +148 -0
- data/spec/server_spec.rb +292 -0
- data/spec/session_spec.rb +91 -0
- data/spec/shared_selenium_node.rb +83 -0
- data/spec/shared_selenium_session.rb +476 -0
- data/spec/spec_helper.rb +100 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +753 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#body' do
|
|
4
|
+
it 'should return the unmodified page body' do
|
|
5
|
+
@session.visit('/')
|
|
6
|
+
expect(@session).to have_content('Hello world!') # wait for content to appear if visit is async
|
|
7
|
+
expect(@session.body).to include('Hello world!')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context 'encoding of response between ascii and utf8' do
|
|
11
|
+
it 'should be valid with html entities' do
|
|
12
|
+
@session.visit('/with_html_entities')
|
|
13
|
+
expect(@session).to have_content('Encoding') # wait for content to appear if visit is async
|
|
14
|
+
expect { @session.body.encode!('UTF-8') }.not_to raise_error
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it 'should be valid without html entities' do
|
|
18
|
+
@session.visit('/with_html')
|
|
19
|
+
expect(@session).to have_content('This is a test') # wait for content to appear if visit is async
|
|
20
|
+
expect { @session.body.encode!('UTF-8') }.not_to raise_error
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#check' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/form')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
describe "'checked' attribute" do
|
|
9
|
+
it 'should be true if checked' do
|
|
10
|
+
@session.check('Terms of Use')
|
|
11
|
+
expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_truthy
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'should be false if unchecked' do
|
|
15
|
+
expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_falsey
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'should trigger associated events', requires: [:js] do
|
|
20
|
+
@session.visit('/with_js')
|
|
21
|
+
@session.check('checkbox_with_event')
|
|
22
|
+
expect(@session).to have_css('#checkbox_event_triggered')
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe 'checking' do
|
|
26
|
+
it 'should not change an already checked checkbox' do
|
|
27
|
+
expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
|
|
28
|
+
@session.check('form_pets_dog')
|
|
29
|
+
expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'should check an unchecked checkbox' do
|
|
33
|
+
expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
|
|
34
|
+
@session.check('form_pets_cat')
|
|
35
|
+
expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).to be_checked
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe 'unchecking' do
|
|
40
|
+
it 'should not change an already unchecked checkbox' do
|
|
41
|
+
expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
|
|
42
|
+
@session.uncheck('form_pets_cat')
|
|
43
|
+
expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it 'should uncheck a checked checkbox' do
|
|
47
|
+
expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
|
|
48
|
+
@session.uncheck('form_pets_dog')
|
|
49
|
+
expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).not_to be_checked
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'should check a checkbox by id' do
|
|
54
|
+
@session.check('form_pets_cat')
|
|
55
|
+
@session.click_button('awesome')
|
|
56
|
+
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'should check a checkbox by label' do
|
|
60
|
+
@session.check('Cat')
|
|
61
|
+
@session.click_button('awesome')
|
|
62
|
+
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'should work without a locator string' do
|
|
66
|
+
@session.check(id: 'form_pets_cat')
|
|
67
|
+
@session.click_button('awesome')
|
|
68
|
+
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
|
69
|
+
end
|
|
70
|
+
|
|
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
|
|
79
|
+
@session.check(:form_pets_cat)
|
|
80
|
+
@session.click_button('awesome')
|
|
81
|
+
expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
context "with a locator that doesn't exist" do
|
|
85
|
+
it 'should raise an error' do
|
|
86
|
+
msg = /Unable to find checkbox "does not exist"/
|
|
87
|
+
expect do
|
|
88
|
+
@session.check('does not exist')
|
|
89
|
+
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
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'
|
|
96
|
+
expect do
|
|
97
|
+
@session.check('Disabled Checkbox')
|
|
98
|
+
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
context 'with :exact option' do
|
|
103
|
+
it 'should accept partial matches when false' do
|
|
104
|
+
@session.check('Ham', exact: false)
|
|
105
|
+
@session.click_button('awesome')
|
|
106
|
+
expect(extract_results(@session)['pets']).to include('hamster')
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it 'should not accept partial matches when true' do
|
|
110
|
+
expect do
|
|
111
|
+
@session.check('Ham', exact: true)
|
|
112
|
+
end.to raise_error(Capybara::ElementNotFound)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
context 'with `option` option' do
|
|
117
|
+
it 'can check boxes by their value' do
|
|
118
|
+
@session.check('form[pets][]', option: 'cat')
|
|
119
|
+
@session.click_button('awesome')
|
|
120
|
+
expect(extract_results(@session)['pets']).to include('cat')
|
|
121
|
+
end
|
|
122
|
+
|
|
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
|
|
130
|
+
expect do
|
|
131
|
+
@session.check('form[pets][]', option: 'elephant')
|
|
132
|
+
end.to raise_error(Capybara::ElementNotFound)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
context 'when checkbox hidden' do
|
|
137
|
+
context 'with Capybara.automatic_label_click == true' do
|
|
138
|
+
around do |spec|
|
|
139
|
+
old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
|
|
140
|
+
spec.run
|
|
141
|
+
Capybara.automatic_label_click = old_click_label
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it 'should check via clicking the label with :for attribute if possible' do
|
|
145
|
+
expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
|
|
146
|
+
@session.check('form_cars_tesla')
|
|
147
|
+
@session.click_button('awesome')
|
|
148
|
+
expect(extract_results(@session)['cars']).to include('tesla')
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it 'should check via clicking the wrapping label if possible' do
|
|
152
|
+
expect(@session.find(:checkbox, 'form_cars_mclaren', unchecked: true, visible: :hidden)).to be_truthy
|
|
153
|
+
@session.check('form_cars_mclaren')
|
|
154
|
+
@session.click_button('awesome')
|
|
155
|
+
expect(extract_results(@session)['cars']).to include('mclaren')
|
|
156
|
+
end
|
|
157
|
+
|
|
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
|
|
173
|
+
expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be_truthy
|
|
174
|
+
@session.check('form_cars_jaguar')
|
|
175
|
+
@session.click_button('awesome')
|
|
176
|
+
expect(extract_results(@session)['cars']).to include('jaguar')
|
|
177
|
+
end
|
|
178
|
+
|
|
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"/)
|
|
181
|
+
end
|
|
182
|
+
|
|
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"/)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
context 'with Capybara.automatic_label_click == false' do
|
|
189
|
+
around do |spec|
|
|
190
|
+
old_label_click, Capybara.automatic_label_click = Capybara.automatic_label_click, false
|
|
191
|
+
spec.run
|
|
192
|
+
Capybara.automatic_label_click = old_label_click
|
|
193
|
+
end
|
|
194
|
+
|
|
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"/)
|
|
197
|
+
end
|
|
198
|
+
|
|
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
|
|
205
|
+
expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
|
|
206
|
+
@session.check('form_cars_tesla', allow_label_click: true)
|
|
207
|
+
@session.click_button('awesome')
|
|
208
|
+
expect(extract_results(@session)['cars']).to include('tesla')
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it 'should not wait the full time if label can be clicked' do
|
|
212
|
+
expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
|
|
213
|
+
start_time = Time.now
|
|
214
|
+
@session.check('form_cars_tesla', allow_label_click: true, wait: 10)
|
|
215
|
+
end_time = Time.now
|
|
216
|
+
expect(end_time - start_time).to be < 10
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it 'should check via the label if input is moved off the left edge of the page' do
|
|
220
|
+
expect(@session.find(:checkbox, 'form_cars_pagani', unchecked: true, visible: :all)).to be_truthy
|
|
221
|
+
@session.check('form_cars_pagani', allow_label_click: true)
|
|
222
|
+
@session.click_button('awesome')
|
|
223
|
+
expect(extract_results(@session)['cars']).to include('pagani')
|
|
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
|
+
end
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#choose' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/form')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should choose a radio button by id' do
|
|
9
|
+
@session.choose('gender_male')
|
|
10
|
+
@session.click_button('awesome')
|
|
11
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'should choose a radio button by label' do
|
|
15
|
+
@session.choose('Both')
|
|
16
|
+
@session.click_button('awesome')
|
|
17
|
+
expect(extract_results(@session)['gender']).to eq('both')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it 'should work without a locator string' do
|
|
21
|
+
@session.choose(id: 'gender_male')
|
|
22
|
+
@session.click_button('awesome')
|
|
23
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'should be able to choose self when no locator string specified' do
|
|
27
|
+
rb = @session.find(:id, 'gender_male')
|
|
28
|
+
rb.choose
|
|
29
|
+
@session.click_button('awesome')
|
|
30
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'casts to string' do
|
|
34
|
+
@session.choose('Both')
|
|
35
|
+
@session.click_button(:awesome)
|
|
36
|
+
expect(extract_results(@session)['gender']).to eq('both')
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context "with a locator that doesn't exist" do
|
|
40
|
+
it 'should raise an error' do
|
|
41
|
+
msg = /Unable to find radio button "does not exist"/
|
|
42
|
+
expect do
|
|
43
|
+
@session.choose('does not exist')
|
|
44
|
+
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'with a disabled radio button' do
|
|
49
|
+
it 'should raise an error' do
|
|
50
|
+
expect do
|
|
51
|
+
@session.choose('Disabled Radio')
|
|
52
|
+
end.to raise_error(Capybara::ElementNotFound)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context 'with :exact option' do
|
|
57
|
+
it 'should accept partial matches when false' do
|
|
58
|
+
@session.choose('Mal', exact: false)
|
|
59
|
+
@session.click_button('awesome')
|
|
60
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should not accept partial matches when true' do
|
|
64
|
+
expect do
|
|
65
|
+
@session.choose('Mal', exact: true)
|
|
66
|
+
end.to raise_error(Capybara::ElementNotFound)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
context 'with `option` option' do
|
|
71
|
+
it 'can check radio buttons by their value' do
|
|
72
|
+
@session.choose('form[gender]', option: 'male')
|
|
73
|
+
@session.click_button('awesome')
|
|
74
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'should alias `:with` option' do
|
|
78
|
+
@session.choose('form[gender]', with: 'male')
|
|
79
|
+
@session.click_button('awesome')
|
|
80
|
+
expect(extract_results(@session)['gender']).to eq('male')
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'should raise an error if option not found' do
|
|
84
|
+
expect do
|
|
85
|
+
@session.choose('form[gender]', option: 'hermaphrodite')
|
|
86
|
+
end.to raise_error(Capybara::ElementNotFound)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
context 'with hidden radio buttons' do
|
|
91
|
+
context 'with Capybara.automatic_label_click == true' do
|
|
92
|
+
around do |spec|
|
|
93
|
+
old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
|
|
94
|
+
spec.run
|
|
95
|
+
Capybara.automatic_label_click = old_click_label
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it 'should select by clicking the label if available' do
|
|
99
|
+
@session.choose('party_democrat')
|
|
100
|
+
@session.click_button('awesome')
|
|
101
|
+
expect(extract_results(@session)['party']).to eq('democrat')
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it 'should select self by clicking the label if no locator specified' do
|
|
105
|
+
cb = @session.find(:id, 'party_democrat', visible: :hidden)
|
|
106
|
+
cb.choose
|
|
107
|
+
@session.click_button('awesome')
|
|
108
|
+
expect(extract_results(@session)['party']).to eq('democrat')
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it 'should raise error if not allowed to click label' do
|
|
112
|
+
expect { @session.choose('party_democrat', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, /Unable to find visible radio button "party_democrat"/)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it 'should return the chosen radio button' do
|
|
118
|
+
el = @session.find(:radio_button, 'gender_male')
|
|
119
|
+
expect(@session.choose('gender_male')).to eq el
|
|
120
|
+
end
|
|
121
|
+
end
|
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Capybara::SpecHelper.spec '#click_button' do
|
|
4
|
+
before do
|
|
5
|
+
@session.visit('/form')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
it 'should wait for asynchronous load', requires: [:js] do
|
|
9
|
+
@session.visit('/with_js')
|
|
10
|
+
@session.using_wait_time(1.5) do
|
|
11
|
+
@session.click_link('Click me')
|
|
12
|
+
@session.click_button('New Here')
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'casts to string' do
|
|
17
|
+
@session.click_button(:'Relative Action')
|
|
18
|
+
expect(extract_results(@session)['relative']).to eq('Relative Action')
|
|
19
|
+
expect(@session.current_path).to eq('/relative')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context 'with multiple values with the same name' do
|
|
23
|
+
it 'should use the latest given value' do
|
|
24
|
+
@session.check('Terms of Use')
|
|
25
|
+
@session.click_button('awesome')
|
|
26
|
+
expect(extract_results(@session)['terms_of_use']).to eq('1')
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context 'with a form that has a relative url as an action' do
|
|
31
|
+
it 'should post to the correct url' do
|
|
32
|
+
@session.click_button('Relative Action')
|
|
33
|
+
expect(extract_results(@session)['relative']).to eq('Relative Action')
|
|
34
|
+
expect(@session.current_path).to eq('/relative')
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context 'with a form that has no action specified' do
|
|
39
|
+
it 'should post to the correct url' do
|
|
40
|
+
@session.click_button('No Action')
|
|
41
|
+
expect(extract_results(@session)['no_action']).to eq('No Action')
|
|
42
|
+
expect(@session.current_path).to eq('/form')
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context 'with value given on a submit button' do
|
|
47
|
+
context 'on a form with HTML5 fields' do
|
|
48
|
+
let(:results) { extract_results(@session) }
|
|
49
|
+
|
|
50
|
+
before do
|
|
51
|
+
@session.click_button('html5_submit')
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'should serialise and submit search fields' do
|
|
55
|
+
expect(results['html5_search']).to eq('what are you looking for')
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it 'should serialise and submit email fields' do
|
|
59
|
+
expect(results['html5_email']).to eq('person@email.com')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'should serialise and submit url fields' do
|
|
63
|
+
expect(results['html5_url']).to eq('http://www.example.com')
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it 'should serialise and submit tel fields' do
|
|
67
|
+
expect(results['html5_tel']).to eq('911')
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it 'should serialise and submit color fields' do
|
|
71
|
+
expect(results['html5_color'].upcase).to eq('#FFFFFF')
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context 'on an HTML4 form' do
|
|
76
|
+
let(:results) { extract_results(@session) }
|
|
77
|
+
|
|
78
|
+
before do
|
|
79
|
+
@session.click_button('awesome')
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it 'should serialize and submit text fields' do
|
|
83
|
+
expect(results['first_name']).to eq('John')
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it 'should escape fields when submitting' do
|
|
87
|
+
expect(results['phone']).to eq('+1 555 7021')
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it 'should serialize and submit password fields' do
|
|
91
|
+
expect(results['password']).to eq('seeekrit')
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it 'should serialize and submit hidden fields' do
|
|
95
|
+
expect(results['token']).to eq('12345')
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it 'should not serialize fields from other forms' do
|
|
99
|
+
expect(results['middle_name']).to be_nil
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it 'should submit the button that was clicked, but not other buttons' do
|
|
103
|
+
expect(results['awesome']).to eq('awesome')
|
|
104
|
+
expect(results['crappy']).to be_nil
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
it 'should serialize radio buttons' do
|
|
108
|
+
expect(results['gender']).to eq('female')
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
it "should default radio value to 'on' if none specified" do
|
|
112
|
+
expect(results['valueless_radio']).to eq('on')
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'should serialize check boxes' do
|
|
116
|
+
expect(results['pets']).to include('dog', 'hamster')
|
|
117
|
+
expect(results['pets']).not_to include('cat')
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it "should default checkbox value to 'on' if none specififed" do
|
|
121
|
+
expect(results['valueless_checkbox']).to eq('on')
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it 'should serialize text areas' do
|
|
125
|
+
expect(results['description']).to eq('Descriptive text goes here')
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it 'should serialize select tag with values' do
|
|
129
|
+
expect(results['locale']).to eq('en')
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
it 'should serialize select tag without values' do
|
|
133
|
+
expect(results['region']).to eq('Norway')
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it 'should serialize first option for select tag with no selection' do
|
|
137
|
+
expect(results['city']).to eq('London')
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it 'should not serialize a select tag without options' do
|
|
141
|
+
expect(results['tendency']).to be_nil
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it 'should convert lf to cr/lf in submitted textareas' do
|
|
145
|
+
expect(results['newline']).to eq("\r\nNew line after and before textarea tag\r\n")
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it 'should not submit disabled fields' do
|
|
149
|
+
expect(results['disabled_text_field']).to be_nil
|
|
150
|
+
expect(results['disabled_textarea']).to be_nil
|
|
151
|
+
expect(results['disabled_checkbox']).to be_nil
|
|
152
|
+
expect(results['disabled_radio']).to be_nil
|
|
153
|
+
expect(results['disabled_select']).to be_nil
|
|
154
|
+
expect(results['disabled_file']).to be_nil
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
context 'input type=submit button' do
|
|
160
|
+
it 'should submit by button id' do
|
|
161
|
+
@session.click_button('awe123')
|
|
162
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
it 'should submit by specific button id' do
|
|
166
|
+
@session.click_button(id: 'awe123')
|
|
167
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
it 'should submit by button title' do
|
|
171
|
+
@session.click_button('What an Awesome Button')
|
|
172
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it 'should submit by partial title', :exact_false do
|
|
176
|
+
@session.click_button('What an Awesome')
|
|
177
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
it 'should submit by button name' do
|
|
181
|
+
@session.click_button('form[awesome]')
|
|
182
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
it 'should submit by specific button name' do
|
|
186
|
+
@session.click_button(name: 'form[awesome]')
|
|
187
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
it 'should submit by specific button name regex' do
|
|
191
|
+
@session.click_button(name: /form\[awes.*\]/)
|
|
192
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
context 'with fields associated with the form using the form attribute', requires: [:form_attribute] do
|
|
197
|
+
let(:results) { extract_results(@session) }
|
|
198
|
+
|
|
199
|
+
before do
|
|
200
|
+
@session.click_button('submit_form1')
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it 'should serialize and submit text fields' do
|
|
204
|
+
expect(results['outside_input']).to eq('outside_input')
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it 'should serialize text areas' do
|
|
208
|
+
expect(results['outside_textarea']).to eq('Some text here')
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
it 'should serialize select tags' do
|
|
212
|
+
expect(results['outside_select']).to eq('Ruby')
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
it 'should not serliaze fields associated with a different form' do
|
|
216
|
+
expect(results['for_form2']).to be_nil
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
context 'with submit button outside the form defined by <button> tag', requires: [:form_attribute] do
|
|
221
|
+
let(:results) { extract_results(@session) }
|
|
222
|
+
|
|
223
|
+
before do
|
|
224
|
+
@session.click_button('outside_button')
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
it 'should submit the associated form' do
|
|
228
|
+
expect(results['which_form']).to eq('form2')
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
it 'should submit the button that was clicked, but not other buttons' do
|
|
232
|
+
expect(results['outside_button']).to eq('outside_button')
|
|
233
|
+
expect(results['unused']).to be_nil
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
context "with submit button outside the form defined by <input type='submit'> tag", requires: [:form_attribute] do
|
|
238
|
+
let(:results) { extract_results(@session) }
|
|
239
|
+
|
|
240
|
+
before do
|
|
241
|
+
@session.click_button('outside_submit')
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
it 'should submit the associated form' do
|
|
245
|
+
expect(results['which_form']).to eq('form1')
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
it 'should submit the button that was clicked, but not other buttons' do
|
|
249
|
+
expect(results['outside_submit']).to eq('outside_submit')
|
|
250
|
+
expect(results['submit_form1']).to be_nil
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
context 'with submit button for form1 located within form2', requires: [:form_attribute] do
|
|
255
|
+
it 'should submit the form associated with the button' do
|
|
256
|
+
@session.click_button('other_form_button')
|
|
257
|
+
expect(extract_results(@session)['which_form']).to eq('form1')
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
context 'with submit button not associated with any form' do
|
|
262
|
+
it 'should not error when clicked' do
|
|
263
|
+
expect { @session.click_button('no_form_button') }.not_to raise_error
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
context 'with alt given on an image button' do
|
|
268
|
+
it 'should submit the associated form' do
|
|
269
|
+
@session.click_button('oh hai thar')
|
|
270
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
it 'should work with partial matches', :exact_false do
|
|
274
|
+
@session.click_button('hai')
|
|
275
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
context 'with value given on an image button' do
|
|
280
|
+
it 'should submit the associated form' do
|
|
281
|
+
@session.click_button('okay')
|
|
282
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
it 'should work with partial matches', :exact_false do
|
|
286
|
+
@session.click_button('kay')
|
|
287
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
context 'with id given on an image button' do
|
|
292
|
+
it 'should submit the associated form' do
|
|
293
|
+
@session.click_button('okay556')
|
|
294
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
context 'with title given on an image button' do
|
|
299
|
+
it 'should submit the associated form' do
|
|
300
|
+
@session.click_button('Okay 556 Image')
|
|
301
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
it 'should work with partial matches', :exact_false do
|
|
305
|
+
@session.click_button('Okay 556')
|
|
306
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
context 'with text given on a button defined by <button> tag' do
|
|
311
|
+
it 'should submit the associated form' do
|
|
312
|
+
@session.click_button('Click me!')
|
|
313
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
it 'should work with partial matches', :exact_false do
|
|
317
|
+
@session.click_button('Click')
|
|
318
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
context 'with id given on a button defined by <button> tag' do
|
|
323
|
+
it 'should submit the associated form' do
|
|
324
|
+
@session.click_button('click_me_123')
|
|
325
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
it 'should serialize and send GET forms' do
|
|
329
|
+
@session.visit('/form')
|
|
330
|
+
@session.click_button('med')
|
|
331
|
+
results = extract_results(@session)
|
|
332
|
+
expect(results['middle_name']).to eq('Darren')
|
|
333
|
+
expect(results['foo']).to be_nil
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
context 'with name given on a button defined by <button> tag' do
|
|
338
|
+
it 'should submit the associated form when name is locator' do
|
|
339
|
+
@session.click_button('form[no_value]')
|
|
340
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
it 'should submit the associated form when name is specific' do
|
|
344
|
+
@session.click_button(name: 'form[no_value]')
|
|
345
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
context 'with value given on a button defined by <button> tag' do
|
|
350
|
+
it 'should submit the associated form' do
|
|
351
|
+
@session.click_button('click_me')
|
|
352
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
353
|
+
end
|
|
354
|
+
|
|
355
|
+
it 'should work with partial matches', :exact_false do
|
|
356
|
+
@session.click_button('ck_me')
|
|
357
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
358
|
+
end
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
context 'with title given on a button defined by <button> tag' do
|
|
362
|
+
it 'should submit the associated form' do
|
|
363
|
+
@session.click_button('Click Title button')
|
|
364
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
it 'should work with partial matches', :exact_false do
|
|
368
|
+
@session.click_button('Click Title')
|
|
369
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
context 'with descendant image alt given on a button defined by <button> tag' do
|
|
374
|
+
it 'should submit the associated form' do
|
|
375
|
+
@session.click_button('A horse eating hay')
|
|
376
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
it 'should work with partial matches', :exact_false do
|
|
380
|
+
@session.click_button('se eating h')
|
|
381
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
382
|
+
end
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
context "with a locator that doesn't exist" do
|
|
386
|
+
it 'should raise an error' do
|
|
387
|
+
msg = /Unable to find button "does not exist"/
|
|
388
|
+
expect do
|
|
389
|
+
@session.click_button('does not exist')
|
|
390
|
+
end.to raise_error(Capybara::ElementNotFound, msg)
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
context 'with formaction attribute on button' do
|
|
395
|
+
it 'should submit to the formaction attribute' do
|
|
396
|
+
@session.click_button('Formaction button')
|
|
397
|
+
results = extract_results(@session)
|
|
398
|
+
expect(@session.current_path).to eq '/form'
|
|
399
|
+
expect(results['which_form']).to eq 'formaction form'
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
context 'with formmethod attribute on button' do
|
|
404
|
+
it 'should submit to the formethod attribute' do
|
|
405
|
+
@session.click_button('Formmethod button')
|
|
406
|
+
results = extract_results(@session)
|
|
407
|
+
expect(@session.current_path).to eq '/form/get'
|
|
408
|
+
expect(results['which_form']).to eq 'formaction form'
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
it 'should serialize and send valueless buttons that were clicked' do
|
|
413
|
+
@session.click_button('No Value!')
|
|
414
|
+
results = extract_results(@session)
|
|
415
|
+
expect(results['no_value']).not_to be_nil
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
it 'should send button in document order' do
|
|
419
|
+
@session.click_button('outside_button')
|
|
420
|
+
results = extract_results(@session)
|
|
421
|
+
expect(results.keys).to eq %w[for_form2 outside_button which_form post_count]
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
it 'should not send image buttons that were not clicked' do
|
|
425
|
+
@session.click_button('Click me!')
|
|
426
|
+
results = extract_results(@session)
|
|
427
|
+
expect(results['okay']).to be_nil
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
it 'should serialize and send GET forms' do
|
|
431
|
+
@session.visit('/form')
|
|
432
|
+
@session.click_button('med')
|
|
433
|
+
results = extract_results(@session)
|
|
434
|
+
expect(results['middle_name']).to eq('Darren')
|
|
435
|
+
expect(results['foo']).to be_nil
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
it 'should follow redirects' do
|
|
439
|
+
@session.click_button('Go FAR')
|
|
440
|
+
expect(@session).to have_content('You landed')
|
|
441
|
+
expect(@session.current_url).to match(%r{/landed$})
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
it 'should follow temporary redirects that maintain method' do
|
|
445
|
+
@session.click_button('Go 307')
|
|
446
|
+
expect(@session).to have_content('You post landed: TWTW')
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
it 'should follow permanent redirects that maintain method' do
|
|
450
|
+
@session.click_button('Go 308')
|
|
451
|
+
expect(@session).to have_content('You post landed: TWTW')
|
|
452
|
+
end
|
|
453
|
+
|
|
454
|
+
it 'should post pack to the same URL when no action given' do
|
|
455
|
+
@session.visit('/postback')
|
|
456
|
+
@session.click_button('With no action')
|
|
457
|
+
expect(@session).to have_content('Postback')
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
it 'should post pack to the same URL when blank action given' do
|
|
461
|
+
@session.visit('/postback')
|
|
462
|
+
@session.click_button('With blank action')
|
|
463
|
+
expect(@session).to have_content('Postback')
|
|
464
|
+
end
|
|
465
|
+
|
|
466
|
+
it 'ignores disabled buttons' do
|
|
467
|
+
expect do
|
|
468
|
+
@session.click_button('Disabled button')
|
|
469
|
+
end.to raise_error(Capybara::ElementNotFound)
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
it 'should encode complex field names, like array[][value]' do
|
|
473
|
+
@session.visit('/form')
|
|
474
|
+
@session.fill_in('address1_city', with: 'Paris')
|
|
475
|
+
@session.fill_in('address1_street', with: 'CDG')
|
|
476
|
+
|
|
477
|
+
@session.fill_in('address2_city', with: 'Mikolaiv')
|
|
478
|
+
@session.fill_in('address2_street', with: 'PGS')
|
|
479
|
+
|
|
480
|
+
@session.click_button 'awesome'
|
|
481
|
+
|
|
482
|
+
addresses = extract_results(@session)['addresses']
|
|
483
|
+
expect(addresses.size).to eq(2)
|
|
484
|
+
|
|
485
|
+
expect(addresses[0]['street']).to eq('CDG')
|
|
486
|
+
expect(addresses[0]['city']).to eq('Paris')
|
|
487
|
+
expect(addresses[0]['country']).to eq('France')
|
|
488
|
+
|
|
489
|
+
expect(addresses[1]['street']).to eq('PGS')
|
|
490
|
+
expect(addresses[1]['city']).to eq('Mikolaiv')
|
|
491
|
+
expect(addresses[1]['country']).to eq('Ukraine')
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
context 'with :exact option' do
|
|
495
|
+
it 'should accept partial matches when false' do
|
|
496
|
+
@session.click_button('What an Awesome', exact: false)
|
|
497
|
+
expect(extract_results(@session)['first_name']).to eq('John')
|
|
498
|
+
end
|
|
499
|
+
|
|
500
|
+
it 'should not accept partial matches when true' do
|
|
501
|
+
expect do
|
|
502
|
+
@session.click_button('What an Awesome', exact: true)
|
|
503
|
+
end.to raise_error(Capybara::ElementNotFound)
|
|
504
|
+
end
|
|
505
|
+
end
|
|
506
|
+
end
|