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,68 +1,228 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
|
|
2
3
|
require 'spec_helper'
|
|
3
|
-
require
|
|
4
|
+
require 'selenium-webdriver'
|
|
4
5
|
require 'shared_selenium_session'
|
|
6
|
+
require 'shared_selenium_node'
|
|
5
7
|
require 'rspec/shared_spec_matchers'
|
|
6
8
|
|
|
9
|
+
Selenium::WebDriver.logger.ignore(:selenium_manager)
|
|
10
|
+
|
|
11
|
+
browser_options = Selenium::WebDriver::Firefox::Options.new
|
|
12
|
+
browser_options.add_argument '-headless' if ENV['HEADLESS']
|
|
13
|
+
# browser_options.add_option("log", {"level": "trace"})
|
|
14
|
+
|
|
15
|
+
browser_options.profile = Selenium::WebDriver::Firefox::Profile.new.tap do |profile|
|
|
16
|
+
profile['browser.download.dir'] = Capybara.save_path
|
|
17
|
+
profile['browser.download.folderList'] = 2
|
|
18
|
+
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/csv'
|
|
19
|
+
profile['browser.startup.homepage'] = 'about:blank' # workaround bug in Selenium 4 alpha4-7
|
|
20
|
+
profile['accessibility.tabfocus'] = 7 # make tab move over links too
|
|
21
|
+
end
|
|
22
|
+
|
|
7
23
|
Capybara.register_driver :selenium_firefox do |app|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
24
|
+
# ::Selenium::WebDriver.logger.level = "debug"
|
|
25
|
+
version = Capybara::Selenium::Driver.load_selenium
|
|
26
|
+
options_key = Capybara::Selenium::Driver::CAPS_VERSION.satisfied_by?(version) ? :capabilities : :options
|
|
27
|
+
driver_options = { browser: :firefox, timeout: 31 }.tap do |opts|
|
|
28
|
+
opts[options_key] = browser_options
|
|
29
|
+
# Get a trace level log from geckodriver
|
|
30
|
+
# :driver_opts => { args: ['-vv'] }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
Capybara::Selenium::Driver.new(app, **driver_options)
|
|
13
34
|
end
|
|
14
35
|
|
|
15
|
-
Capybara.register_driver :
|
|
16
|
-
Capybara::Selenium::Driver.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
)
|
|
36
|
+
Capybara.register_driver :selenium_firefox_not_clear_storage do |app|
|
|
37
|
+
version = Capybara::Selenium::Driver.load_selenium
|
|
38
|
+
options_key = Capybara::Selenium::Driver::CAPS_VERSION.satisfied_by?(version) ? :capabilities : :options
|
|
39
|
+
driver_options = { browser: :firefox, clear_local_storage: false, clear_session_storage: false }.tap do |opts|
|
|
40
|
+
opts[options_key] = browser_options
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
Capybara::Selenium::Driver.new(app, **driver_options)
|
|
23
44
|
end
|
|
24
45
|
|
|
25
46
|
module TestSessions
|
|
26
|
-
|
|
47
|
+
SeleniumFirefox = Capybara::Session.new(:selenium_firefox, TestApp)
|
|
27
48
|
end
|
|
28
49
|
|
|
29
|
-
skipped_tests = [
|
|
30
|
-
:response_headers,
|
|
31
|
-
:status_code,
|
|
32
|
-
:trigger
|
|
33
|
-
]
|
|
34
|
-
skipped_tests << :windows if ENV['TRAVIS'] && ENV['SKIP_WINDOW']
|
|
50
|
+
skipped_tests = %i[response_headers status_code trigger]
|
|
35
51
|
|
|
36
|
-
Capybara::SpecHelper.
|
|
52
|
+
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Firefox) if ENV['CI']
|
|
37
53
|
|
|
38
|
-
|
|
54
|
+
Capybara::SpecHelper.run_specs TestSessions::SeleniumFirefox, 'selenium', capybara_skip: skipped_tests do |example|
|
|
55
|
+
case example.metadata[:full_description]
|
|
56
|
+
when 'Capybara::Session selenium node #click should allow multiple modifiers'
|
|
57
|
+
pending "Firefox on OSX doesn't generate an event for shift+control+click" if firefox_gte?(62, @session) && Selenium::WebDriver::Platform.mac?
|
|
58
|
+
when /^Capybara::Session selenium node #double_click/
|
|
59
|
+
pending "selenium-webdriver/geckodriver doesn't generate double click event" if firefox_lt?(59, @session)
|
|
60
|
+
when 'Capybara::Session selenium #accept_prompt should accept the prompt with a blank response when there is a default'
|
|
61
|
+
pending "Geckodriver doesn't set a blank response in FF < 63 - https://bugzilla.mozilla.org/show_bug.cgi?id=1486485" if firefox_lt?(63, @session)
|
|
62
|
+
when 'Capybara::Session selenium #attach_file with multipart form should fire change once when uploading multiple files from empty'
|
|
63
|
+
pending "FF < 62 doesn't support setting all files at once" if firefox_lt?(62, @session)
|
|
64
|
+
when 'Capybara::Session selenium #accept_confirm should work with nested modals'
|
|
65
|
+
skip 'Broken in 63 <= FF < 69 - https://bugzilla.mozilla.org/show_bug.cgi?id=1487358' if firefox_gte?(63, @session) && firefox_lt?(69, @session)
|
|
66
|
+
skip 'Hangs in 69 <= FF < 71 - Dont know what issue for this - previous issue was closed as fixed but it is not' if firefox_gte?(69, @session) && firefox_lt?(71, @session)
|
|
67
|
+
skip 'Broken again intermittently in FF 71 - jus skip it' if firefox_lt?(109, @session) # don't really know when it was fixed
|
|
68
|
+
when 'Capybara::Session selenium #click_link can download a file'
|
|
69
|
+
skip 'Need to figure out testing of file downloading on windows platform' if Gem.win_platform?
|
|
70
|
+
when 'Capybara::Session selenium #reset_session! removes ALL cookies'
|
|
71
|
+
pending "Geckodriver doesn't provide a way to remove cookies outside the current domain"
|
|
72
|
+
when /drag_to.*HTML5/
|
|
73
|
+
pending "Firefox < 62 doesn't support a DataTransfer constructor" if firefox_lt?(62.0, @session)
|
|
74
|
+
when 'Capybara::Session selenium #accept_alert should handle the alert if the page changes',
|
|
75
|
+
'Capybara::Session selenium #accept_alert with an asynchronous alert should accept the alert'
|
|
76
|
+
skip 'No clue what Firefox is doing here - works fine on MacOS locally' if firefox_lt?(109, @session) # don't really know when it was fixed
|
|
77
|
+
when 'Capybara::Session selenium node #shadow_root should find elements inside the shadow dom using CSS',
|
|
78
|
+
'Capybara::Session selenium node #shadow_root should find nested shadow roots',
|
|
79
|
+
'Capybara::Session selenium node #shadow_root should click on elements',
|
|
80
|
+
'Capybara::Session selenium node #shadow_root should use convenience methods once moved to a descendant of the shadow root',
|
|
81
|
+
'Capybara::Session selenium node #shadow_root should produce error messages when failing',
|
|
82
|
+
'Capybara::Session with firefox with selenium driver #evaluate_script returns a shadow root'
|
|
83
|
+
pending "Firefox doesn't yet have full W3C shadow root support" if firefox_lt?(113, @session)
|
|
84
|
+
when 'Capybara::Session selenium #fill_in should handle carriage returns with line feeds in a textarea correctly'
|
|
85
|
+
pending 'Not sure what firefox is doing here'
|
|
86
|
+
when /Capybara::Session selenium node #shadow_root should get visible text/
|
|
87
|
+
pending "Selenium doesn't currently support getting visible text for shadow root elements"
|
|
88
|
+
when /Capybara::Session selenium node #shadow_root/
|
|
89
|
+
skip 'Not supported with this geckodriver version' if geckodriver_lt?('0.31.0', @session)
|
|
90
|
+
when /Capybara::Session selenium node #set should submit single text input forms if ended with \\n/
|
|
91
|
+
pending 'Firefox/geckodriver doesn\'t submit with values ending in \n'
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
RSpec.describe 'Capybara::Session with firefox' do # rubocop:disable RSpec/MultipleDescribes
|
|
39
96
|
include Capybara::SpecHelper
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
97
|
+
['Capybara::Session', 'Capybara::Node', Capybara::RSpecMatchers].each do |examples|
|
|
98
|
+
include_examples examples, TestSessions::SeleniumFirefox, :selenium_firefox
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
describe 'filling in Firefox-specific date and time fields with keystrokes' do
|
|
102
|
+
let(:datetime) { Time.new(1983, 6, 19, 6, 30) }
|
|
103
|
+
let(:session) { TestSessions::SeleniumFirefox }
|
|
104
|
+
|
|
105
|
+
before do
|
|
106
|
+
session.visit('/form')
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it 'should fill in a date input with a String' do
|
|
110
|
+
session.fill_in('form_date', with: datetime.to_date.iso8601)
|
|
111
|
+
session.click_button('awesome')
|
|
112
|
+
expect(Date.parse(extract_results(session)['date'])).to eq datetime.to_date
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
it 'should fill in a time input with a String' do
|
|
116
|
+
session.fill_in('form_time', with: datetime.to_time.strftime('%T'))
|
|
117
|
+
session.click_button('awesome')
|
|
118
|
+
results = extract_results(session)['time']
|
|
119
|
+
expect(Time.parse(results).strftime('%r')).to eq datetime.strftime('%r')
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it 'should fill in a datetime input with a String' do
|
|
123
|
+
pending 'Need to figure out what string format this will actually accept'
|
|
124
|
+
session.fill_in('form_datetime', with: datetime.iso8601)
|
|
125
|
+
session.click_button('awesome')
|
|
126
|
+
expect(Time.parse(extract_results(session)['datetime'])).to eq datetime
|
|
50
127
|
end
|
|
51
128
|
end
|
|
52
129
|
end
|
|
53
130
|
|
|
54
131
|
RSpec.describe Capybara::Selenium::Driver do
|
|
55
|
-
|
|
56
|
-
@driver = Capybara::Selenium::Driver.new(TestApp, browser: :firefox, desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false))
|
|
57
|
-
end
|
|
132
|
+
let(:driver) { described_class.new(TestApp, browser: :firefox, options: browser_options) }
|
|
58
133
|
|
|
59
134
|
describe '#quit' do
|
|
60
|
-
it
|
|
61
|
-
expect(
|
|
62
|
-
|
|
63
|
-
#access instance variable directly so we don't create a new browser instance
|
|
64
|
-
expect(
|
|
135
|
+
it 'should reset browser when quit' do
|
|
136
|
+
expect(driver.browser).to be_truthy
|
|
137
|
+
driver.quit
|
|
138
|
+
# access instance variable directly so we don't create a new browser instance
|
|
139
|
+
expect(driver.instance_variable_get(:@browser)).to be_nil
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
context 'with errors' do
|
|
143
|
+
let!(:original_browser) { driver.browser }
|
|
144
|
+
|
|
145
|
+
after do
|
|
146
|
+
# Ensure browser is actually quit so we don't leave hanging processe
|
|
147
|
+
RSpec::Mocks.space.proxy_for(original_browser).reset
|
|
148
|
+
original_browser.quit
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
it 'warns UnknownError returned during quit because the browser is probably already gone' do
|
|
152
|
+
allow(driver).to receive(:warn)
|
|
153
|
+
allow(driver.browser).to(
|
|
154
|
+
receive(:quit)
|
|
155
|
+
.and_raise(Selenium::WebDriver::Error::UnknownError, 'random message')
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
expect { driver.quit }.not_to raise_error
|
|
159
|
+
expect(driver.instance_variable_get(:@browser)).to be_nil
|
|
160
|
+
expect(driver).to have_received(:warn).with(/random message/)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it 'ignores silenced UnknownError returned during quit because the browser is almost definitely already gone' do
|
|
164
|
+
allow(driver).to receive(:warn)
|
|
165
|
+
allow(driver.browser).to(
|
|
166
|
+
receive(:quit)
|
|
167
|
+
.and_raise(Selenium::WebDriver::Error::UnknownError, 'Error communicating with the remote browser')
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
expect { driver.quit }.not_to raise_error
|
|
171
|
+
expect(driver.instance_variable_get(:@browser)).to be_nil
|
|
172
|
+
expect(driver).not_to have_received(:warn)
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
context 'storage' do
|
|
178
|
+
describe '#reset!' do
|
|
179
|
+
it 'clears storage by default' do
|
|
180
|
+
session = TestSessions::SeleniumFirefox
|
|
181
|
+
session.visit('/with_js')
|
|
182
|
+
session.find(:css, '#set-storage').click
|
|
183
|
+
session.reset!
|
|
184
|
+
session.visit('/with_js')
|
|
185
|
+
expect(session.driver.browser.local_storage.keys).to be_empty
|
|
186
|
+
expect(session.driver.browser.session_storage.keys).to be_empty
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
it 'does not clear storage when false' do
|
|
190
|
+
session = Capybara::Session.new(:selenium_firefox_not_clear_storage, TestApp)
|
|
191
|
+
session.visit('/with_js')
|
|
192
|
+
session.find(:css, '#set-storage').click
|
|
193
|
+
session.reset!
|
|
194
|
+
session.visit('/with_js')
|
|
195
|
+
expect(session.driver.browser.local_storage.keys).not_to be_empty
|
|
196
|
+
expect(session.driver.browser.session_storage.keys).not_to be_empty
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
context 'timeout' do
|
|
202
|
+
it 'sets the http client read timeout' do
|
|
203
|
+
expect(TestSessions::SeleniumFirefox.driver.browser.send(:bridge).http.read_timeout).to eq 31
|
|
65
204
|
end
|
|
66
205
|
end
|
|
67
206
|
end
|
|
68
207
|
|
|
208
|
+
RSpec.describe Capybara::Selenium::Node do
|
|
209
|
+
describe '#click' do
|
|
210
|
+
it 'warns when attempting on a table row' do
|
|
211
|
+
session = TestSessions::SeleniumFirefox
|
|
212
|
+
session.visit('/tables')
|
|
213
|
+
tr = session.find(:css, '#agent_table tr:first-child')
|
|
214
|
+
allow(tr.base).to receive(:warn)
|
|
215
|
+
tr.click
|
|
216
|
+
expect(tr.base).to have_received(:warn).with(/Clicking the first cell in the row instead/)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it 'should allow multiple modifiers', requires: [:js] do
|
|
220
|
+
session = TestSessions::SeleniumFirefox
|
|
221
|
+
session.visit('with_js')
|
|
222
|
+
# Firefox v62+ doesn't generate an event for control+shift+click
|
|
223
|
+
session.find(:css, '#click-test').click(:alt, :ctrl, :meta)
|
|
224
|
+
# it also triggers a contextmenu event when control is held so don't check click type
|
|
225
|
+
expect(session).to have_link('Has been alt control meta')
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require 'selenium-webdriver'
|
|
5
|
+
require 'shared_selenium_session'
|
|
6
|
+
require 'shared_selenium_node'
|
|
7
|
+
require 'rspec/shared_spec_matchers'
|
|
8
|
+
|
|
9
|
+
def selenium_host
|
|
10
|
+
ENV.fetch('SELENIUM_HOST', '0.0.0.0')
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def selenium_port
|
|
14
|
+
ENV.fetch('SELENIUM_PORT', 4445)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def ensure_selenium_running!
|
|
18
|
+
timer = Capybara::Helpers.timer(expire_in: 20)
|
|
19
|
+
begin
|
|
20
|
+
TCPSocket.open(selenium_host, selenium_port)
|
|
21
|
+
rescue StandardError
|
|
22
|
+
if timer.expired?
|
|
23
|
+
raise 'Selenium is not running. ' \
|
|
24
|
+
"You can run a selenium server easily with: \n. " \
|
|
25
|
+
'$ docker-compose up -d selenium_firefox'
|
|
26
|
+
else
|
|
27
|
+
puts 'Waiting for Selenium docker instance...'
|
|
28
|
+
sleep 1
|
|
29
|
+
retry
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
Capybara.register_driver :selenium_firefox_remote do |app|
|
|
35
|
+
ensure_selenium_running!
|
|
36
|
+
|
|
37
|
+
url = "http://#{selenium_host}:#{selenium_port}/wd/hub"
|
|
38
|
+
browser_options = Selenium::WebDriver::Firefox::Options.new
|
|
39
|
+
|
|
40
|
+
Capybara::Selenium::Driver.new app,
|
|
41
|
+
browser: :remote,
|
|
42
|
+
options: browser_options,
|
|
43
|
+
url: url
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
FIREFOX_REMOTE_DRIVER = :selenium_firefox_remote
|
|
47
|
+
|
|
48
|
+
module TestSessions
|
|
49
|
+
RemoteFirefox = Capybara::Session.new(FIREFOX_REMOTE_DRIVER, TestApp)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
skipped_tests = %i[response_headers status_code trigger download]
|
|
53
|
+
|
|
54
|
+
Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVER.to_s, capybara_skip: skipped_tests do |example|
|
|
55
|
+
case example.metadata[:full_description]
|
|
56
|
+
when 'Capybara::Session selenium_firefox_remote node #click should allow multiple modifiers'
|
|
57
|
+
skip "Firefox doesn't generate an event for shift+control+click" if firefox_gte?(62, @session)
|
|
58
|
+
when 'Capybara::Session selenium_firefox_remote #accept_prompt should accept the prompt with a blank response when there is a default'
|
|
59
|
+
pending "Geckodriver doesn't set a blank response in FF < 63 - https://bugzilla.mozilla.org/show_bug.cgi?id=1486485" if firefox_lt?(63, @session)
|
|
60
|
+
when 'Capybara::Session selenium_firefox_remote #attach_file with multipart form should fire change once when uploading multiple files from empty'
|
|
61
|
+
pending "FF < 62 doesn't support setting all files at once" if firefox_lt?(62, @session)
|
|
62
|
+
when 'Capybara::Session selenium_firefox_remote #reset_session! removes ALL cookies'
|
|
63
|
+
pending "Geckodriver doesn't provide a way to remove cookies outside the current domain"
|
|
64
|
+
when /#accept_confirm should work with nested modals$/
|
|
65
|
+
# skip because this is timing based and hence flaky when set to pending
|
|
66
|
+
skip 'Broken in FF 63 - https://bugzilla.mozilla.org/show_bug.cgi?id=1487358' if firefox_gte?(63, @session)
|
|
67
|
+
when 'Capybara::Session selenium_firefox_remote #fill_in should handle carriage returns with line feeds in a textarea correctly'
|
|
68
|
+
pending 'Not sure what firefox is doing here'
|
|
69
|
+
when 'Capybara::Session selenium_firefox_remote node #shadow_root should find elements inside the shadow dom using CSS',
|
|
70
|
+
'Capybara::Session selenium_firefox_remote node #shadow_root should find nested shadow roots',
|
|
71
|
+
'Capybara::Session selenium_firefox_remote node #shadow_root should click on elements',
|
|
72
|
+
'Capybara::Session selenium_firefox_remote node #shadow_root should use convenience methods once moved to a descendant of the shadow root',
|
|
73
|
+
'Capybara::Session selenium_firefox_remote node #shadow_root should produce error messages when failing',
|
|
74
|
+
'Capybara::Session with remote firefox with selenium driver #evaluate_script returns a shadow root'
|
|
75
|
+
pending "Firefox doesn't yet have full W3C shadow root support"
|
|
76
|
+
when /Capybara::Session selenium_firefox_remote node #shadow_root should get visible text/
|
|
77
|
+
pending "Selenium doesn't currently support getting visible text for shadow root elements"
|
|
78
|
+
when /Capybara::Session selenium_firefox_remote node #shadow_root/
|
|
79
|
+
skip 'Not supported with this geckodriver version' if geckodriver_lt?('0.31.0', @session)
|
|
80
|
+
when /Capybara::Session selenium node #set should submit single text input forms if ended with \\n/
|
|
81
|
+
pending 'Firefox/geckodriver doesn\'t submit with values ending in \n'
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
RSpec.describe 'Capybara::Session with remote firefox' do
|
|
86
|
+
include Capybara::SpecHelper
|
|
87
|
+
['Capybara::Session', 'Capybara::Node', Capybara::RSpecMatchers].each do |examples|
|
|
88
|
+
include_examples examples, TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVER
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'is considered to be firefox' do
|
|
92
|
+
expect(session.driver.browser.browser).to eq :firefox
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
require 'selenium-webdriver'
|
|
5
|
+
require 'shared_selenium_session'
|
|
6
|
+
require 'shared_selenium_node'
|
|
7
|
+
require 'rspec/shared_spec_matchers'
|
|
8
|
+
|
|
9
|
+
# if ENV['CI']
|
|
10
|
+
# if ::Selenium::WebDriver::Service.respond_to? :driver_path=
|
|
11
|
+
# ::Selenium::WebDriver::IE::Service
|
|
12
|
+
# else
|
|
13
|
+
# ::Selenium::WebDriver::IE
|
|
14
|
+
# end.driver_path = 'C:\Tools\WebDriver\IEDriverServer.exe'
|
|
15
|
+
# end
|
|
16
|
+
|
|
17
|
+
def selenium_host
|
|
18
|
+
ENV.fetch('SELENIUM_HOST', '192.168.56.102')
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def selenium_port
|
|
22
|
+
ENV.fetch('SELENIUM_PORT', 4444)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def server_host
|
|
26
|
+
ENV.fetch('SERVER_HOST', '10.24.4.135')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
Capybara.register_driver :selenium_ie do |app|
|
|
30
|
+
# ::Selenium::WebDriver.logger.level = "debug"
|
|
31
|
+
options = Selenium::WebDriver::IE::Options.new
|
|
32
|
+
# options.require_window_focus = true
|
|
33
|
+
# options.add_option("log", {"level": "trace"})
|
|
34
|
+
|
|
35
|
+
if ENV['REMOTE']
|
|
36
|
+
Capybara.server_host = server_host
|
|
37
|
+
|
|
38
|
+
url = "http://#{selenium_host}:#{selenium_port}/wd/hub"
|
|
39
|
+
Capybara::Selenium::Driver.new(app,
|
|
40
|
+
browser: :remote,
|
|
41
|
+
options: options,
|
|
42
|
+
url: url)
|
|
43
|
+
else
|
|
44
|
+
Capybara::Selenium::Driver.new(
|
|
45
|
+
app,
|
|
46
|
+
browser: :ie,
|
|
47
|
+
options: options
|
|
48
|
+
)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
module TestSessions
|
|
53
|
+
SeleniumIE = Capybara::Session.new(:selenium_ie, TestApp)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
TestSessions::SeleniumIE.current_window.resize_to(800, 500)
|
|
57
|
+
|
|
58
|
+
skipped_tests = %i[response_headers status_code trigger modals hover form_attribute windows]
|
|
59
|
+
|
|
60
|
+
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::IE) if ENV['CI']
|
|
61
|
+
|
|
62
|
+
TestSessions::SeleniumIE.current_window.resize_to(1600, 1200)
|
|
63
|
+
|
|
64
|
+
Capybara::SpecHelper.run_specs TestSessions::SeleniumIE, 'selenium', capybara_skip: skipped_tests do |example|
|
|
65
|
+
case example.metadata[:full_description]
|
|
66
|
+
when /#refresh it reposts$/
|
|
67
|
+
skip 'IE insists on prompting without providing a way to suppress'
|
|
68
|
+
when /#click_link can download a file$/
|
|
69
|
+
skip 'Not sure how to configure IE for automatic downloading'
|
|
70
|
+
when /#fill_in with Date /
|
|
71
|
+
pending "IE 11 doesn't support date input types"
|
|
72
|
+
when /#click_link_or_button with :disabled option happily clicks on links which incorrectly have the disabled attribute$/
|
|
73
|
+
skip 'IE 11 obeys non-standard disabled attribute on anchor tag'
|
|
74
|
+
when /#click should allow modifiers$/, /#double_click should allow modifiers$/
|
|
75
|
+
pending "Doesn't work with IE for some unknown reason$"
|
|
76
|
+
pending "Doesn't work with IE for some unknown reason$"
|
|
77
|
+
when /#click should allow multiple modifiers$/, /#right_click should allow modifiers$/
|
|
78
|
+
skip "Windows can't :meta click because :meta triggers start menu"
|
|
79
|
+
when /#double_click should allow multiple modifiers$/
|
|
80
|
+
skip "Windows can't :alt double click due to being properties shortcut"
|
|
81
|
+
when /#has_css\? should support case insensitive :class and :id options$/
|
|
82
|
+
pending "IE doesn't support case insensitive CSS selectors"
|
|
83
|
+
when /#reset_session! removes ALL cookies$/
|
|
84
|
+
pending "IE driver doesn't provide a way to remove ALL cookies"
|
|
85
|
+
when /#click_button should send button in document order$/
|
|
86
|
+
pending "IE 11 doesn't support the 'form' attribute"
|
|
87
|
+
when /#click_button should follow permanent redirects that maintain method$/
|
|
88
|
+
pending "Window 7 and 8.1 don't support 308 http status code"
|
|
89
|
+
when /#scroll_to can scroll an element to the center of the viewport$/,
|
|
90
|
+
/#scroll_to can scroll an element to the center of the scrolling element$/
|
|
91
|
+
pending "IE doesn't support ScrollToOptions"
|
|
92
|
+
when /#attach_file with multipart form should fire change once for each set of files uploaded$/,
|
|
93
|
+
/#attach_file with multipart form should fire change once when uploading multiple files from empty$/,
|
|
94
|
+
/#attach_file with multipart form should not break when using HTML5 multiple file input uploading multiple files$/
|
|
95
|
+
pending "IE requires all files be uploaded from same directory. Selenium doesn't provide that." if ENV['REMOTE']
|
|
96
|
+
when %r{#attach_file with multipart form should send content type image/jpeg when uploading an image$}
|
|
97
|
+
pending 'IE gets text/plain type for some reason'
|
|
98
|
+
# when /#click should not retry clicking when wait is disabled$/
|
|
99
|
+
# Fixed in IEDriverServer 3.141.0.5
|
|
100
|
+
# pending "IE driver doesn't error when clicking on covered elements, it just clicks the wrong element"
|
|
101
|
+
when /#click should go to the same page if href is blank$/
|
|
102
|
+
pending 'IE treats blank href as a parent request (against HTML spec)'
|
|
103
|
+
when /#attach_file with a block/
|
|
104
|
+
skip 'Hangs IE testing for unknown reason'
|
|
105
|
+
when /drag_to.*HTML5/
|
|
106
|
+
pending "IE doesn't support a DataTransfer constructor"
|
|
107
|
+
when /template elements should not be visible/
|
|
108
|
+
skip "IE doesn't support template elements"
|
|
109
|
+
when /Element#drop/
|
|
110
|
+
pending "IE doesn't support DataTransfer constructor"
|
|
111
|
+
when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
|
|
112
|
+
pending "Selenium doesn't currently support getting visible text for shadow root elements"
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
RSpec.describe 'Capybara::Session with Internet Explorer', capybara_skip: skipped_tests do # rubocop:disable RSpec/MultipleDescribes
|
|
117
|
+
include Capybara::SpecHelper
|
|
118
|
+
['Capybara::Session', 'Capybara::Node', Capybara::RSpecMatchers].each do |examples|
|
|
119
|
+
include_examples examples, TestSessions::SeleniumIE, :selenium_ie
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
RSpec.describe Capybara::Selenium::Node do
|
|
124
|
+
it '#right_click should allow modifiers' do
|
|
125
|
+
# pending "Actions API doesn't appear to work for this"
|
|
126
|
+
session = TestSessions::SeleniumIE
|
|
127
|
+
session.visit('/with_js')
|
|
128
|
+
el = session.find(:css, '#click-test')
|
|
129
|
+
el.right_click(:control)
|
|
130
|
+
expect(session).to have_link('Has been control right clicked')
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it '#click should allow multiple modifiers' do
|
|
134
|
+
# pending "Actions API doesn't appear to work for this"
|
|
135
|
+
session = TestSessions::SeleniumIE
|
|
136
|
+
session.visit('with_js')
|
|
137
|
+
# IE triggers system behavior with :meta so can't use those here
|
|
138
|
+
session.find(:css, '#click-test').click(:ctrl, :shift, :alt)
|
|
139
|
+
expect(session).to have_link('Has been alt control shift clicked')
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
it '#double_click should allow modifiers' do
|
|
143
|
+
# pending "Actions API doesn't appear to work for this"
|
|
144
|
+
session = TestSessions::SeleniumIE
|
|
145
|
+
session.visit('/with_js')
|
|
146
|
+
session.find(:css, '#click-test').double_click(:shift)
|
|
147
|
+
expect(session).to have_link('Has been shift double clicked')
|
|
148
|
+
end
|
|
149
|
+
end
|