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
@@ -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
|
data/spec/selenium_spec_ie.rb
CHANGED
@@ -1,31 +1,149 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'spec_helper'
|
4
|
-
require
|
4
|
+
require 'selenium-webdriver'
|
5
5
|
require 'shared_selenium_session'
|
6
|
+
require 'shared_selenium_node'
|
6
7
|
require 'rspec/shared_spec_matchers'
|
7
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
|
+
|
8
29
|
Capybara.register_driver :selenium_ie do |app|
|
9
30
|
# ::Selenium::WebDriver.logger.level = "debug"
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
15
50
|
end
|
16
51
|
|
17
52
|
module TestSessions
|
18
53
|
SeleniumIE = Capybara::Session.new(:selenium_ie, TestApp)
|
19
54
|
end
|
20
55
|
|
56
|
+
TestSessions::SeleniumIE.current_window.resize_to(800, 500)
|
57
|
+
|
21
58
|
skipped_tests = %i[response_headers status_code trigger modals hover form_attribute windows]
|
22
59
|
|
23
|
-
|
60
|
+
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::IE) if ENV['CI']
|
24
61
|
|
25
|
-
|
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
|
26
115
|
|
27
|
-
RSpec.describe
|
116
|
+
RSpec.describe 'Capybara::Session with Internet Explorer', capybara_skip: skipped_tests do # rubocop:disable RSpec/MultipleDescribes
|
28
117
|
include Capybara::SpecHelper
|
29
|
-
|
30
|
-
|
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
|
31
149
|
end
|
@@ -0,0 +1,162 @@
|
|
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
|
+
SAFARI_DRIVER = :selenium_safari
|
10
|
+
|
11
|
+
# if ::Selenium::WebDriver::Service.respond_to? :driver_path=
|
12
|
+
# ::Selenium::WebDriver::Safari::Service
|
13
|
+
# else
|
14
|
+
# ::Selenium::WebDriver::Safari
|
15
|
+
# end.driver_path = '/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver'
|
16
|
+
|
17
|
+
browser_options = Selenium::WebDriver::Safari::Options.new
|
18
|
+
# browser_options.headless! if ENV['HEADLESS']
|
19
|
+
|
20
|
+
Capybara.register_driver :selenium_safari do |app|
|
21
|
+
version = Capybara::Selenium::Driver.load_selenium
|
22
|
+
options_key = Capybara::Selenium::Driver::CAPS_VERSION.satisfied_by?(version) ? :capabilities : :options
|
23
|
+
driver_options = { browser: :safari, timeout: 30 }.tap do |opts|
|
24
|
+
opts[options_key] = browser_options
|
25
|
+
end
|
26
|
+
|
27
|
+
Capybara::Selenium::Driver.new(app, **driver_options).tap do |driver|
|
28
|
+
# driver.browser.download_path = Capybara.save_path
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Capybara.register_driver :selenium_safari_not_clear_storage do |app|
|
33
|
+
version = Capybara::Selenium::Driver.load_selenium
|
34
|
+
options_key = Capybara::Selenium::Driver::CAPS_VERSION.satisfied_by?(version) ? :capabilities : :options
|
35
|
+
driver_options = {
|
36
|
+
browser: :safari,
|
37
|
+
clear_local_storage: false,
|
38
|
+
clear_session_storage: false,
|
39
|
+
timeout: 30
|
40
|
+
}.tap do |opts|
|
41
|
+
opts[options_key] = browser_options
|
42
|
+
end
|
43
|
+
|
44
|
+
Capybara::Selenium::Driver.new(app, **driver_options)
|
45
|
+
end
|
46
|
+
|
47
|
+
module TestSessions
|
48
|
+
Safari = Capybara::Session.new(SAFARI_DRIVER, TestApp)
|
49
|
+
end
|
50
|
+
|
51
|
+
skipped_tests = %i[response_headers status_code trigger windows drag]
|
52
|
+
|
53
|
+
Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Safari) if ENV['CI']
|
54
|
+
|
55
|
+
Capybara::SpecHelper.run_specs TestSessions::Safari, SAFARI_DRIVER.to_s, capybara_skip: skipped_tests do |example|
|
56
|
+
case example.metadata[:full_description]
|
57
|
+
when /click_link can download a file/
|
58
|
+
skip "safaridriver doesn't provide a way to set the download directory"
|
59
|
+
when /Capybara::Session selenium_safari Capybara::Window#maximize/
|
60
|
+
pending "Safari headless doesn't support maximize" if ENV['HEADLESS']
|
61
|
+
when /Capybara::Session selenium_safari #visit without a server/,
|
62
|
+
/Capybara::Session selenium_safari #visit with Capybara.app_host set should override server/,
|
63
|
+
/Capybara::Session selenium_safari #reset_session! When reuse_server == false raises any standard errors caught inside the server during a second session/
|
64
|
+
skip "Safari webdriver doesn't support multiple sessions"
|
65
|
+
when /Capybara::Session selenium_safari #click_link with alternative text given to a contained image/,
|
66
|
+
'Capybara::Session selenium_safari #click_link_or_button with enable_aria_label should click on link'
|
67
|
+
pending 'safaridriver thinks these links are non-interactable for some unknown reason'
|
68
|
+
when /Capybara::Session selenium_safari #attach_file with a block can upload by clicking the file input/
|
69
|
+
skip "safaridriver doesn't allow clicking on file inputs"
|
70
|
+
when /Capybara::Session selenium_safari #within_frame works if the frame is closed/,
|
71
|
+
/Capybara::Session selenium_safari #switch_to_frame works if the frame is closed/
|
72
|
+
skip 'Safari has a race condition when clicking an element that causes the frame to close. It will sometimes raise a NoSuchFrameError'
|
73
|
+
when /Capybara::Session selenium_safari #reset_session! removes ALL cookies/
|
74
|
+
skip 'Safari webdriver can only remove cookies for the current domain'
|
75
|
+
when /Capybara::Session selenium_safari #refresh it reposts/
|
76
|
+
skip "Safari opens an alert that can't be closed"
|
77
|
+
when 'Capybara::Session selenium_safari node #double_click should allow to adjust the offset',
|
78
|
+
'Capybara::Session selenium_safari node #double_click should double click an element'
|
79
|
+
pending "safardriver doesn't generate a double click event"
|
80
|
+
when 'Capybara::Session selenium_safari node #double_click should allow modifiers'
|
81
|
+
pending "safaridriver doesn't generate double click with key modifiers"
|
82
|
+
when /when w3c_click_offset is true should offset/
|
83
|
+
pending 'w3c_click_offset is not currently supported with safaridriver'
|
84
|
+
when 'Capybara::Session selenium_safari #go_back should fetch a response from the driver from the previous page',
|
85
|
+
'Capybara::Session selenium_safari #go_forward should fetch a response from the driver from the previous page'
|
86
|
+
skip 'safaridriver loses the ability to find elements in the document after `go_back`'
|
87
|
+
when 'Capybara::Session selenium node #shadow_root should get the shadow root',
|
88
|
+
'Capybara::Session selenium node #shadow_root should find elements inside the shadow dom using CSS',
|
89
|
+
'Capybara::Session selenium node #shadow_root should find nested shadow roots'
|
90
|
+
pending "Safari doesn't yet have W3C shadow root support"
|
91
|
+
when /Capybara::Session selenium_chrome node #shadow_root should get visible text/
|
92
|
+
pending "Selenium doesn't currently support getting visible text for shadow root elements"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
RSpec.describe 'Capybara::Session with safari' do
|
97
|
+
include Capybara::SpecHelper
|
98
|
+
['Capybara::Session', 'Capybara::Node', Capybara::RSpecMatchers].each do |examples|
|
99
|
+
include_examples examples, TestSessions::Safari, SAFARI_DRIVER
|
100
|
+
end
|
101
|
+
|
102
|
+
context 'storage' do
|
103
|
+
describe '#reset!' do
|
104
|
+
it 'clears storage by default' do
|
105
|
+
session = TestSessions::Safari
|
106
|
+
session.visit('/with_js')
|
107
|
+
session.find(:css, '#set-storage').click
|
108
|
+
session.reset!
|
109
|
+
session.visit('/with_js')
|
110
|
+
expect(session.evaluate_script('Object.keys(localStorage)')).to be_empty
|
111
|
+
expect(session.evaluate_script('Object.keys(sessionStorage)')).to be_empty
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'does not clear storage when false' do
|
115
|
+
skip "Safari webdriver doesn't support multiple sessions"
|
116
|
+
session = Capybara::Session.new(:selenium_safari_not_clear_storage, TestApp)
|
117
|
+
session.visit('/with_js')
|
118
|
+
session.find(:css, '#set-storage').click
|
119
|
+
session.reset!
|
120
|
+
session.visit('/with_js')
|
121
|
+
expect(session.evaluate_script('Object.keys(localStorage)')).not_to be_empty
|
122
|
+
expect(session.evaluate_script('Object.keys(sessionStorage)')).not_to be_empty
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
context 'timeout' do
|
128
|
+
it 'sets the http client read timeout' do
|
129
|
+
expect(TestSessions::Safari.driver.browser.send(:bridge).http.read_timeout).to eq 30
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
describe 'filling in Safari-specific date and time fields with keystrokes' do
|
134
|
+
let(:datetime) { Time.new(1983, 6, 19, 6, 30) }
|
135
|
+
let(:session) { TestSessions::Safari }
|
136
|
+
|
137
|
+
before do
|
138
|
+
session.visit('/form')
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'should fill in a date input with a String' do
|
142
|
+
session.fill_in('form_date', with: '06/19/1983')
|
143
|
+
session.click_button('awesome')
|
144
|
+
expect(Date.parse(extract_results(session)['date'])).to eq datetime.to_date
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should fill in a time input with a String' do
|
148
|
+
# Safari doesn't support time inputs - so this is just a text input
|
149
|
+
session.fill_in('form_time', with: '06:30A')
|
150
|
+
session.click_button('awesome')
|
151
|
+
results = extract_results(session)['time']
|
152
|
+
expect(Time.parse(results).strftime('%r')).to eq datetime.strftime('%r')
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'should fill in a datetime input with a String' do
|
156
|
+
pending "Safari doesn't support datetime inputs"
|
157
|
+
session.fill_in('form_datetime', with: "06/19/1983\t06:30A")
|
158
|
+
session.click_button('awesome')
|
159
|
+
expect(Time.parse(extract_results(session)['datetime'])).to eq datetime
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|