capybara 3.0.0 → 3.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.yardopts +1 -1
- data/History.md +891 -12
- data/License.txt +1 -1
- data/README.md +257 -84
- data/lib/capybara/config.rb +29 -10
- data/lib/capybara/cucumber.rb +1 -1
- data/lib/capybara/driver/base.rb +22 -4
- data/lib/capybara/driver/node.rb +38 -9
- data/lib/capybara/dsl.rb +9 -7
- data/lib/capybara/helpers.rb +57 -8
- data/lib/capybara/minitest/spec.rb +185 -84
- data/lib/capybara/minitest.rb +264 -145
- data/lib/capybara/node/actions.rb +248 -124
- data/lib/capybara/node/base.rb +35 -20
- data/lib/capybara/node/document.rb +14 -2
- data/lib/capybara/node/document_matchers.rb +13 -15
- data/lib/capybara/node/element.rb +350 -113
- data/lib/capybara/node/finders.rb +104 -82
- data/lib/capybara/node/matchers.rb +363 -157
- data/lib/capybara/node/simple.rb +54 -15
- data/lib/capybara/node/whitespace_normalizer.rb +81 -0
- data/lib/capybara/queries/active_element_query.rb +18 -0
- data/lib/capybara/queries/ancestor_query.rb +9 -10
- data/lib/capybara/queries/base_query.rb +25 -18
- data/lib/capybara/queries/current_path_query.rb +16 -6
- data/lib/capybara/queries/match_query.rb +11 -0
- data/lib/capybara/queries/selector_query.rb +617 -104
- data/lib/capybara/queries/sibling_query.rb +9 -7
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +40 -22
- data/lib/capybara/queries/title_query.rb +2 -2
- data/lib/capybara/rack_test/browser.rb +106 -31
- data/lib/capybara/rack_test/driver.rb +16 -7
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +74 -49
- data/lib/capybara/rack_test/node.rb +120 -47
- data/lib/capybara/rails.rb +1 -1
- data/lib/capybara/registration_container.rb +41 -0
- data/lib/capybara/registrations/drivers.rb +42 -0
- data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
- data/lib/capybara/registrations/servers.rb +66 -0
- data/lib/capybara/result.rb +87 -53
- data/lib/capybara/rspec/features.rb +8 -10
- data/lib/capybara/rspec/matcher_proxies.rb +39 -18
- data/lib/capybara/rspec/matchers/base.rb +113 -0
- data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
- data/lib/capybara/rspec/matchers/compound.rb +88 -0
- data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
- data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
- data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
- data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
- data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
- data/lib/capybara/rspec/matchers/have_text.rb +33 -0
- data/lib/capybara/rspec/matchers/have_title.rb +29 -0
- data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
- data/lib/capybara/rspec/matchers/match_style.rb +43 -0
- data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
- data/lib/capybara/rspec/matchers.rb +142 -315
- data/lib/capybara/rspec.rb +3 -2
- data/lib/capybara/selector/builders/css_builder.rb +84 -0
- data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
- data/lib/capybara/selector/css.rb +85 -8
- data/lib/capybara/selector/definition/button.rb +68 -0
- data/lib/capybara/selector/definition/checkbox.rb +26 -0
- data/lib/capybara/selector/definition/css.rb +10 -0
- data/lib/capybara/selector/definition/datalist_input.rb +35 -0
- data/lib/capybara/selector/definition/datalist_option.rb +25 -0
- data/lib/capybara/selector/definition/element.rb +28 -0
- data/lib/capybara/selector/definition/field.rb +40 -0
- data/lib/capybara/selector/definition/fieldset.rb +14 -0
- data/lib/capybara/selector/definition/file_field.rb +13 -0
- data/lib/capybara/selector/definition/fillable_field.rb +33 -0
- data/lib/capybara/selector/definition/frame.rb +17 -0
- data/lib/capybara/selector/definition/id.rb +6 -0
- data/lib/capybara/selector/definition/label.rb +62 -0
- data/lib/capybara/selector/definition/link.rb +55 -0
- data/lib/capybara/selector/definition/link_or_button.rb +16 -0
- data/lib/capybara/selector/definition/option.rb +27 -0
- data/lib/capybara/selector/definition/radio_button.rb +27 -0
- data/lib/capybara/selector/definition/select.rb +81 -0
- data/lib/capybara/selector/definition/table.rb +109 -0
- data/lib/capybara/selector/definition/table_row.rb +21 -0
- data/lib/capybara/selector/definition/xpath.rb +5 -0
- data/lib/capybara/selector/definition.rb +280 -0
- data/lib/capybara/selector/filter.rb +1 -0
- data/lib/capybara/selector/filter_set.rb +72 -28
- data/lib/capybara/selector/filters/base.rb +45 -2
- data/lib/capybara/selector/filters/expression_filter.rb +5 -6
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +18 -4
- data/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/lib/capybara/selector/selector.rb +89 -200
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +474 -534
- data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
- data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
- data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
- data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
- data/lib/capybara/selenium/driver.rb +270 -245
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
- data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
- data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
- data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
- data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
- data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
- data/lib/capybara/selenium/extensions/find.rb +110 -0
- data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
- data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
- data/lib/capybara/selenium/extensions/scroll.rb +76 -0
- data/lib/capybara/selenium/node.rb +460 -170
- data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
- data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
- data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
- data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
- data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
- data/lib/capybara/selenium/patches/atoms.rb +18 -0
- data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
- data/lib/capybara/selenium/patches/logs.rb +45 -0
- data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
- data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
- data/lib/capybara/server/animation_disabler.rb +80 -0
- data/lib/capybara/server/checker.rb +44 -0
- data/lib/capybara/server/middleware.rb +71 -0
- data/lib/capybara/server.rb +58 -67
- data/lib/capybara/session/config.rb +40 -6
- data/lib/capybara/session/matchers.rb +26 -19
- data/lib/capybara/session.rb +252 -194
- data/lib/capybara/spec/public/jquery.js +5 -5
- data/lib/capybara/spec/public/offset.js +6 -0
- data/lib/capybara/spec/public/test.js +126 -8
- data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
- data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +135 -44
- data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
- data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
- data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
- data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
- data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
- data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
- data/lib/capybara/spec/session/body_spec.rb +11 -13
- data/lib/capybara/spec/session/check_spec.rb +112 -51
- data/lib/capybara/spec/session/choose_spec.rb +62 -30
- data/lib/capybara/spec/session/click_button_spec.rb +227 -161
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
- data/lib/capybara/spec/session/click_link_spec.rb +89 -55
- data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
- data/lib/capybara/spec/session/current_url_spec.rb +44 -37
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
- data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
- data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
- data/lib/capybara/spec/session/fill_in_spec.rb +110 -44
- data/lib/capybara/spec/session/find_button_spec.rb +23 -23
- data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
- data/lib/capybara/spec/session/find_field_spec.rb +33 -31
- data/lib/capybara/spec/session/find_link_spec.rb +42 -14
- data/lib/capybara/spec/session/find_spec.rb +251 -142
- data/lib/capybara/spec/session/first_spec.rb +45 -44
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
- data/lib/capybara/spec/session/go_back_spec.rb +1 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
- data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
- data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
- data/lib/capybara/spec/session/has_button_spec.rb +98 -12
- data/lib/capybara/spec/session/has_css_spec.rb +271 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
- data/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/lib/capybara/spec/session/has_field_spec.rb +137 -58
- data/lib/capybara/spec/session/has_link_spec.rb +46 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
- data/lib/capybara/spec/session/has_select_spec.rb +84 -50
- data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +181 -4
- data/lib/capybara/spec/session/has_text_spec.rb +101 -53
- data/lib/capybara/spec/session/has_title_spec.rb +19 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
- data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +1 -1
- data/lib/capybara/spec/session/html_spec.rb +13 -6
- data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
- data/lib/capybara/spec/session/node_spec.rb +958 -122
- data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
- data/lib/capybara/spec/session/refresh_spec.rb +9 -7
- data/lib/capybara/spec/session/reset_session_spec.rb +65 -37
- data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +1 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +5 -4
- data/lib/capybara/spec/session/save_page_spec.rb +41 -38
- data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
- data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
- data/lib/capybara/spec/session/scroll_spec.rb +119 -0
- data/lib/capybara/spec/session/select_spec.rb +102 -76
- data/lib/capybara/spec/session/selectors_spec.rb +51 -18
- data/lib/capybara/spec/session/sibling_spec.rb +9 -9
- data/lib/capybara/spec/session/text_spec.rb +26 -24
- data/lib/capybara/spec/session/title_spec.rb +8 -6
- data/lib/capybara/spec/session/uncheck_spec.rb +41 -22
- data/lib/capybara/spec/session/unselect_spec.rb +37 -37
- data/lib/capybara/spec/session/visit_spec.rb +79 -53
- data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
- data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
- data/lib/capybara/spec/session/window/window_spec.rb +88 -54
- data/lib/capybara/spec/session/window/windows_spec.rb +11 -8
- data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
- data/lib/capybara/spec/session/within_spec.rb +82 -44
- data/lib/capybara/spec/spec_helper.rb +46 -52
- data/lib/capybara/spec/test_app.rb +148 -41
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +156 -42
- data/lib/capybara/spec/views/frame_child.erb +4 -3
- data/lib/capybara/spec/views/frame_one.erb +2 -1
- data/lib/capybara/spec/views/frame_parent.erb +1 -1
- data/lib/capybara/spec/views/frame_two.erb +1 -1
- data/lib/capybara/spec/views/initial_alert.erb +2 -1
- data/lib/capybara/spec/views/layout.erb +10 -0
- data/lib/capybara/spec/views/obscured.erb +47 -0
- data/lib/capybara/spec/views/offset.erb +33 -0
- data/lib/capybara/spec/views/path.erb +2 -2
- data/lib/capybara/spec/views/popup_one.erb +1 -1
- data/lib/capybara/spec/views/popup_two.erb +1 -1
- data/lib/capybara/spec/views/react.erb +45 -0
- data/lib/capybara/spec/views/scroll.erb +21 -0
- data/lib/capybara/spec/views/spatial.erb +31 -0
- data/lib/capybara/spec/views/tables.erb +68 -1
- data/lib/capybara/spec/views/with_animation.erb +81 -0
- data/lib/capybara/spec/views/with_base_tag.erb +2 -2
- data/lib/capybara/spec/views/with_dragula.erb +24 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
- data/lib/capybara/spec/views/with_hover.erb +3 -2
- data/lib/capybara/spec/views/with_hover1.erb +10 -0
- data/lib/capybara/spec/views/with_html.erb +46 -11
- data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
- data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
- data/lib/capybara/spec/views/with_js.erb +30 -5
- data/lib/capybara/spec/views/with_jstree.erb +26 -0
- data/lib/capybara/spec/views/with_namespace.erb +21 -0
- data/lib/capybara/spec/views/with_scope.erb +2 -2
- data/lib/capybara/spec/views/with_scope_other.erb +6 -0
- data/lib/capybara/spec/views/with_shadow.erb +31 -0
- data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
- data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
- data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
- data/lib/capybara/spec/views/with_windows.erb +1 -1
- data/lib/capybara/spec/views/within_frames.erb +1 -1
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +32 -26
- data/lib/capybara.rb +128 -104
- data/spec/basic_node_spec.rb +59 -34
- data/spec/capybara_spec.rb +65 -51
- data/spec/counter_spec.rb +35 -0
- data/spec/css_builder_spec.rb +101 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +84 -55
- data/spec/filter_set_spec.rb +24 -7
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
- data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
- data/spec/minitest_spec.rb +49 -5
- data/spec/minitest_spec_spec.rb +92 -62
- data/spec/per_session_config_spec.rb +6 -6
- data/spec/rack_test_spec.rb +183 -115
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +99 -39
- data/spec/rspec/features_spec.rb +28 -25
- data/spec/rspec/scenarios_spec.rb +10 -6
- data/spec/rspec/shared_spec_matchers.rb +418 -364
- data/spec/rspec/views_spec.rb +4 -3
- data/spec/rspec_matchers_spec.rb +35 -10
- data/spec/rspec_spec.rb +109 -85
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +392 -62
- data/spec/selenium_spec_chrome.rb +183 -41
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +41 -8
- data/spec/selenium_spec_firefox.rb +228 -0
- data/spec/selenium_spec_firefox_remote.rb +94 -0
- data/spec/selenium_spec_ie.rb +129 -11
- data/spec/selenium_spec_safari.rb +162 -0
- data/spec/server_spec.rb +192 -81
- data/spec/session_spec.rb +52 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +460 -123
- data/spec/spec_helper.rb +124 -2
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +344 -45
- data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
- data/.yard/templates_custom/default/class/html/setup.rb +0 -17
- data/.yard/yard_extensions.rb +0 -78
- data/lib/capybara/rspec/compound.rb +0 -90
- data/lib/capybara/spec/session/assert_selector.rb +0 -149
- data/lib/capybara/spec/session/source_spec.rb +0 -0
- data/lib/capybara/spec/views/with_title.erb +0 -5
- data/spec/selenium_spec_marionette.rb +0 -143
data/spec/basic_node_spec.rb
CHANGED
@@ -3,9 +3,10 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
RSpec.describe Capybara do
|
6
|
+
include Capybara::RSpecMatchers
|
6
7
|
describe '.string' do
|
7
8
|
let :string do
|
8
|
-
|
9
|
+
described_class.string <<-STRING
|
9
10
|
<html>
|
10
11
|
<head>
|
11
12
|
<title>simple_node</title>
|
@@ -46,97 +47,121 @@ RSpec.describe Capybara do
|
|
46
47
|
STRING
|
47
48
|
end
|
48
49
|
|
49
|
-
it
|
50
|
+
it 'allows using matchers' do
|
50
51
|
expect(string).to have_css('#page')
|
51
52
|
expect(string).not_to have_css('#does-not-exist')
|
52
53
|
end
|
53
54
|
|
54
|
-
it
|
55
|
-
|
55
|
+
it 'allows using custom matchers' do
|
56
|
+
described_class.add_selector :lifeform do
|
56
57
|
xpath { |name| ".//option[contains(.,'#{name}')]" }
|
57
58
|
end
|
58
|
-
expect(string).to have_selector(:id,
|
59
|
+
expect(string).to have_selector(:id, 'page')
|
59
60
|
expect(string).not_to have_selector(:id, 'does-not-exist')
|
60
|
-
expect(string).to have_selector(:lifeform,
|
61
|
-
expect(string).not_to have_selector(:lifeform,
|
61
|
+
expect(string).to have_selector(:lifeform, 'Monkey')
|
62
|
+
expect(string).not_to have_selector(:lifeform, 'Gorilla')
|
62
63
|
end
|
63
64
|
|
64
65
|
it 'allows custom matcher using css' do
|
65
|
-
|
66
|
+
described_class.add_selector :section do
|
66
67
|
css { |css_class| "section .#{css_class}" }
|
67
68
|
end
|
68
69
|
expect(string).to have_selector(:section, 'subsection')
|
69
70
|
expect(string).not_to have_selector(:section, 'section_8')
|
70
71
|
end
|
71
72
|
|
72
|
-
it
|
73
|
+
it 'allows using matchers with text option' do
|
73
74
|
expect(string).to have_css('h1', text: 'Totally awesome')
|
74
75
|
expect(string).not_to have_css('h1', text: 'Not so awesome')
|
75
76
|
end
|
76
77
|
|
77
|
-
it
|
78
|
+
it 'allows finding only visible nodes' do
|
78
79
|
expect(string.all(:css, '#secret', visible: true)).to be_empty
|
79
80
|
expect(string.all(:css, '#secret', visible: false).size).to eq(1)
|
80
81
|
end
|
81
82
|
|
82
|
-
it
|
83
|
+
it 'allows finding elements and extracting text from them' do
|
83
84
|
expect(string.find('//h1').text).to eq('Totally awesome')
|
84
85
|
end
|
85
86
|
|
86
|
-
it
|
87
|
+
it 'allows finding elements and extracting attributes from them' do
|
87
88
|
expect(string.find('//h1')[:data]).to eq('fantastic')
|
88
89
|
end
|
89
90
|
|
90
|
-
it
|
91
|
+
it 'allows finding elements and extracting the tag name from them' do
|
91
92
|
expect(string.find('//h1').tag_name).to eq('h1')
|
92
93
|
end
|
93
94
|
|
94
|
-
it
|
95
|
+
it 'allows finding elements and extracting the path' do
|
95
96
|
expect(string.find('//h1').path).to eq('/html/body/div/div[1]/h1')
|
96
97
|
end
|
97
98
|
|
98
|
-
it
|
99
|
+
it 'allows finding elements and extracting the value' do
|
99
100
|
expect(string.find('//div/input').value).to eq('bar')
|
100
101
|
expect(string.find('//select').value).to eq('Capybara')
|
101
102
|
end
|
102
103
|
|
103
|
-
it
|
104
|
+
it 'allows finding elements and checking if they are visible' do
|
104
105
|
expect(string.find('//h1')).to be_visible
|
105
|
-
expect(string.find(:css,
|
106
|
+
expect(string.find(:css, '#secret', visible: false)).not_to be_visible
|
106
107
|
end
|
107
108
|
|
108
|
-
it
|
109
|
+
it 'allows finding elements and checking if they are disabled' do
|
109
110
|
expect(string.find('//form/input[@name="bleh"]')).to be_disabled
|
110
111
|
expect(string.find('//form/input[@name="meh"]')).not_to be_disabled
|
111
112
|
end
|
112
113
|
|
113
|
-
|
114
|
-
|
115
|
-
|
114
|
+
it 'allows finding siblings' do
|
115
|
+
h1 = string.find(:css, 'h1')
|
116
|
+
expect(h1).to have_sibling(:css, 'p', text: 'Yes it is')
|
117
|
+
expect(h1).not_to have_sibling(:css, 'p', text: 'Jonas Nicklas')
|
118
|
+
end
|
119
|
+
|
120
|
+
it 'allows finding ancestor' do
|
121
|
+
h1 = string.find(:css, 'h1')
|
122
|
+
expect(h1).to have_ancestor(:css, '#content')
|
123
|
+
expect(h1).not_to have_ancestor(:css, '#footer')
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'drops illegal fragments when using gumbo' do
|
127
|
+
skip 'libxml is less strict than Gumbo' unless Nokogiri.respond_to?(:HTML5)
|
128
|
+
described_class.use_html5_parsing = true
|
129
|
+
expect(described_class.string('<td>1</td>')).not_to have_css('td')
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'can disable use of HTML5 parsing' do
|
133
|
+
skip "Test doesn't make sense unlesss HTML5 parsing is loaded (Nokogumbo or Nokogiri >= 1.12.0)" unless Nokogiri.respond_to?(:HTML5)
|
134
|
+
described_class.use_html5_parsing = false
|
135
|
+
expect(described_class.string('<td>1</td>')).to have_css('td')
|
136
|
+
end
|
137
|
+
|
138
|
+
describe '#title' do
|
139
|
+
it 'returns the page title' do
|
140
|
+
expect(string.title).to eq('simple_node')
|
116
141
|
end
|
117
142
|
end
|
118
143
|
|
119
|
-
describe
|
120
|
-
it
|
121
|
-
expect(string.has_title?('simple_node')).to
|
122
|
-
expect(string.has_title?('monkey')).to
|
144
|
+
describe '#has_title?' do
|
145
|
+
it 'returns whether the page has the given title' do
|
146
|
+
expect(string.has_title?('simple_node')).to be true
|
147
|
+
expect(string.has_title?('monkey')).to be false
|
123
148
|
end
|
124
149
|
|
125
|
-
it
|
126
|
-
expect(string.has_title?(/s[a-z]+_node/)).to
|
127
|
-
expect(string.has_title?(/monkey/)).to
|
150
|
+
it 'allows regexp matches' do
|
151
|
+
expect(string.has_title?(/s[a-z]+_node/)).to be true
|
152
|
+
expect(string.has_title?(/monkey/)).to be false
|
128
153
|
end
|
129
154
|
end
|
130
155
|
|
131
156
|
describe '#has_no_title?' do
|
132
|
-
it
|
133
|
-
expect(string.has_no_title?('simple_node')).to
|
134
|
-
expect(string.has_no_title?('monkey')).to
|
157
|
+
it 'returns whether the page does not have the given title' do
|
158
|
+
expect(string.has_no_title?('simple_node')).to be false
|
159
|
+
expect(string.has_no_title?('monkey')).to be true
|
135
160
|
end
|
136
161
|
|
137
|
-
it
|
138
|
-
expect(string.has_no_title?(/s[a-z]+_node/)).to
|
139
|
-
expect(string.has_no_title?(/monkey/)).to
|
162
|
+
it 'allows regexp matches' do
|
163
|
+
expect(string.has_no_title?(/s[a-z]+_node/)).to be false
|
164
|
+
expect(string.has_no_title?(/monkey/)).to be true
|
140
165
|
end
|
141
166
|
end
|
142
167
|
end
|
data/spec/capybara_spec.rb
CHANGED
@@ -4,107 +4,121 @@ require 'spec_helper'
|
|
4
4
|
|
5
5
|
RSpec.describe Capybara do
|
6
6
|
describe 'default_max_wait_time' do
|
7
|
-
|
8
|
-
|
7
|
+
before { @previous_default_time = described_class.default_max_wait_time }
|
8
|
+
|
9
|
+
after { described_class.default_max_wait_time = @previous_default_time } # rubocop:disable RSpec/InstanceVariable
|
10
|
+
|
11
|
+
it 'should be changeable' do
|
12
|
+
expect(described_class.default_max_wait_time).not_to eq(5)
|
13
|
+
described_class.default_max_wait_time = 5
|
14
|
+
expect(described_class.default_max_wait_time).to eq(5)
|
9
15
|
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'default_retry_interval' do
|
19
|
+
before { @previous_default_interval = described_class.default_retry_interval }
|
10
20
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
expect(
|
21
|
+
after { described_class.default_retry_interval = @previous_default_interval } # rubocop:disable RSpec/InstanceVariable
|
22
|
+
|
23
|
+
it 'should be changeable' do
|
24
|
+
expect(described_class.default_retry_interval).not_to eq(0.1)
|
25
|
+
described_class.default_retry_interval = 0.1
|
26
|
+
expect(described_class.default_retry_interval).to eq(0.1)
|
15
27
|
end
|
16
28
|
end
|
17
29
|
|
18
30
|
describe '.register_driver' do
|
19
|
-
it
|
20
|
-
|
31
|
+
it 'should add a new driver' do
|
32
|
+
described_class.register_driver :schmoo do |app|
|
21
33
|
Capybara::RackTest::Driver.new(app)
|
22
34
|
end
|
23
35
|
session = Capybara::Session.new(:schmoo, TestApp)
|
24
36
|
session.visit('/')
|
25
|
-
expect(session.body).to include(
|
37
|
+
expect(session.body).to include('Hello world!')
|
26
38
|
end
|
27
39
|
end
|
28
40
|
|
29
41
|
describe '.register_server' do
|
30
|
-
it
|
31
|
-
|
32
|
-
|
33
|
-
handler.run
|
42
|
+
it 'should add a new server' do
|
43
|
+
described_class.register_server :blob do |_app, _port, _host|
|
44
|
+
# do nothing
|
34
45
|
end
|
35
46
|
|
36
|
-
expect(
|
47
|
+
expect(described_class.servers[:blob]).to be_truthy
|
37
48
|
end
|
38
49
|
end
|
39
50
|
|
40
|
-
describe
|
51
|
+
describe '.server' do
|
41
52
|
after do
|
42
|
-
|
53
|
+
described_class.server = :default
|
43
54
|
end
|
44
55
|
|
45
|
-
it
|
46
|
-
mock_app =
|
47
|
-
|
48
|
-
|
56
|
+
it 'should default to a proc that calls run_default_server' do
|
57
|
+
mock_app = Object.new
|
58
|
+
allow(described_class).to receive(:run_default_server).and_return(true)
|
59
|
+
described_class.server.call(mock_app, 8000)
|
60
|
+
expect(described_class).to have_received(:run_default_server).with(mock_app, 8000)
|
49
61
|
end
|
50
62
|
|
51
|
-
it
|
63
|
+
it 'should return a custom server proc' do
|
52
64
|
server = ->(_app, _port) {}
|
53
|
-
|
54
|
-
|
55
|
-
expect(
|
65
|
+
described_class.register_server :custom, &server
|
66
|
+
described_class.server = :custom
|
67
|
+
expect(described_class.server).to eq(server)
|
56
68
|
end
|
57
69
|
|
58
|
-
it
|
59
|
-
expect(
|
70
|
+
it 'should have :webrick registered' do
|
71
|
+
expect(described_class.servers[:webrick]).not_to be_nil
|
60
72
|
end
|
61
73
|
|
62
|
-
it
|
63
|
-
expect(
|
74
|
+
it 'should have :puma registered' do
|
75
|
+
expect(described_class.servers[:puma]).not_to be_nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe 'server=' do
|
80
|
+
after do
|
81
|
+
described_class.server = :default
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'accepts a proc' do
|
85
|
+
server = ->(_app, _port) {}
|
86
|
+
described_class.server = server
|
87
|
+
expect(described_class.server).to eq server
|
64
88
|
end
|
65
89
|
end
|
66
90
|
|
67
91
|
describe 'app_host' do
|
68
92
|
after do
|
69
|
-
|
93
|
+
described_class.app_host = nil
|
70
94
|
end
|
71
95
|
|
72
|
-
it
|
73
|
-
expect {
|
96
|
+
it 'should warn if not a valid URL' do
|
97
|
+
expect { described_class.app_host = 'www.example.com' }.to raise_error(ArgumentError, /Capybara\.app_host should be set to a url/)
|
74
98
|
end
|
75
99
|
|
76
|
-
it
|
77
|
-
expect {
|
100
|
+
it 'should not warn if a valid URL' do
|
101
|
+
expect { described_class.app_host = 'http://www.example.com' }.not_to raise_error
|
78
102
|
end
|
79
103
|
|
80
|
-
it
|
81
|
-
expect {
|
104
|
+
it 'should not warn if nil' do
|
105
|
+
expect { described_class.app_host = nil }.not_to raise_error
|
82
106
|
end
|
83
107
|
end
|
84
108
|
|
85
109
|
describe 'default_host' do
|
86
110
|
around do |test|
|
87
|
-
old_default =
|
111
|
+
old_default = described_class.default_host
|
88
112
|
test.run
|
89
|
-
|
113
|
+
described_class.default_host = old_default
|
90
114
|
end
|
91
115
|
|
92
|
-
it
|
93
|
-
expect {
|
116
|
+
it 'should raise if not a valid URL' do
|
117
|
+
expect { described_class.default_host = 'www.example.com' }.to raise_error(ArgumentError, /Capybara\.default_host should be set to a url/)
|
94
118
|
end
|
95
119
|
|
96
|
-
it
|
97
|
-
expect {
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
RSpec.describe Capybara::Session do
|
103
|
-
context 'with nonexistent driver' do
|
104
|
-
it "should raise an error" do
|
105
|
-
expect do
|
106
|
-
Capybara::Session.new(:quox, TestApp).driver
|
107
|
-
end.to raise_error(Capybara::DriverNotFoundError)
|
120
|
+
it 'should not warn if a valid URL' do
|
121
|
+
expect { described_class.default_host = 'http://www.example.com' }.not_to raise_error
|
108
122
|
end
|
109
123
|
end
|
110
124
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Capybara::Server::Middleware::Counter do
|
6
|
+
let(:counter) { described_class.new }
|
7
|
+
let(:uri) { '/example' }
|
8
|
+
|
9
|
+
describe '#increment' do
|
10
|
+
it 'successfully' do
|
11
|
+
counter.increment(uri)
|
12
|
+
expect(counter).to be_positive
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#decrement' do
|
17
|
+
before do
|
18
|
+
counter.increment(uri)
|
19
|
+
end
|
20
|
+
|
21
|
+
context 'successfully' do
|
22
|
+
it 'with same uri' do
|
23
|
+
expect(counter).to be_positive
|
24
|
+
counter.decrement(uri)
|
25
|
+
expect(counter).not_to be_positive
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'with changed uri' do
|
29
|
+
expect(counter).to be_positive
|
30
|
+
counter.decrement('/')
|
31
|
+
expect(counter).not_to be_positive
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
# rubocop:disable RSpec/InstanceVariable
|
6
|
+
RSpec.describe Capybara::Selector::CSSBuilder do
|
7
|
+
let :builder do
|
8
|
+
described_class.new(@css)
|
9
|
+
end
|
10
|
+
|
11
|
+
context 'add_attribute_conditions' do
|
12
|
+
it 'adds a single string condition to a single selector' do
|
13
|
+
@css = 'div'
|
14
|
+
selector = builder.add_attribute_conditions(random: 'abc')
|
15
|
+
expect(selector).to eq %(div[random='abc'])
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'adds multiple string conditions to a single selector' do
|
19
|
+
@css = 'div'
|
20
|
+
selector = builder.add_attribute_conditions(random: 'abc', other: 'def')
|
21
|
+
expect(selector).to eq %(div[random='abc'][other='def'])
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'adds a single string condition to a multiple selector' do
|
25
|
+
@css = 'div, ul'
|
26
|
+
selector = builder.add_attribute_conditions(random: 'abc')
|
27
|
+
expect(selector).to eq %(div[random='abc'], ul[random='abc'])
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'adds multiple string conditions to a multiple selector' do
|
31
|
+
@css = 'div, ul'
|
32
|
+
selector = builder.add_attribute_conditions(random: 'abc', other: 'def')
|
33
|
+
expect(selector).to eq %(div[random='abc'][other='def'], ul[random='abc'][other='def'])
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'adds simple regexp conditions to a single selector' do
|
37
|
+
@css = 'div'
|
38
|
+
selector = builder.add_attribute_conditions(random: /abc/, other: /def/)
|
39
|
+
expect(selector).to eq %(div[random*='abc'][other*='def'])
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'adds wildcard regexp conditions to a single selector' do
|
43
|
+
@css = 'div'
|
44
|
+
selector = builder.add_attribute_conditions(random: /abc.*def/, other: /def.*ghi/)
|
45
|
+
expect(selector).to eq %(div[random*='abc'][random*='def'][other*='def'][other*='ghi'])
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'adds alternated regexp conditions to a single selector' do
|
49
|
+
@css = 'div'
|
50
|
+
selector = builder.add_attribute_conditions(random: /abc|def/, other: /def|ghi/)
|
51
|
+
expect(selector).to eq %(div[random*='abc'][other*='def'], div[random*='abc'][other*='ghi'], div[random*='def'][other*='def'], div[random*='def'][other*='ghi'])
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'adds alternated regexp conditions to a multiple selector' do
|
55
|
+
@css = 'div,ul'
|
56
|
+
selector = builder.add_attribute_conditions(other: /def.*ghi|jkl/)
|
57
|
+
expect(selector).to eq %(div[other*='def'][other*='ghi'], div[other*='jkl'], ul[other*='def'][other*='ghi'], ul[other*='jkl'])
|
58
|
+
end
|
59
|
+
|
60
|
+
it "returns original selector when regexp can't be substringed" do
|
61
|
+
@css = 'div'
|
62
|
+
selector = builder.add_attribute_conditions(other: /.+/)
|
63
|
+
expect(selector).to eq 'div'
|
64
|
+
end
|
65
|
+
|
66
|
+
context ':class' do
|
67
|
+
it 'handles string with CSS .' do
|
68
|
+
@css = 'a'
|
69
|
+
selector = builder.add_attribute_conditions(class: 'my_class')
|
70
|
+
expect(selector).to eq 'a.my_class'
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'handles negated string with CSS .' do
|
74
|
+
@css = 'a'
|
75
|
+
selector = builder.add_attribute_conditions(class: '!my_class')
|
76
|
+
expect(selector).to eq 'a:not(.my_class)'
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'handles array of string with CSS .' do
|
80
|
+
@css = 'a'
|
81
|
+
selector = builder.add_attribute_conditions(class: %w[my_class my_other_class])
|
82
|
+
expect(selector).to eq 'a.my_class.my_other_class'
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'handles array of string with CSS . when negated included' do
|
86
|
+
@css = 'a'
|
87
|
+
selector = builder.add_attribute_conditions(class: %w[my_class !my_other_class])
|
88
|
+
expect(selector).to eq 'a.my_class:not(.my_other_class)'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context ':id' do
|
93
|
+
it 'handles string with CSS #' do
|
94
|
+
@css = 'ul'
|
95
|
+
selector = builder.add_attribute_conditions(id: 'my_id')
|
96
|
+
expect(selector).to eq 'ul#my_id'
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
# rubocop:enable RSpec/InstanceVariable
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
RSpec.describe Capybara::Selector::CSS::Splitter do
|
6
|
+
let :splitter do
|
7
|
+
described_class.new
|
8
|
+
end
|
9
|
+
|
10
|
+
context 'split not needed' do
|
11
|
+
it 'normal CSS selector' do
|
12
|
+
css = 'div[id="abc"]'
|
13
|
+
expect(splitter.split(css)).to eq [css]
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'comma in strings' do
|
17
|
+
css = 'div[id="a,bc"]'
|
18
|
+
expect(splitter.split(css)).to eq [css]
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'comma in pseudo-selector' do
|
22
|
+
css = 'div.class1:not(.class1, .class2)'
|
23
|
+
expect(splitter.split(css)).to eq [css]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'split needed' do
|
28
|
+
it 'root level comma' do
|
29
|
+
css = 'div.class1, span, p.class2'
|
30
|
+
expect(splitter.split(css)).to eq ['div.class1', 'span', 'p.class2']
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'root level comma when quotes and pseudo selectors' do
|
34
|
+
css = 'div.class1[id="abc\\"def,ghi"]:not(.class3, .class4), span[id=\'a"c\\\'de\'], section, #abc\\,def'
|
35
|
+
expect(splitter.split(css)).to eq ['div.class1[id="abc\\"def,ghi"]:not(.class3, .class4)', 'span[id=\'a"c\\\'de\']', 'section', '#abc\\,def']
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|