capybara 2.18.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 +945 -12
- data/License.txt +1 -1
- data/README.md +264 -90
- data/lib/capybara/config.rb +29 -57
- data/lib/capybara/cucumber.rb +2 -3
- data/lib/capybara/driver/base.rb +35 -18
- data/lib/capybara/driver/node.rb +40 -10
- data/lib/capybara/dsl.rb +10 -7
- data/lib/capybara/helpers.rb +70 -31
- data/lib/capybara/minitest/spec.rb +185 -83
- data/lib/capybara/minitest.rb +232 -112
- data/lib/capybara/node/actions.rb +274 -171
- data/lib/capybara/node/base.rb +42 -34
- data/lib/capybara/node/document.rb +15 -3
- data/lib/capybara/node/document_matchers.rb +19 -21
- data/lib/capybara/node/element.rb +362 -135
- data/lib/capybara/node/finders.rb +151 -137
- data/lib/capybara/node/matchers.rb +394 -209
- data/lib/capybara/node/simple.rb +59 -26
- 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 +12 -9
- data/lib/capybara/queries/base_query.rb +39 -28
- data/lib/capybara/queries/current_path_query.rb +21 -27
- data/lib/capybara/queries/match_query.rb +14 -7
- data/lib/capybara/queries/selector_query.rb +659 -149
- data/lib/capybara/queries/sibling_query.rb +11 -9
- data/lib/capybara/queries/style_query.rb +45 -0
- data/lib/capybara/queries/text_query.rb +56 -38
- data/lib/capybara/queries/title_query.rb +8 -11
- data/lib/capybara/rack_test/browser.rb +114 -42
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +22 -17
- data/lib/capybara/rack_test/errors.rb +6 -0
- data/lib/capybara/rack_test/form.rb +93 -58
- data/lib/capybara/rack_test/node.rb +184 -81
- data/lib/capybara/rails.rb +3 -7
- 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 +97 -63
- data/lib/capybara/rspec/features.rb +17 -50
- data/lib/capybara/rspec/matcher_proxies.rb +52 -15
- 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 +146 -310
- data/lib/capybara/rspec.rb +7 -11
- 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 -13
- 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 +2 -17
- data/lib/capybara/selector/filter_set.rb +80 -33
- data/lib/capybara/selector/filters/base.rb +50 -6
- data/lib/capybara/selector/filters/expression_filter.rb +8 -26
- data/lib/capybara/selector/filters/locator_filter.rb +29 -0
- data/lib/capybara/selector/filters/node_filter.rb +16 -12
- data/lib/capybara/selector/regexp_disassembler.rb +211 -0
- data/lib/capybara/selector/selector.rb +93 -210
- data/lib/capybara/selector/xpath_extensions.rb +17 -0
- data/lib/capybara/selector.rb +475 -523
- 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 +298 -267
- 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 +517 -145
- 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 +59 -67
- data/lib/capybara/session/config.rb +81 -67
- data/lib/capybara/session/matchers.rb +28 -20
- data/lib/capybara/session.rb +337 -365
- 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 +151 -12
- data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
- data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
- data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
- data/lib/capybara/spec/session/active_element_spec.rb +31 -0
- data/lib/capybara/spec/session/all_spec.rb +161 -57
- data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
- 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.rb → assert_title_spec.rb} +22 -12
- data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
- data/lib/capybara/spec/session/body_spec.rb +12 -13
- data/lib/capybara/spec/session/check_spec.rb +117 -55
- data/lib/capybara/spec/session/choose_spec.rb +64 -31
- data/lib/capybara/spec/session/click_button_spec.rb +231 -173
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
- data/lib/capybara/spec/session/click_link_spec.rb +93 -58
- data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
- data/lib/capybara/spec/session/current_url_spec.rb +57 -39
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -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 +9 -7
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
- data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
- data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
- data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
- data/lib/capybara/spec/session/find_button_spec.rb +25 -24
- data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
- data/lib/capybara/spec/session/find_field_spec.rb +37 -41
- data/lib/capybara/spec/session/find_link_spec.rb +46 -17
- data/lib/capybara/spec/session/find_spec.rb +260 -145
- data/lib/capybara/spec/session/first_spec.rb +80 -52
- 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 +33 -20
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
- data/lib/capybara/spec/session/go_back_spec.rb +2 -1
- data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
- 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 +100 -13
- data/lib/capybara/spec/session/has_css_spec.rb +272 -137
- data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
- data/lib/capybara/spec/session/has_element_spec.rb +47 -0
- data/lib/capybara/spec/session/has_field_spec.rb +139 -59
- data/lib/capybara/spec/session/has_link_spec.rb +47 -6
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
- data/lib/capybara/spec/session/has_select_spec.rb +107 -72
- data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
- data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
- data/lib/capybara/spec/session/has_table_spec.rb +183 -5
- data/lib/capybara/spec/session/has_text_spec.rb +106 -62
- data/lib/capybara/spec/session/has_title_spec.rb +20 -14
- data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
- 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 +37 -0
- data/lib/capybara/spec/session/node_spec.rb +1024 -153
- data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
- data/lib/capybara/spec/session/refresh_spec.rb +12 -6
- data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
- 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 +8 -12
- 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 +119 -0
- data/lib/capybara/spec/session/select_spec.rb +107 -81
- data/lib/capybara/spec/session/selectors_spec.rb +52 -19
- data/lib/capybara/spec/session/sibling_spec.rb +10 -10
- data/lib/capybara/spec/session/text_spec.rb +37 -21
- data/lib/capybara/spec/session/title_spec.rb +17 -5
- data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
- data/lib/capybara/spec/session/unselect_spec.rb +39 -38
- data/lib/capybara/spec/session/visit_spec.rb +85 -53
- data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
- 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 +27 -22
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
- data/lib/capybara/spec/session/window/window_spec.rb +97 -63
- data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
- data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
- data/lib/capybara/spec/session/within_spec.rb +83 -44
- data/lib/capybara/spec/spec_helper.rb +54 -44
- data/lib/capybara/spec/test_app.rb +158 -43
- data/lib/capybara/spec/views/animated.erb +49 -0
- data/lib/capybara/spec/views/form.erb +163 -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 +69 -12
- 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 +5 -2
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +36 -34
- data/lib/capybara.rb +134 -107
- data/spec/basic_node_spec.rb +60 -34
- data/spec/capybara_spec.rb +63 -88
- 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 +85 -64
- data/spec/filter_set_spec.rb +27 -9
- data/spec/fixtures/certificate.pem +25 -0
- data/spec/fixtures/key.pem +27 -0
- data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
- data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
- data/spec/minitest_spec.rb +52 -7
- data/spec/minitest_spec_spec.rb +94 -63
- data/spec/per_session_config_spec.rb +14 -13
- data/spec/rack_test_spec.rb +194 -125
- data/spec/regexp_dissassembler_spec.rb +250 -0
- data/spec/result_spec.rb +111 -50
- data/spec/rspec/features_spec.rb +37 -31
- data/spec/rspec/scenarios_spec.rb +10 -8
- data/spec/rspec/shared_spec_matchers.rb +473 -422
- data/spec/rspec/views_spec.rb +5 -3
- data/spec/rspec_matchers_spec.rb +52 -11
- data/spec/rspec_spec.rb +109 -89
- data/spec/sauce_spec_chrome.rb +43 -0
- data/spec/selector_spec.rb +397 -68
- data/spec/selenium_spec_chrome.rb +187 -40
- data/spec/selenium_spec_chrome_remote.rb +96 -0
- data/spec/selenium_spec_edge.rb +60 -0
- data/spec/selenium_spec_firefox.rb +201 -41
- data/spec/selenium_spec_firefox_remote.rb +94 -0
- data/spec/selenium_spec_ie.rb +149 -0
- data/spec/selenium_spec_safari.rb +162 -0
- data/spec/server_spec.rb +213 -102
- data/spec/session_spec.rb +53 -16
- data/spec/shared_selenium_node.rb +79 -0
- data/spec/shared_selenium_session.rb +473 -122
- data/spec/spec_helper.rb +126 -7
- data/spec/whitespace_normalizer_spec.rb +54 -0
- data/spec/xpath_builder_spec.rb +93 -0
- metadata +355 -73
- 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/query.rb +0 -7
- data/lib/capybara/rspec/compound.rb +0 -95
- data/lib/capybara/spec/session/assert_current_path.rb +0 -72
- data/lib/capybara/spec/session/assert_selector.rb +0 -148
- data/lib/capybara/spec/session/assert_text.rb +0 -234
- 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 -127
|
@@ -1,169 +1,203 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# NOTE: This file uses `sleep` to sync up parts of the tests. This is only implemented like this
|
|
4
|
+
# because of the methods being tested. In tests using Capybara this type of behavior should be implemented
|
|
5
|
+
# using Capybara provided assertions with builtin waiting behavior.
|
|
6
|
+
|
|
2
7
|
Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
|
|
3
|
-
|
|
4
|
-
|
|
8
|
+
let!(:orig_window) { @session.current_window }
|
|
9
|
+
before do
|
|
5
10
|
@session.visit('/with_windows')
|
|
6
11
|
end
|
|
7
|
-
|
|
8
|
-
|
|
12
|
+
|
|
13
|
+
after do
|
|
14
|
+
(@session.windows - [orig_window]).each do |w|
|
|
9
15
|
@session.switch_to_window w
|
|
10
16
|
w.close
|
|
11
17
|
end
|
|
12
|
-
@session.switch_to_window(
|
|
18
|
+
@session.switch_to_window(orig_window)
|
|
13
19
|
end
|
|
14
20
|
|
|
15
21
|
describe '#exists?' do
|
|
16
|
-
|
|
17
|
-
|
|
22
|
+
it 'should become false after window was closed' do
|
|
23
|
+
other_window = @session.window_opened_by do
|
|
18
24
|
@session.find(:css, '#openWindow').click
|
|
19
25
|
end
|
|
20
|
-
end
|
|
21
26
|
|
|
22
|
-
it "should become false after window was closed" do
|
|
23
27
|
expect do
|
|
24
|
-
@session.switch_to_window
|
|
25
|
-
|
|
26
|
-
end.to change
|
|
28
|
+
@session.switch_to_window other_window
|
|
29
|
+
other_window.close
|
|
30
|
+
end.to change(other_window, :exists?).from(true).to(false)
|
|
27
31
|
end
|
|
28
32
|
end
|
|
29
33
|
|
|
30
34
|
describe '#closed?' do
|
|
31
|
-
it
|
|
32
|
-
|
|
35
|
+
it 'should become true after window was closed' do
|
|
36
|
+
other_window = @session.window_opened_by do
|
|
33
37
|
@session.find(:css, '#openWindow').click
|
|
34
38
|
end
|
|
35
39
|
expect do
|
|
36
|
-
@session.switch_to_window
|
|
37
|
-
|
|
38
|
-
end.to change {
|
|
40
|
+
@session.switch_to_window other_window
|
|
41
|
+
other_window.close
|
|
42
|
+
end.to change { other_window.closed? }.from(false).to(true)
|
|
39
43
|
end
|
|
40
44
|
end
|
|
41
45
|
|
|
42
46
|
describe '#current?' do
|
|
43
|
-
|
|
44
|
-
@
|
|
47
|
+
let(:other_window) do
|
|
48
|
+
@session.window_opened_by do
|
|
45
49
|
@session.find(:css, '#openWindow').click
|
|
46
50
|
end
|
|
47
51
|
end
|
|
48
52
|
|
|
49
53
|
it 'should become true after switching to window' do
|
|
50
54
|
expect do
|
|
51
|
-
@session.switch_to_window(
|
|
52
|
-
end.to change
|
|
55
|
+
@session.switch_to_window(other_window)
|
|
56
|
+
end.to change(other_window, :current?).from(false).to(true)
|
|
53
57
|
end
|
|
54
58
|
|
|
55
59
|
it 'should return false if window is closed' do
|
|
56
|
-
@session.switch_to_window(
|
|
57
|
-
|
|
58
|
-
expect(
|
|
60
|
+
@session.switch_to_window(other_window)
|
|
61
|
+
other_window.close
|
|
62
|
+
expect(other_window.current?).to be(false)
|
|
59
63
|
end
|
|
60
64
|
end
|
|
61
65
|
|
|
62
66
|
describe '#close' do
|
|
63
|
-
|
|
64
|
-
@
|
|
67
|
+
let!(:other_window) do
|
|
68
|
+
@session.window_opened_by do
|
|
65
69
|
@session.find(:css, '#openWindow').click
|
|
66
70
|
end
|
|
67
71
|
end
|
|
68
72
|
|
|
69
73
|
it 'should switch to original window if invoked not for current window' do
|
|
70
74
|
expect(@session.windows.size).to eq(2)
|
|
71
|
-
expect(@session.current_window).to eq(
|
|
72
|
-
|
|
75
|
+
expect(@session.current_window).to eq(orig_window)
|
|
76
|
+
other_window.close
|
|
73
77
|
expect(@session.windows.size).to eq(1)
|
|
74
|
-
expect(@session.current_window).to eq(
|
|
78
|
+
expect(@session.current_window).to eq(orig_window)
|
|
75
79
|
end
|
|
76
80
|
|
|
77
81
|
it 'should make subsequent invocations of other methods raise no_such_window_error if invoked for current window' do
|
|
78
|
-
@session.switch_to_window(
|
|
79
|
-
expect(@session.current_window).to eq(
|
|
80
|
-
|
|
82
|
+
@session.switch_to_window(other_window)
|
|
83
|
+
expect(@session.current_window).to eq(other_window)
|
|
84
|
+
other_window.close
|
|
81
85
|
expect do
|
|
82
86
|
@session.find(:css, '#some_id')
|
|
83
87
|
end.to raise_error(@session.driver.no_such_window_error)
|
|
84
|
-
@session.switch_to_window(
|
|
88
|
+
@session.switch_to_window(orig_window)
|
|
85
89
|
end
|
|
86
90
|
end
|
|
87
91
|
|
|
88
92
|
describe '#size' do
|
|
89
93
|
def win_size
|
|
90
|
-
@session.evaluate_script(
|
|
94
|
+
@session.evaluate_script('[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]')
|
|
91
95
|
end
|
|
92
96
|
|
|
93
|
-
it 'should return size of whole window', requires: [
|
|
97
|
+
it 'should return size of whole window', requires: %i[windows js] do
|
|
94
98
|
expect(@session.current_window.size).to eq win_size
|
|
95
99
|
end
|
|
96
100
|
|
|
97
101
|
it 'should switch to original window if invoked not for current window' do
|
|
98
|
-
|
|
102
|
+
other_window = @session.window_opened_by do
|
|
99
103
|
@session.find(:css, '#openWindow').click
|
|
100
104
|
end
|
|
101
105
|
sleep 1
|
|
102
|
-
size = @session.within_window(
|
|
106
|
+
size = @session.within_window(other_window) do
|
|
103
107
|
win_size
|
|
104
108
|
end
|
|
105
|
-
expect(
|
|
106
|
-
expect(@session.current_window).to eq(
|
|
109
|
+
expect(other_window.size).to eq(size)
|
|
110
|
+
expect(@session.current_window).to eq(orig_window)
|
|
107
111
|
end
|
|
108
112
|
end
|
|
109
113
|
|
|
110
114
|
describe '#resize_to' do
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
115
|
+
let!(:initial_size) { @session.current_window.size }
|
|
116
|
+
|
|
117
|
+
after do
|
|
118
|
+
@session.current_window.resize_to(*initial_size)
|
|
114
119
|
sleep 1
|
|
115
|
-
expect(@session.current_window.size).to eq([width-100, height-100])
|
|
116
120
|
end
|
|
117
121
|
|
|
118
|
-
it 'should
|
|
122
|
+
it 'should be able to resize window', requires: %i[windows js] do
|
|
123
|
+
width, height = initial_size
|
|
124
|
+
@session.current_window.resize_to(width - 100, height - 100)
|
|
125
|
+
sleep 1
|
|
126
|
+
expect(@session.current_window.size).to eq([width - 100, height - 100])
|
|
127
|
+
end
|
|
119
128
|
|
|
120
|
-
|
|
129
|
+
it 'should stay on current window if invoked not for current window', requires: %i[windows js] do
|
|
130
|
+
other_window = @session.window_opened_by do
|
|
121
131
|
@session.find(:css, '#openWindow').click
|
|
122
132
|
end
|
|
123
|
-
@other_window.resize_to(400, 300)
|
|
124
|
-
expect(@session.current_window).to eq(@window)
|
|
125
133
|
|
|
126
|
-
|
|
127
|
-
@session.
|
|
128
|
-
|
|
129
|
-
|
|
134
|
+
other_window.resize_to(600, 400)
|
|
135
|
+
expect(@session.current_window).to eq(orig_window)
|
|
136
|
+
|
|
137
|
+
@session.within_window(other_window) do
|
|
138
|
+
expect(@session.current_window.size).to eq([600, 400])
|
|
130
139
|
end
|
|
131
140
|
end
|
|
132
141
|
end
|
|
133
142
|
|
|
134
143
|
describe '#maximize' do
|
|
135
|
-
|
|
144
|
+
let! :initial_size do
|
|
145
|
+
@session.current_window.size
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
after do
|
|
149
|
+
@session.current_window.resize_to(*initial_size)
|
|
150
|
+
sleep 0.5
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it 'should be able to maximize window', requires: %i[windows js] do
|
|
136
154
|
start_width, start_height = 400, 300
|
|
137
155
|
@session.current_window.resize_to(start_width, start_height)
|
|
138
156
|
sleep 0.5
|
|
139
157
|
|
|
140
158
|
@session.current_window.maximize
|
|
141
|
-
sleep 0.5
|
|
159
|
+
sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
|
|
142
160
|
|
|
143
161
|
max_width, max_height = @session.current_window.size
|
|
144
162
|
|
|
145
|
-
#maximize behavior is window manage dependant, so just make sure it increases in size
|
|
163
|
+
# maximize behavior is window manage dependant, so just make sure it increases in size
|
|
146
164
|
expect(max_width).to be > start_width
|
|
147
165
|
expect(max_height).to be > start_height
|
|
148
166
|
end
|
|
149
167
|
|
|
150
|
-
it 'should stay on current window if invoked not for current window', requires: [
|
|
151
|
-
|
|
152
|
-
@other_window = @session.window_opened_by do
|
|
168
|
+
it 'should stay on current window if invoked not for current window', requires: %i[windows js] do
|
|
169
|
+
other_window = @session.window_opened_by do
|
|
153
170
|
@session.find(:css, '#openWindow').click
|
|
154
171
|
end
|
|
155
|
-
|
|
156
|
-
@other_window.resize_to(400,300)
|
|
172
|
+
other_window.resize_to(400, 300)
|
|
157
173
|
sleep 0.5
|
|
158
|
-
|
|
174
|
+
other_window.maximize
|
|
159
175
|
sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
|
|
160
176
|
|
|
161
|
-
expect(@session.current_window).to eq(
|
|
162
|
-
|
|
177
|
+
expect(@session.current_window).to eq(orig_window)
|
|
178
|
+
# Maximizing the browser affects all tabs so this may not be valid in real browsers
|
|
179
|
+
# expect(@session.current_window.size).to eq(initial_size)
|
|
163
180
|
|
|
164
|
-
ow_width, ow_height =
|
|
181
|
+
ow_width, ow_height = other_window.size
|
|
165
182
|
expect(ow_width).to be > 400
|
|
166
183
|
expect(ow_height).to be > 300
|
|
167
184
|
end
|
|
168
185
|
end
|
|
186
|
+
|
|
187
|
+
describe '#fullscreen' do
|
|
188
|
+
let! :initial_size do
|
|
189
|
+
@session.current_window.size
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
after do
|
|
193
|
+
@session.current_window.resize_to(*initial_size)
|
|
194
|
+
sleep 1
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
it 'should be able to fullscreen the window' do
|
|
198
|
+
expect do
|
|
199
|
+
@session.current_window.fullscreen
|
|
200
|
+
end.not_to raise_error
|
|
201
|
+
end
|
|
202
|
+
end
|
|
169
203
|
end
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# NOTE: This file uses `sleep` to sync up parts of the tests. This is only implemented like this
|
|
4
|
+
# because of the methods being tested. In tests using Capybara this type of behavior should be implemented
|
|
5
|
+
# using Capybara provided assertions with builtin waiting behavior.
|
|
6
|
+
|
|
2
7
|
Capybara::SpecHelper.spec '#windows', requires: [:windows] do
|
|
3
|
-
before
|
|
8
|
+
before do
|
|
4
9
|
@window = @session.current_window
|
|
5
10
|
@session.visit('/with_windows')
|
|
6
11
|
@session.find(:css, '#openTwoWindows').click
|
|
@@ -9,11 +14,9 @@ Capybara::SpecHelper.spec '#windows', requires: [:windows] do
|
|
|
9
14
|
raise Capybara::CapybaraError if @session.windows.size != 3
|
|
10
15
|
end
|
|
11
16
|
end
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
w.close
|
|
16
|
-
end
|
|
17
|
+
|
|
18
|
+
after do
|
|
19
|
+
(@session.windows - [@window]).each(&:close)
|
|
17
20
|
@session.switch_to_window(@window)
|
|
18
21
|
end
|
|
19
22
|
|
|
@@ -21,12 +24,11 @@ Capybara::SpecHelper.spec '#windows', requires: [:windows] do
|
|
|
21
24
|
expect(@session.windows.map { |window| window.instance_of?(Capybara::Window) }).to eq([true] * 3)
|
|
22
25
|
end
|
|
23
26
|
|
|
24
|
-
it 'should
|
|
27
|
+
it 'should be able to switch to windows' do
|
|
28
|
+
sleep 1 # give windows enough time to fully load
|
|
25
29
|
titles = @session.windows.map do |window|
|
|
26
30
|
@session.within_window(window) { @session.title }
|
|
27
31
|
end
|
|
28
|
-
expect(titles).to match_array([
|
|
29
|
-
'With Windows', 'Title of the first popup', 'Title of popup two'
|
|
30
|
-
])
|
|
32
|
+
expect(titles).to match_array(['With Windows', 'Title of the first popup', 'Title of popup two']) # rubocop:disable RSpec/MatchArray
|
|
31
33
|
end
|
|
32
34
|
end
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
|
|
3
|
-
before
|
|
4
|
+
before do
|
|
4
5
|
@window = @session.current_window
|
|
5
6
|
@session.visit('/with_windows')
|
|
6
7
|
@session.find(:css, '#openTwoWindows').click
|
|
@@ -9,7 +10,8 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
|
|
|
9
10
|
raise Capybara::CapybaraError if @session.windows.size != 3
|
|
10
11
|
end
|
|
11
12
|
end
|
|
12
|
-
|
|
13
|
+
|
|
14
|
+
after do
|
|
13
15
|
(@session.windows - [@window]).each do |w|
|
|
14
16
|
@session.switch_to_window w
|
|
15
17
|
w.close
|
|
@@ -17,33 +19,32 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
|
|
|
17
19
|
@session.switch_to_window(@window)
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
context
|
|
21
|
-
it
|
|
22
|
-
|
|
23
|
-
expect(@session.driver).to receive(:switch_to_window).exactly(3).times.and_call_original
|
|
22
|
+
context 'with an instance of Capybara::Window' do
|
|
23
|
+
it 'should not invoke driver#switch_to_window when given current window' do
|
|
24
|
+
allow(@session.driver).to receive(:switch_to_window).and_call_original
|
|
24
25
|
@session.within_window @window do
|
|
25
26
|
expect(@session.title).to eq('With Windows')
|
|
26
27
|
end
|
|
28
|
+
expect(@session.driver).not_to have_received(:switch_to_window)
|
|
27
29
|
end
|
|
28
30
|
|
|
29
|
-
it
|
|
31
|
+
it 'should be able to switch to another window' do
|
|
30
32
|
window = (@session.windows - [@window]).first
|
|
31
|
-
expect(@session.driver).to receive(:switch_to_window).exactly(5).times.and_call_original
|
|
32
33
|
@session.within_window window do
|
|
33
34
|
expect(@session).to have_title(/Title of the first popup|Title of popup two/)
|
|
34
35
|
end
|
|
35
36
|
expect(@session.title).to eq('With Windows')
|
|
36
37
|
end
|
|
37
38
|
|
|
38
|
-
it
|
|
39
|
+
it 'returns value from the block' do
|
|
39
40
|
window = (@session.windows - [@window]).first
|
|
40
41
|
value = @session.within_window window do
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
43252003274489856000
|
|
43
|
+
end
|
|
43
44
|
expect(value).to eq(43252003274489856000)
|
|
44
45
|
end
|
|
45
46
|
|
|
46
|
-
it
|
|
47
|
+
it 'should switch back if exception was raised inside block' do
|
|
47
48
|
window = (@session.windows - [@window]).first
|
|
48
49
|
expect do
|
|
49
50
|
@session.within_window(window) do
|
|
@@ -57,7 +58,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
|
|
|
57
58
|
expect(@session.send(:scopes)).to eq([nil])
|
|
58
59
|
end
|
|
59
60
|
|
|
60
|
-
it
|
|
61
|
+
it 'should leave correct scopes after execution in case of error', requires: %i[windows frames] do
|
|
61
62
|
window = (@session.windows - [@window]).first
|
|
62
63
|
expect do
|
|
63
64
|
@session.within_frame 'frameOne' do
|
|
@@ -85,27 +86,27 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
|
|
|
85
86
|
end
|
|
86
87
|
end
|
|
87
88
|
|
|
88
|
-
context
|
|
89
|
-
it
|
|
90
|
-
@session.within_window(->{ @session.title == 'Title of the first popup'}) do
|
|
89
|
+
context 'with lambda' do
|
|
90
|
+
it 'should find the div in another window' do
|
|
91
|
+
@session.within_window(-> { @session.title == 'Title of the first popup' }) do
|
|
91
92
|
expect(@session).to have_css('#divInPopupOne')
|
|
92
93
|
end
|
|
93
94
|
end
|
|
94
95
|
|
|
95
|
-
it
|
|
96
|
-
@session.within_window(->{ @session.title == 'Title of popup two'}) do
|
|
96
|
+
it 'should find divs in both windows' do
|
|
97
|
+
@session.within_window(-> { @session.title == 'Title of popup two' }) do
|
|
97
98
|
expect(@session).to have_css('#divInPopupTwo')
|
|
98
99
|
end
|
|
99
|
-
@session.within_window(->{ @session.title == 'Title of the first popup'}) do
|
|
100
|
+
@session.within_window(-> { @session.title == 'Title of the first popup' }) do
|
|
100
101
|
expect(@session).to have_css('#divInPopupOne')
|
|
101
102
|
end
|
|
102
103
|
expect(@session.title).to eq('With Windows')
|
|
103
104
|
end
|
|
104
105
|
|
|
105
|
-
it
|
|
106
|
-
@session.within_window(->{ @session.title == 'Title of popup two'}) do
|
|
106
|
+
it 'should be able to nest within_window' do
|
|
107
|
+
@session.within_window(-> { @session.title == 'Title of popup two' }) do
|
|
107
108
|
expect(@session).to have_css('#divInPopupTwo')
|
|
108
|
-
@session.within_window(->{ @session.title == 'Title of the first popup'}) do
|
|
109
|
+
@session.within_window(-> { @session.title == 'Title of the first popup' }) do
|
|
109
110
|
expect(@session).to have_css('#divInPopupOne')
|
|
110
111
|
end
|
|
111
112
|
expect(@session).to have_css('#divInPopupTwo')
|
|
@@ -116,10 +117,10 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
|
|
|
116
117
|
expect(@session.title).to eq('With Windows')
|
|
117
118
|
end
|
|
118
119
|
|
|
119
|
-
it
|
|
120
|
+
it 'should work inside a normal scope' do
|
|
120
121
|
expect(@session).to have_css('#openWindow')
|
|
121
122
|
@session.within(:css, '#scope') do
|
|
122
|
-
@session.within_window(->{ @session.title == 'Title of the first popup'}) do
|
|
123
|
+
@session.within_window(-> { @session.title == 'Title of the first popup' }) do
|
|
123
124
|
expect(@session).to have_css('#divInPopupOne')
|
|
124
125
|
end
|
|
125
126
|
expect(@session).to have_content('My scoped content')
|
|
@@ -129,25 +130,23 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
|
|
|
129
130
|
|
|
130
131
|
it "should raise error if window wasn't found" do
|
|
131
132
|
expect do
|
|
132
|
-
@session.within_window(->{ @session.title == 'Invalid title'}) do
|
|
133
|
+
@session.within_window(-> { @session.title == 'Invalid title' }) do
|
|
133
134
|
expect(@session).to have_css('#divInPopupOne')
|
|
134
135
|
end
|
|
135
|
-
end.to raise_error(Capybara::WindowError,
|
|
136
|
+
end.to raise_error(Capybara::WindowError, 'Could not find a window matching block/lambda')
|
|
136
137
|
expect(@session.current_window).to eq(@window)
|
|
137
138
|
expect(@session).to have_css('#doesNotOpenWindows')
|
|
138
139
|
expect(@session.send(:scopes)).to eq([nil])
|
|
139
140
|
end
|
|
140
141
|
|
|
141
|
-
it
|
|
142
|
-
value = @session.within_window(->{ @session.title == 'Title of popup two'})
|
|
143
|
-
42
|
|
144
|
-
end
|
|
142
|
+
it 'returns value from the block' do
|
|
143
|
+
value = @session.within_window(-> { @session.title == 'Title of popup two' }) { 42 }
|
|
145
144
|
expect(value).to eq(42)
|
|
146
145
|
end
|
|
147
146
|
|
|
148
|
-
it
|
|
147
|
+
it 'should switch back if exception was raised inside block' do
|
|
149
148
|
expect do
|
|
150
|
-
@session.within_window(->{ @session.title == 'Title of popup two'}) do
|
|
149
|
+
@session.within_window(-> { @session.title == 'Title of popup two' }) do
|
|
151
150
|
raise 'some error'
|
|
152
151
|
end
|
|
153
152
|
end.to raise_error(StandardError, 'some error')
|
|
@@ -155,58 +154,4 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
|
|
|
155
154
|
expect(@session.send(:scopes)).to eq([nil])
|
|
156
155
|
end
|
|
157
156
|
end
|
|
158
|
-
|
|
159
|
-
context "with string" do
|
|
160
|
-
it "should warn" do
|
|
161
|
-
expect(@session).to receive(:warn).with(/DEPRECATION WARNING/).and_call_original
|
|
162
|
-
@session.within_window('firstPopup') {}
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
it "should find window by handle" do
|
|
166
|
-
window = (@session.windows - [@window]).first
|
|
167
|
-
@session.within_window window.handle do
|
|
168
|
-
expect(@session).to have_title(/Title of the first popup|Title of popup two/)
|
|
169
|
-
end
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
it "should find the div in firstPopup" do
|
|
173
|
-
@session.within_window("firstPopup") do
|
|
174
|
-
expect(@session.find("//*[@id='divInPopupOne']").text).to eq 'This is the text of divInPopupOne'
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
it "should find the div in secondPopup" do
|
|
178
|
-
@session.within_window("secondPopup") do
|
|
179
|
-
expect(@session.find("//*[@id='divInPopupTwo']").text).to eq 'This is the text of divInPopupTwo'
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
it "should find the divs in both popups" do
|
|
183
|
-
@session.within_window("secondPopup") do
|
|
184
|
-
expect(@session.find("//*[@id='divInPopupTwo']").text).to eq 'This is the text of divInPopupTwo'
|
|
185
|
-
end
|
|
186
|
-
@session.within_window("firstPopup") do
|
|
187
|
-
expect(@session.find("//*[@id='divInPopupOne']").text).to eq 'This is the text of divInPopupOne'
|
|
188
|
-
end
|
|
189
|
-
end
|
|
190
|
-
it "should find the div in the main window after finding a div in a popup" do
|
|
191
|
-
@session.within_window("secondPopup") do
|
|
192
|
-
expect(@session.find("//*[@id='divInPopupTwo']").text).to eq 'This is the text of divInPopupTwo'
|
|
193
|
-
end
|
|
194
|
-
expect(@session.find("//*[@id='doesNotOpenWindows']").text).to eq 'Does not open windows'
|
|
195
|
-
end
|
|
196
|
-
it "should reset scope when switching windows" do
|
|
197
|
-
@session.within(:css, '#doesNotOpenWindows') do
|
|
198
|
-
@session.within_window("secondPopup") do
|
|
199
|
-
expect(@session.find("//*[@id='divInPopupTwo']").text).to eq 'This is the text of divInPopupTwo'
|
|
200
|
-
end
|
|
201
|
-
end
|
|
202
|
-
end
|
|
203
|
-
it "should switch back if exception was raised inside block" do
|
|
204
|
-
expect do
|
|
205
|
-
@session.within_window('secondPopup') do
|
|
206
|
-
raise 'some error'
|
|
207
|
-
end
|
|
208
|
-
end.to raise_error(StandardError, 'some error')
|
|
209
|
-
expect(@session.current_window).to eq(@window)
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
157
|
end
|