capybara 2.7.0 → 3.35.3
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 +5 -5
- data/.yardopts +1 -0
- data/History.md +1147 -11
- data/License.txt +1 -1
- data/README.md +252 -131
- data/lib/capybara/config.rb +92 -0
- data/lib/capybara/cucumber.rb +3 -3
- data/lib/capybara/driver/base.rb +52 -21
- data/lib/capybara/driver/node.rb +48 -14
- data/lib/capybara/dsl.rb +16 -9
- data/lib/capybara/helpers.rb +72 -81
- data/lib/capybara/minitest/spec.rb +267 -0
- data/lib/capybara/minitest.rb +385 -0
- data/lib/capybara/node/actions.rb +337 -89
- data/lib/capybara/node/base.rb +50 -32
- data/lib/capybara/node/document.rb +19 -3
- data/lib/capybara/node/document_matchers.rb +22 -24
- data/lib/capybara/node/element.rb +388 -125
- data/lib/capybara/node/finders.rb +231 -121
- data/lib/capybara/node/matchers.rb +503 -217
- data/lib/capybara/node/simple.rb +64 -27
- data/lib/capybara/queries/ancestor_query.rb +27 -0
- data/lib/capybara/queries/base_query.rb +87 -11
- data/lib/capybara/queries/current_path_query.rb +24 -24
- data/lib/capybara/queries/match_query.rb +15 -10
- data/lib/capybara/queries/selector_query.rb +675 -81
- 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 +88 -20
- data/lib/capybara/queries/title_query.rb +9 -11
- data/lib/capybara/rack_test/browser.rb +63 -39
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +26 -16
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +73 -58
- data/lib/capybara/rack_test/node.rb +187 -67
- data/lib/capybara/rails.rb +4 -8
- data/lib/capybara/registration_container.rb +44 -0
- data/lib/capybara/registrations/drivers.rb +42 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
- data/lib/capybara/registrations/servers.rb +45 -0
- data/lib/capybara/result.rb +142 -14
- data/lib/capybara/rspec/features.rb +17 -42
- data/lib/capybara/rspec/matcher_proxies.rb +82 -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 +43 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/rspec/matchers.rb +143 -244
- data/lib/capybara/rspec.rb +10 -12
- 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 +102 -0
- data/lib/capybara/selector/definition/button.rb +63 -0
- data/lib/capybara/selector/definition/checkbox.rb +26 -0
- data/lib/capybara/selector/definition/css.rb +10 -0
- data/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/lib/capybara/selector/definition/element.rb +28 -0
- data/lib/capybara/selector/definition/field.rb +40 -0
- data/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/lib/capybara/selector/definition/file_field.rb +13 -0
- data/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/lib/capybara/selector/definition/frame.rb +17 -0
- data/lib/capybara/selector/definition/id.rb +6 -0
- data/lib/capybara/selector/definition/label.rb +62 -0
- data/lib/capybara/selector/definition/link.rb +54 -0
- data/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/lib/capybara/selector/definition/option.rb +27 -0
- data/lib/capybara/selector/definition/radio_button.rb +27 -0
- data/lib/capybara/selector/definition/select.rb +81 -0
- data/lib/capybara/selector/definition/table.rb +109 -0
- data/lib/capybara/selector/definition/table_row.rb +21 -0
- data/lib/capybara/selector/definition/xpath.rb +5 -0
- data/lib/capybara/selector/definition.rb +278 -0
- data/lib/capybara/selector/filter.rb +3 -46
- 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 +155 -0
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +232 -369
- 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 +380 -142
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +110 -0
- data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +76 -0
- data/lib/capybara/selenium/logger_suppressor.rb +40 -0
- data/lib/capybara/selenium/node.rb +528 -97
- data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
- data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
- data/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +45 -0
- data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
- data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/lib/capybara/server/animation_disabler.rb +63 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +71 -0
- data/lib/capybara/server.rb +74 -71
- data/lib/capybara/session/config.rb +126 -0
- data/lib/capybara/session/matchers.rb +44 -27
- data/lib/capybara/session.rb +500 -297
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- 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 +168 -14
- data/lib/capybara/spec/session/accept_alert_spec.rb +37 -14
- data/lib/capybara/spec/session/accept_confirm_spec.rb +7 -6
- data/lib/capybara/spec/session/accept_prompt_spec.rb +38 -10
- data/lib/capybara/spec/session/all_spec.rb +179 -59
- 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 +154 -48
- data/lib/capybara/spec/session/body_spec.rb +12 -13
- data/lib/capybara/spec/session/check_spec.rb +168 -41
- data/lib/capybara/spec/session/choose_spec.rb +75 -23
- data/lib/capybara/spec/session/click_button_spec.rb +243 -175
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +57 -32
- data/lib/capybara/spec/session/click_link_spec.rb +100 -53
- data/lib/capybara/spec/session/current_scope_spec.rb +11 -10
- data/lib/capybara/spec/session/current_url_spec.rb +61 -35
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +7 -7
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +5 -4
- data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +13 -6
- data/lib/capybara/spec/session/element/match_css_spec.rb +21 -7
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +91 -34
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +45 -3
- data/lib/capybara/spec/session/execute_script_spec.rb +24 -4
- data/lib/capybara/spec/session/fill_in_spec.rb +166 -64
- data/lib/capybara/spec/session/find_button_spec.rb +37 -18
- data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
- data/lib/capybara/spec/session/find_field_spec.rb +57 -34
- data/lib/capybara/spec/session/find_link_spec.rb +47 -10
- data/lib/capybara/spec/session/find_spec.rb +290 -144
- data/lib/capybara/spec/session/first_spec.rb +91 -48
- 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 +3 -2
- data/lib/capybara/spec/session/go_forward_spec.rb +3 -2
- 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 +76 -19
- data/lib/capybara/spec/session/has_css_spec.rb +277 -131
- data/lib/capybara/spec/session/has_current_path_spec.rb +98 -26
- data/lib/capybara/spec/session/has_field_spec.rb +177 -107
- data/lib/capybara/spec/session/has_link_spec.rb +13 -12
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
- data/lib/capybara/spec/session/has_select_spec.rb +191 -95
- data/lib/capybara/spec/session/has_selector_spec.rb +128 -64
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +172 -5
- data/lib/capybara/spec/session/has_text_spec.rb +126 -60
- data/lib/capybara/spec/session/has_title_spec.rb +35 -12
- data/lib/capybara/spec/session/has_xpath_spec.rb +74 -53
- data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
- data/lib/capybara/spec/session/html_spec.rb +14 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
- data/lib/capybara/spec/session/node_spec.rb +1028 -131
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +34 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +75 -34
- data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +11 -15
- data/lib/capybara/spec/session/save_page_spec.rb +42 -55
- data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +117 -0
- data/lib/capybara/spec/session/select_spec.rb +112 -85
- data/lib/capybara/spec/session/selectors_spec.rb +71 -8
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/text_spec.rb +38 -23
- data/lib/capybara/spec/session/title_spec.rb +17 -5
- data/lib/capybara/spec/session/uncheck_spec.rb +71 -12
- data/lib/capybara/spec/session/unselect_spec.rb +44 -43
- data/lib/capybara/spec/session/visit_spec.rb +99 -32
- data/lib/capybara/spec/session/window/become_closed_spec.rb +33 -29
- data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +39 -30
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +17 -10
- data/lib/capybara/spec/session/window/window_spec.rb +121 -73
- data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
- data/lib/capybara/spec/session/window/within_window_spec.rb +52 -82
- data/lib/capybara/spec/session/within_spec.rb +76 -43
- data/lib/capybara/spec/spec_helper.rb +67 -33
- data/lib/capybara/spec/test_app.rb +85 -36
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/buttons.erb +1 -1
- data/lib/capybara/spec/views/fieldsets.erb +1 -1
- data/lib/capybara/spec/views/form.erb +227 -20
- data/lib/capybara/spec/views/frame_child.erb +10 -2
- data/lib/capybara/spec/views/frame_one.erb +2 -1
- data/lib/capybara/spec/views/frame_parent.erb +2 -2
- data/lib/capybara/spec/views/frame_two.erb +1 -1
- data/lib/capybara/spec/views/header_links.erb +1 -1
- data/lib/capybara/spec/views/host_links.erb +1 -1
- 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 +1 -1
- 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/postback.erb +1 -1
- 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 +69 -2
- data/lib/capybara/spec/views/with_animation.erb +82 -0
- data/lib/capybara/spec/views/with_base_tag.erb +1 -1
- data/lib/capybara/spec/views/with_count.erb +1 -1
- data/lib/capybara/spec/views/with_dragula.erb +24 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +7 -1
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +100 -10
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_html_entities.erb +1 -1
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +49 -3
- 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 +1 -1
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_simple_html.erb +1 -1
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_title.erb +1 -1
- data/lib/capybara/spec/views/with_unload_alert.erb +3 -1
- data/lib/capybara/spec/views/with_windows.erb +7 -1
- data/lib/capybara/spec/views/within_frames.erb +6 -3
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +39 -21
- data/lib/capybara.rb +208 -186
- data/spec/basic_node_spec.rb +52 -39
- data/spec/capybara_spec.rb +72 -50
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +81 -61
- 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 +7 -3
- data/spec/fixtures/selenium_driver_rspec_success.rb +7 -3
- data/spec/minitest_spec.rb +164 -0
- data/spec/minitest_spec_spec.rb +162 -0
- data/spec/per_session_config_spec.rb +68 -0
- data/spec/rack_test_spec.rb +189 -96
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +143 -13
- data/spec/rspec/features_spec.rb +38 -32
- data/spec/rspec/scenarios_spec.rb +9 -7
- data/spec/rspec/shared_spec_matchers.rb +959 -0
- data/spec/rspec/views_spec.rb +9 -3
- data/spec/rspec_matchers_spec.rb +62 -0
- data/spec/rspec_spec.rb +127 -30
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +458 -37
- data/spec/selenium_spec_chrome.rb +196 -9
- data/spec/selenium_spec_chrome_remote.rb +100 -0
- data/spec/selenium_spec_edge.rb +47 -0
- data/spec/selenium_spec_firefox.rb +210 -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 +200 -101
- data/spec/session_spec.rb +91 -0
- data/spec/shared_selenium_node.rb +83 -0
- data/spec/shared_selenium_session.rb +558 -0
- data/spec/spec_helper.rb +94 -2
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +420 -60
- data/lib/capybara/query.rb +0 -7
- data/lib/capybara/spec/session/assert_current_path.rb +0 -60
- data/lib/capybara/spec/session/assert_selector.rb +0 -148
- data/lib/capybara/spec/session/assert_text.rb +0 -196
- data/lib/capybara/spec/session/assert_title.rb +0 -70
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/session/within_frame_spec.rb +0 -53
- data/spec/rspec/matchers_spec.rb +0 -827
- data/spec/selenium_spec.rb +0 -151
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require 'capybara/minitest'
|
|
5
|
+
|
|
6
|
+
class MinitestTest < Minitest::Test
|
|
7
|
+
include Capybara::DSL
|
|
8
|
+
include Capybara::Minitest::Assertions
|
|
9
|
+
|
|
10
|
+
def setup
|
|
11
|
+
visit('/form')
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def teardown
|
|
15
|
+
Capybara.reset_sessions!
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_assert_text
|
|
19
|
+
assert_text('Form', normalize_ws: false)
|
|
20
|
+
assert_no_text('Not on the page')
|
|
21
|
+
refute_text('Also Not on the page')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_assert_title
|
|
25
|
+
visit('/with_title')
|
|
26
|
+
assert_title('Test Title')
|
|
27
|
+
assert_no_title('Not the title')
|
|
28
|
+
refute_title('Not the title')
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def test_assert_current_path
|
|
32
|
+
assert_current_path('/form')
|
|
33
|
+
assert_current_path('/form') { |url| url.query.nil? }
|
|
34
|
+
assert_no_current_path('/not_form')
|
|
35
|
+
refute_current_path('/not_form')
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_assert_xpath
|
|
39
|
+
assert_xpath('.//select[@id="form_title"]')
|
|
40
|
+
assert_xpath('.//select', count: 1) { |el| el[:id] == 'form_title' }
|
|
41
|
+
assert_no_xpath('.//select[@id="not_form_title"]')
|
|
42
|
+
assert_no_xpath('.//select') { |el| el[:id] == 'not_form_title' }
|
|
43
|
+
refute_xpath('.//select[@id="not_form_title"]')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def test_assert_css
|
|
47
|
+
assert_css('select#form_title')
|
|
48
|
+
assert_no_css('select#not_form_title')
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def test_assert_selector
|
|
52
|
+
assert_selector(:css, 'select#form_title')
|
|
53
|
+
assert_selector(:xpath, './/select[@id="form_title"]')
|
|
54
|
+
assert_no_selector(:css, 'select#not_form_title')
|
|
55
|
+
assert_no_selector(:xpath, './/select[@id="not_form_title"]')
|
|
56
|
+
refute_selector(:css, 'select#not_form_title')
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def test_assert_link
|
|
60
|
+
visit('/with_html')
|
|
61
|
+
assert_link('A link')
|
|
62
|
+
assert_link(count: 1) { |el| el.text == 'A link' }
|
|
63
|
+
assert_no_link('Not on page')
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def test_assert_button
|
|
67
|
+
assert_button('fresh_btn')
|
|
68
|
+
assert_button(count: 1) { |el| el[:id] == 'fresh_btn' }
|
|
69
|
+
assert_no_button('not_btn')
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def test_assert_field
|
|
73
|
+
assert_field('customer_email')
|
|
74
|
+
assert_no_field('not_on_the_form')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_assert_select
|
|
78
|
+
assert_select('form_title')
|
|
79
|
+
assert_no_select('not_form_title')
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_assert_checked_field
|
|
83
|
+
assert_checked_field('form_pets_dog')
|
|
84
|
+
assert_no_checked_field('form_pets_cat')
|
|
85
|
+
refute_checked_field('form_pets_snake')
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def test_assert_unchecked_field
|
|
89
|
+
assert_unchecked_field('form_pets_cat')
|
|
90
|
+
assert_no_unchecked_field('form_pets_dog')
|
|
91
|
+
refute_unchecked_field('form_pets_snake')
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def test_assert_table
|
|
95
|
+
visit('/tables')
|
|
96
|
+
assert_table('agent_table')
|
|
97
|
+
assert_no_table('not_on_form')
|
|
98
|
+
refute_table('not_on_form')
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def test_assert_all_of_selectors
|
|
102
|
+
assert_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def test_assert_none_of_selectors
|
|
106
|
+
assert_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def test_assert_any_of_selectors
|
|
110
|
+
assert_any_of_selectors(:css, 'input#not_on_page', 'select#form_other_title')
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def test_assert_matches_selector
|
|
114
|
+
assert_matches_selector(find(:field, 'customer_email'), :field, 'customer_email')
|
|
115
|
+
assert_not_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
|
|
116
|
+
refute_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def test_assert_matches_css
|
|
120
|
+
assert_matches_css(find(:select, 'form_title'), 'select#form_title')
|
|
121
|
+
refute_matches_css(find(:select, 'form_title'), 'select#form_other_title')
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test_assert_matches_xpath
|
|
125
|
+
assert_matches_xpath(find(:select, 'form_title'), './/select[@id="form_title"]')
|
|
126
|
+
refute_matches_xpath(find(:select, 'form_title'), './/select[@id="form_other_title"]')
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_assert_matches_style
|
|
130
|
+
skip "Rack test doesn't support style" if Capybara.current_driver == :rack_test
|
|
131
|
+
visit('/with_html')
|
|
132
|
+
assert_matches_style(find(:css, '#second'), display: 'inline')
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def test_assert_ancestor
|
|
136
|
+
option = find(:option, 'Finnish')
|
|
137
|
+
assert_ancestor(option, :css, '#form_locale')
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def test_assert_sibling
|
|
141
|
+
option = find(:css, '#form_title').find(:option, 'Mrs')
|
|
142
|
+
assert_sibling(option, :option, 'Mr')
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
RSpec.describe 'capybara/minitest' do
|
|
147
|
+
before do
|
|
148
|
+
Capybara.current_driver = :rack_test
|
|
149
|
+
Capybara.app = TestApp
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
after do
|
|
153
|
+
Capybara.use_default_driver
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
it 'should support minitest' do
|
|
157
|
+
output = StringIO.new
|
|
158
|
+
reporter = Minitest::SummaryReporter.new(output)
|
|
159
|
+
reporter.start
|
|
160
|
+
MinitestTest.run reporter, {}
|
|
161
|
+
reporter.report
|
|
162
|
+
expect(output.string).to include('22 runs, 53 assertions, 0 failures, 0 errors, 1 skips')
|
|
163
|
+
end
|
|
164
|
+
end
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require 'capybara/minitest'
|
|
5
|
+
require 'capybara/minitest/spec'
|
|
6
|
+
|
|
7
|
+
class MinitestSpecTest < Minitest::Spec
|
|
8
|
+
include ::Capybara::DSL
|
|
9
|
+
include ::Capybara::Minitest::Assertions
|
|
10
|
+
|
|
11
|
+
before do
|
|
12
|
+
visit('/form')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
after do
|
|
16
|
+
Capybara.reset_sessions!
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'supports text expectations' do
|
|
20
|
+
_(page).must_have_text('Form', minimum: 1)
|
|
21
|
+
_(page).wont_have_text('Not a form')
|
|
22
|
+
form = find(:css, 'form', text: 'Title')
|
|
23
|
+
_(form).must_have_text('Customer Email')
|
|
24
|
+
_(form).wont_have_text('Some other email')
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it 'supports current_path expectations' do
|
|
28
|
+
_(page).must_have_current_path('/form')
|
|
29
|
+
_(page).wont_have_current_path('/form2')
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'supports title expectations' do
|
|
33
|
+
visit('/with_title')
|
|
34
|
+
_(page).must_have_title('Test Title')
|
|
35
|
+
_(page).wont_have_title('Not the title')
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it 'supports xpath expectations' do
|
|
39
|
+
_(page).must_have_xpath('.//input[@id="customer_email"]')
|
|
40
|
+
_(page).wont_have_xpath('.//select[@id="not_form_title"]')
|
|
41
|
+
_(page).wont_have_xpath('.//input[@id="customer_email"]') { |el| el[:id] == 'not_customer_email' }
|
|
42
|
+
select = find(:select, 'form_title')
|
|
43
|
+
_(select).must_have_xpath('.//option[@class="title"]')
|
|
44
|
+
_(select).must_have_xpath('.//option', count: 1) { |option| option[:class] != 'title' && !option.disabled? }
|
|
45
|
+
_(select).wont_have_xpath('.//input[@id="customer_email"]')
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'support css expectations' do
|
|
49
|
+
_(page).must_have_css('input#customer_email')
|
|
50
|
+
_(page).wont_have_css('select#not_form_title')
|
|
51
|
+
el = find(:select, 'form_title')
|
|
52
|
+
_(el).must_have_css('option.title')
|
|
53
|
+
_(el).wont_have_css('input#customer_email')
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'supports link expectations' do
|
|
57
|
+
visit('/with_html')
|
|
58
|
+
_(page).must_have_link('A link')
|
|
59
|
+
_(page).wont_have_link('Not on page')
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it 'supports button expectations' do
|
|
63
|
+
_(page).must_have_button('fresh_btn')
|
|
64
|
+
_(page).wont_have_button('not_btn')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it 'supports field expectations' do
|
|
68
|
+
_(page).must_have_field('customer_email')
|
|
69
|
+
_(page).wont_have_field('not_on_the_form')
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'supports select expectations' do
|
|
73
|
+
_(page).must_have_select('form_title')
|
|
74
|
+
_(page).wont_have_select('not_form_title')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'supports checked_field expectations' do
|
|
78
|
+
_(page).must_have_checked_field('form_pets_dog')
|
|
79
|
+
_(page).wont_have_checked_field('form_pets_cat')
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it 'supports unchecked_field expectations' do
|
|
83
|
+
_(page).must_have_unchecked_field('form_pets_cat')
|
|
84
|
+
_(page).wont_have_unchecked_field('form_pets_dog')
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'supports table expectations' do
|
|
88
|
+
visit('/tables')
|
|
89
|
+
_(page).must_have_table('agent_table')
|
|
90
|
+
_(page).wont_have_table('not_on_form')
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it 'supports all_of_selectors expectations' do
|
|
94
|
+
_(page).must_have_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it 'supports none_of_selectors expectations' do
|
|
98
|
+
_(page).must_have_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it 'supports any_of_selectors expectations' do
|
|
102
|
+
_(page).must_have_any_of_selectors(:css, 'select#form_other_title', 'input#not_on_page')
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it 'supports match_selector expectations' do
|
|
106
|
+
_(find(:field, 'customer_email')).must_match_selector(:field, 'customer_email')
|
|
107
|
+
_(find(:select, 'form_title')).wont_match_selector(:field, 'customer_email')
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it 'supports match_css expectations' do
|
|
111
|
+
_(find(:select, 'form_title')).must_match_css('select#form_title')
|
|
112
|
+
_(find(:select, 'form_title')).wont_match_css('select#form_other_title')
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'supports match_xpath expectations' do
|
|
116
|
+
_(find(:select, 'form_title')).must_match_xpath('.//select[@id="form_title"]')
|
|
117
|
+
_(find(:select, 'form_title')).wont_match_xpath('.//select[@id="not_on_page"]')
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it 'handles failures' do
|
|
121
|
+
_(page).must_have_select('non_existing_form_title')
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
it 'supports style expectations' do
|
|
125
|
+
skip "Rack test doesn't support style" if Capybara.current_driver == :rack_test
|
|
126
|
+
visit('/with_html')
|
|
127
|
+
_(find(:css, '#second')).must_have_style('display' => 'inline') # deprecated
|
|
128
|
+
_(find(:css, '#second')).must_match_style('display' => 'inline')
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it 'supports ancestor expectations' do
|
|
132
|
+
option = find(:option, 'Finnish')
|
|
133
|
+
_(option).must_have_ancestor(:css, '#form_locale')
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
it 'supports sibling expectations' do
|
|
137
|
+
option = find(:css, '#form_title').find(:option, 'Mrs')
|
|
138
|
+
_(option).must_have_sibling(:option, 'Mr')
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
RSpec.describe 'capybara/minitest/spec' do
|
|
143
|
+
before do
|
|
144
|
+
Capybara.current_driver = :rack_test
|
|
145
|
+
Capybara.app = TestApp
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
after do
|
|
149
|
+
Capybara.use_default_driver
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it 'should support minitest spec' do
|
|
153
|
+
output = StringIO.new
|
|
154
|
+
reporter = Minitest::SummaryReporter.new(output)
|
|
155
|
+
reporter.start
|
|
156
|
+
MinitestSpecTest.run reporter, {}
|
|
157
|
+
reporter.report
|
|
158
|
+
expect(output.string).to include('22 runs, 44 assertions, 1 failures, 0 errors, 1 skips')
|
|
159
|
+
# Make sure error messages are displayed
|
|
160
|
+
expect(output.string).to match(/expected to find select box "non_existing_form_title" .*but there were no matches/)
|
|
161
|
+
end
|
|
162
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require 'capybara/dsl'
|
|
5
|
+
|
|
6
|
+
RSpec.describe Capybara::SessionConfig do
|
|
7
|
+
describe 'threadsafe' do
|
|
8
|
+
it 'defaults to global session options' do
|
|
9
|
+
Capybara.threadsafe = true
|
|
10
|
+
session = Capybara::Session.new(:rack_test, TestApp)
|
|
11
|
+
%i[default_host app_host always_include_port run_server
|
|
12
|
+
default_selector default_max_wait_time ignore_hidden_elements
|
|
13
|
+
automatic_reload match exact raise_server_errors visible_text_only
|
|
14
|
+
automatic_label_click enable_aria_label save_path
|
|
15
|
+
asset_host].each do |m|
|
|
16
|
+
expect(session.config.public_send(m)).to eq Capybara.public_send(m)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "doesn't change global session when changed" do
|
|
21
|
+
Capybara.threadsafe = true
|
|
22
|
+
host = 'http://my.example.com'
|
|
23
|
+
session = Capybara::Session.new(:rack_test, TestApp) do |config|
|
|
24
|
+
config.default_host = host
|
|
25
|
+
config.automatic_label_click = !config.automatic_label_click
|
|
26
|
+
config.server_errors << ArgumentError
|
|
27
|
+
end
|
|
28
|
+
expect(Capybara.default_host).not_to eq host
|
|
29
|
+
expect(session.config.default_host).to eq host
|
|
30
|
+
expect(Capybara.automatic_label_click).not_to eq session.config.automatic_label_click
|
|
31
|
+
expect(Capybara.server_errors).not_to eq session.config.server_errors
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "doesn't allow session configuration block when false" do
|
|
35
|
+
Capybara.threadsafe = false
|
|
36
|
+
expect do
|
|
37
|
+
Capybara::Session.new(:rack_test, TestApp) { |config| }
|
|
38
|
+
end.to raise_error 'A configuration block is only accepted when Capybara.threadsafe == true'
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "doesn't allow session config when false" do
|
|
42
|
+
Capybara.threadsafe = false
|
|
43
|
+
session = Capybara::Session.new(:rack_test, TestApp)
|
|
44
|
+
expect { session.config.default_selector = :title }.to raise_error(/Per session settings are only supported when Capybara.threadsafe == true/)
|
|
45
|
+
expect do
|
|
46
|
+
session.configure do |config|
|
|
47
|
+
config.exact = true
|
|
48
|
+
end
|
|
49
|
+
end.to raise_error(/Session configuration is only supported when Capybara.threadsafe == true/)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'uses the config from the session' do
|
|
53
|
+
Capybara.threadsafe = true
|
|
54
|
+
session = Capybara::Session.new(:rack_test, TestApp) do |config|
|
|
55
|
+
config.default_selector = :link
|
|
56
|
+
end
|
|
57
|
+
session.visit('/with_html')
|
|
58
|
+
expect(session.find('foo').tag_name).to eq 'a'
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "won't change threadsafe once a session is created" do
|
|
62
|
+
Capybara.threadsafe = true
|
|
63
|
+
Capybara.threadsafe = false
|
|
64
|
+
Capybara::Session.new(:rack_test, TestApp)
|
|
65
|
+
expect { Capybara.threadsafe = true }.to raise_error(/Threadsafe setting cannot be changed once a session is created/)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
data/spec/rack_test_spec.rb
CHANGED
|
@@ -1,186 +1,279 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'spec_helper'
|
|
4
|
+
nokogumbo_required = begin
|
|
5
|
+
require 'nokogumbo'
|
|
6
|
+
true
|
|
7
|
+
rescue LoadError
|
|
8
|
+
false
|
|
9
|
+
end
|
|
3
10
|
|
|
4
11
|
module TestSessions
|
|
5
12
|
RackTest = Capybara::Session.new(:rack_test, TestApp)
|
|
6
13
|
end
|
|
7
14
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
skipped_tests = %i[
|
|
16
|
+
js
|
|
17
|
+
modals
|
|
18
|
+
screenshot
|
|
19
|
+
frames
|
|
20
|
+
windows
|
|
21
|
+
send_keys
|
|
22
|
+
server
|
|
23
|
+
hover
|
|
24
|
+
about_scheme
|
|
25
|
+
download
|
|
26
|
+
css
|
|
27
|
+
scroll
|
|
28
|
+
spatial
|
|
29
|
+
html_validation
|
|
30
|
+
shadow_dom
|
|
18
31
|
]
|
|
32
|
+
Capybara::SpecHelper.run_specs TestSessions::RackTest, 'RackTest', capybara_skip: skipped_tests do |example|
|
|
33
|
+
case example.metadata[:full_description]
|
|
34
|
+
when /has_css\? should support case insensitive :class and :id options/
|
|
35
|
+
skip "Nokogiri doesn't support case insensitive CSS attribute matchers"
|
|
36
|
+
when /#click_button should follow permanent redirects that maintain method/
|
|
37
|
+
skip "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
|
|
38
|
+
end
|
|
39
|
+
end
|
|
19
40
|
|
|
20
|
-
RSpec.describe Capybara::Session do
|
|
41
|
+
RSpec.describe Capybara::Session do # rubocop:disable RSpec/MultipleDescribes
|
|
42
|
+
include Capybara::RSpecMatchers
|
|
21
43
|
context 'with rack test driver' do
|
|
22
|
-
|
|
23
|
-
@session = TestSessions::RackTest
|
|
24
|
-
end
|
|
44
|
+
let(:session) { TestSessions::RackTest }
|
|
25
45
|
|
|
26
46
|
describe '#driver' do
|
|
27
|
-
it
|
|
28
|
-
expect(
|
|
47
|
+
it 'should be a rack test driver' do
|
|
48
|
+
expect(session.driver).to be_an_instance_of(Capybara::RackTest::Driver)
|
|
29
49
|
end
|
|
30
50
|
end
|
|
31
51
|
|
|
32
52
|
describe '#mode' do
|
|
33
|
-
it
|
|
34
|
-
expect(
|
|
53
|
+
it 'should remember the mode' do
|
|
54
|
+
expect(session.mode).to eq(:rack_test)
|
|
35
55
|
end
|
|
36
56
|
end
|
|
37
57
|
|
|
38
58
|
describe '#click_link' do
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
59
|
+
after do
|
|
60
|
+
session.driver.options[:respect_data_method] = false
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it 'should use data-method if option is true' do
|
|
64
|
+
session.driver.options[:respect_data_method] = true
|
|
65
|
+
session.visit '/with_html'
|
|
66
|
+
session.click_link 'A link with data-method'
|
|
67
|
+
expect(session.html).to include('The requested object was deleted')
|
|
44
68
|
end
|
|
45
69
|
|
|
46
|
-
it
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
expect(
|
|
70
|
+
it 'should not use data-method if option is false' do
|
|
71
|
+
session.driver.options[:respect_data_method] = false
|
|
72
|
+
session.visit '/with_html'
|
|
73
|
+
session.click_link 'A link with data-method'
|
|
74
|
+
expect(session.html).to include('Not deleted')
|
|
51
75
|
end
|
|
52
76
|
|
|
53
77
|
it "should use data-method if available even if it's capitalized" do
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
expect(
|
|
78
|
+
session.driver.options[:respect_data_method] = true
|
|
79
|
+
session.visit '/with_html'
|
|
80
|
+
session.click_link 'A link with capitalized data-method'
|
|
81
|
+
expect(session.html).to include('The requested object was deleted')
|
|
58
82
|
end
|
|
83
|
+
end
|
|
59
84
|
|
|
60
|
-
|
|
61
|
-
|
|
85
|
+
describe '#fill_in' do
|
|
86
|
+
it 'should warn that :fill_options are not supported' do
|
|
87
|
+
session.visit '/with_html'
|
|
88
|
+
expect { session.fill_in 'test_field', with: 'not_monkey', fill_options: { random: true } }.to \
|
|
89
|
+
output(/^Options passed to Node#set but the RackTest driver doesn't support any - ignoring/).to_stderr
|
|
90
|
+
expect(session).to have_field('test_field', with: 'not_monkey')
|
|
62
91
|
end
|
|
63
92
|
end
|
|
64
93
|
|
|
65
|
-
describe
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
.
|
|
69
|
-
|
|
70
|
-
|
|
94
|
+
describe '#attach_file' do
|
|
95
|
+
context 'with multipart form' do
|
|
96
|
+
it 'should submit an empty form-data section if no file is submitted' do
|
|
97
|
+
session.visit('/form')
|
|
98
|
+
session.click_button('Upload Empty')
|
|
99
|
+
expect(session.html).to include('Successfully ignored empty file field.')
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
it 'should not submit an obsolete mime type' do
|
|
104
|
+
test_jpg_file_path = File.expand_path('fixtures/capybara.csv', File.dirname(__FILE__))
|
|
105
|
+
session.visit('/form')
|
|
106
|
+
session.attach_file 'form_document', test_jpg_file_path
|
|
107
|
+
session.click_button('Upload Single')
|
|
108
|
+
expect(session).to have_content('Content-type: text/csv')
|
|
71
109
|
end
|
|
72
110
|
end
|
|
73
111
|
|
|
74
|
-
describe
|
|
75
|
-
context
|
|
76
|
-
it
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
112
|
+
describe '#click' do
|
|
113
|
+
context 'on a label' do
|
|
114
|
+
it 'should toggle the associated checkbox' do
|
|
115
|
+
session.visit('/form')
|
|
116
|
+
expect(session).to have_unchecked_field('form_pets_cat')
|
|
117
|
+
session.find(:label, 'Cat').click
|
|
118
|
+
expect(session).to have_checked_field('form_pets_cat')
|
|
119
|
+
session.find(:label, 'Cat').click
|
|
120
|
+
expect(session).to have_unchecked_field('form_pets_cat')
|
|
121
|
+
session.find(:label, 'McLaren').click
|
|
122
|
+
expect(session).to have_checked_field('form_cars_mclaren', visible: :hidden)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it 'should toggle the associated radio' do
|
|
126
|
+
session.visit('/form')
|
|
127
|
+
expect(session).to have_unchecked_field('gender_male')
|
|
128
|
+
session.find(:label, 'Male').click
|
|
129
|
+
expect(session).to have_checked_field('gender_male')
|
|
130
|
+
session.find(:label, 'Female').click
|
|
131
|
+
expect(session).to have_unchecked_field('gender_male')
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'should rewrite the forms action query for get submission' do
|
|
135
|
+
session.visit('/form')
|
|
136
|
+
session.click_button('mediocre')
|
|
137
|
+
expect(session).not_to have_current_path(/foo|bar/)
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
it 'should rewrite the submit buttons formaction query for get submission' do
|
|
141
|
+
session.visit('/form')
|
|
142
|
+
session.click_button('mediocre2')
|
|
143
|
+
expect(session).not_to have_current_path(/foo|bar/)
|
|
80
144
|
end
|
|
81
145
|
end
|
|
82
146
|
end
|
|
147
|
+
|
|
148
|
+
describe '#send_keys' do
|
|
149
|
+
it 'raises an UnsupportedMethodError' do
|
|
150
|
+
session.visit('/form')
|
|
151
|
+
|
|
152
|
+
expect { session.send_keys(:tab) }.to raise_error(Capybara::NotSupportedByDriverError)
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
describe '#text' do
|
|
157
|
+
it 'should return original text content for textareas' do
|
|
158
|
+
session.visit('/with_html')
|
|
159
|
+
session.find_field('normal', type: 'textarea', with: 'banana').set('hello')
|
|
160
|
+
normal = session.find(:css, '#normal')
|
|
161
|
+
expect(normal.value).to eq 'hello'
|
|
162
|
+
expect(normal.text).to eq 'banana'
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
describe '#style' do
|
|
167
|
+
it 'should raise an error' do
|
|
168
|
+
session.visit('/with_html')
|
|
169
|
+
el = session.find(:css, '#first')
|
|
170
|
+
expect { el.style('display') }.to raise_error NotImplementedError, /not process CSS/
|
|
171
|
+
end
|
|
172
|
+
end
|
|
83
173
|
end
|
|
84
174
|
end
|
|
85
175
|
|
|
86
176
|
RSpec.describe Capybara::RackTest::Driver do
|
|
87
|
-
|
|
88
|
-
@driver = TestSessions::RackTest.driver
|
|
89
|
-
end
|
|
177
|
+
let(:driver) { TestSessions::RackTest.driver }
|
|
90
178
|
|
|
91
179
|
describe ':headers option' do
|
|
92
180
|
it 'should always set headers' do
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
expect(
|
|
181
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
182
|
+
driver.visit('/get_header')
|
|
183
|
+
expect(driver.html).to include('foobar')
|
|
96
184
|
end
|
|
97
185
|
|
|
98
186
|
it 'should keep headers on link clicks' do
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
expect(
|
|
187
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
188
|
+
driver.visit('/header_links')
|
|
189
|
+
driver.find_xpath('.//a').first.click
|
|
190
|
+
expect(driver.html).to include('foobar')
|
|
103
191
|
end
|
|
104
192
|
|
|
105
193
|
it 'should keep headers on form submit' do
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
expect(
|
|
194
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
195
|
+
driver.visit('/header_links')
|
|
196
|
+
driver.find_xpath('.//input').first.click
|
|
197
|
+
expect(driver.html).to include('foobar')
|
|
110
198
|
end
|
|
111
199
|
|
|
112
200
|
it 'should keep headers on redirects' do
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
expect(
|
|
201
|
+
driver = described_class.new(TestApp, headers: { 'HTTP_FOO' => 'foobar' })
|
|
202
|
+
driver.visit('/get_header_via_redirect')
|
|
203
|
+
expect(driver.html).to include('foobar')
|
|
116
204
|
end
|
|
117
205
|
end
|
|
118
206
|
|
|
119
207
|
describe ':follow_redirects option' do
|
|
120
|
-
it
|
|
121
|
-
|
|
208
|
+
it 'defaults to following redirects' do
|
|
209
|
+
driver = described_class.new(TestApp)
|
|
122
210
|
|
|
123
|
-
|
|
124
|
-
expect(
|
|
125
|
-
expect(
|
|
211
|
+
driver.visit('/redirect')
|
|
212
|
+
expect(driver.response.header['Location']).to be_nil
|
|
213
|
+
expect(driver.current_url).to match %r{/landed$}
|
|
126
214
|
end
|
|
127
215
|
|
|
128
|
-
it
|
|
129
|
-
|
|
216
|
+
it 'is possible to not follow redirects' do
|
|
217
|
+
driver = described_class.new(TestApp, follow_redirects: false)
|
|
130
218
|
|
|
131
|
-
|
|
132
|
-
expect(
|
|
133
|
-
expect(
|
|
219
|
+
driver.visit('/redirect')
|
|
220
|
+
expect(driver.response.header['Location']).to match %r{/redirect_again$}
|
|
221
|
+
expect(driver.current_url).to match %r{/redirect$}
|
|
134
222
|
end
|
|
135
223
|
end
|
|
136
224
|
|
|
137
225
|
describe ':redirect_limit option' do
|
|
138
|
-
context
|
|
139
|
-
|
|
140
|
-
@driver = Capybara::RackTest::Driver.new(TestApp)
|
|
141
|
-
end
|
|
226
|
+
context 'with default redirect limit' do
|
|
227
|
+
let(:driver) { described_class.new(TestApp) }
|
|
142
228
|
|
|
143
|
-
it
|
|
144
|
-
|
|
145
|
-
expect(
|
|
229
|
+
it 'should follow 5 redirects' do
|
|
230
|
+
driver.visit('/redirect/5/times')
|
|
231
|
+
expect(driver.html).to include('redirection complete')
|
|
146
232
|
end
|
|
147
233
|
|
|
148
|
-
it
|
|
234
|
+
it 'should not follow more than 6 redirects' do
|
|
149
235
|
expect do
|
|
150
|
-
|
|
236
|
+
driver.visit('/redirect/6/times')
|
|
151
237
|
end.to raise_error(Capybara::InfiniteRedirectError)
|
|
152
238
|
end
|
|
153
239
|
end
|
|
154
240
|
|
|
155
|
-
context
|
|
156
|
-
|
|
157
|
-
@driver = Capybara::RackTest::Driver.new(TestApp, :redirect_limit => 21)
|
|
158
|
-
end
|
|
241
|
+
context 'with 21 redirect limit' do
|
|
242
|
+
let(:driver) { described_class.new(TestApp, redirect_limit: 21) }
|
|
159
243
|
|
|
160
|
-
it
|
|
161
|
-
|
|
162
|
-
expect(
|
|
244
|
+
it 'should follow 21 redirects' do
|
|
245
|
+
driver.visit('/redirect/21/times')
|
|
246
|
+
expect(driver.html).to include('redirection complete')
|
|
163
247
|
end
|
|
164
248
|
|
|
165
|
-
it
|
|
249
|
+
it 'should not follow more than 21 redirects' do
|
|
166
250
|
expect do
|
|
167
|
-
|
|
251
|
+
driver.visit('/redirect/22/times')
|
|
168
252
|
end.to raise_error(Capybara::InfiniteRedirectError)
|
|
169
253
|
end
|
|
170
254
|
end
|
|
171
255
|
end
|
|
172
256
|
end
|
|
173
257
|
|
|
258
|
+
RSpec.describe 'Capybara::String' do
|
|
259
|
+
it 'should use gumbo' do
|
|
260
|
+
skip 'Only valid if gumbo is included' unless nokogumbo_required
|
|
261
|
+
allow(Nokogiri).to receive(:HTML5).and_call_original
|
|
262
|
+
Capybara.string('<div id=test_div></div>')
|
|
263
|
+
expect(Nokogiri).to have_received(:HTML5)
|
|
264
|
+
end
|
|
265
|
+
end
|
|
266
|
+
|
|
174
267
|
module CSSHandlerIncludeTester
|
|
175
268
|
def dont_extend_css_handler
|
|
176
269
|
raise 'should never be called'
|
|
177
270
|
end
|
|
178
271
|
end
|
|
179
|
-
include CSSHandlerIncludeTester
|
|
180
272
|
|
|
181
|
-
RSpec.describe
|
|
182
|
-
|
|
183
|
-
|
|
273
|
+
RSpec.describe Capybara::RackTest::CSSHandlers do
|
|
274
|
+
include CSSHandlerIncludeTester
|
|
275
|
+
|
|
276
|
+
it 'should not be extended by global includes' do
|
|
277
|
+
expect(described_class.new).not_to respond_to(:dont_extend_css_handler)
|
|
184
278
|
end
|
|
185
279
|
end
|
|
186
|
-
|