capybara 3.13.2 → 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.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +587 -16
  4. data/README.md +240 -90
  5. data/lib/capybara/config.rb +24 -11
  6. data/lib/capybara/cucumber.rb +1 -1
  7. data/lib/capybara/driver/base.rb +8 -0
  8. data/lib/capybara/driver/node.rb +20 -4
  9. data/lib/capybara/dsl.rb +5 -3
  10. data/lib/capybara/helpers.rb +25 -4
  11. data/lib/capybara/minitest/spec.rb +174 -90
  12. data/lib/capybara/minitest.rb +256 -142
  13. data/lib/capybara/node/actions.rb +123 -77
  14. data/lib/capybara/node/base.rb +20 -12
  15. data/lib/capybara/node/document.rb +2 -2
  16. data/lib/capybara/node/document_matchers.rb +3 -3
  17. data/lib/capybara/node/element.rb +223 -117
  18. data/lib/capybara/node/finders.rb +81 -71
  19. data/lib/capybara/node/matchers.rb +271 -134
  20. data/lib/capybara/node/simple.rb +18 -5
  21. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  22. data/lib/capybara/queries/active_element_query.rb +18 -0
  23. data/lib/capybara/queries/ancestor_query.rb +8 -9
  24. data/lib/capybara/queries/base_query.rb +3 -2
  25. data/lib/capybara/queries/current_path_query.rb +15 -5
  26. data/lib/capybara/queries/selector_query.rb +364 -54
  27. data/lib/capybara/queries/sibling_query.rb +8 -6
  28. data/lib/capybara/queries/style_query.rb +2 -2
  29. data/lib/capybara/queries/text_query.rb +13 -1
  30. data/lib/capybara/queries/title_query.rb +1 -1
  31. data/lib/capybara/rack_test/browser.rb +76 -11
  32. data/lib/capybara/rack_test/driver.rb +10 -5
  33. data/lib/capybara/rack_test/errors.rb +6 -0
  34. data/lib/capybara/rack_test/form.rb +31 -9
  35. data/lib/capybara/rack_test/node.rb +74 -23
  36. data/lib/capybara/registration_container.rb +41 -0
  37. data/lib/capybara/registrations/drivers.rb +42 -0
  38. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  39. data/lib/capybara/registrations/servers.rb +66 -0
  40. data/lib/capybara/result.rb +44 -20
  41. data/lib/capybara/rspec/matcher_proxies.rb +13 -11
  42. data/lib/capybara/rspec/matchers/base.rb +31 -16
  43. data/lib/capybara/rspec/matchers/compound.rb +1 -1
  44. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  45. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  46. data/lib/capybara/rspec/matchers/have_current_path.rb +2 -2
  47. data/lib/capybara/rspec/matchers/have_selector.rb +21 -21
  48. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  49. data/lib/capybara/rspec/matchers/have_text.rb +4 -4
  50. data/lib/capybara/rspec/matchers/have_title.rb +2 -2
  51. data/lib/capybara/rspec/matchers/match_selector.rb +3 -3
  52. data/lib/capybara/rspec/matchers/match_style.rb +7 -2
  53. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  54. data/lib/capybara/rspec/matchers.rb +111 -68
  55. data/lib/capybara/rspec.rb +2 -0
  56. data/lib/capybara/selector/builders/css_builder.rb +11 -7
  57. data/lib/capybara/selector/builders/xpath_builder.rb +5 -3
  58. data/lib/capybara/selector/css.rb +11 -9
  59. data/lib/capybara/selector/definition/button.rb +68 -0
  60. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  61. data/lib/capybara/selector/definition/css.rb +10 -0
  62. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  63. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  64. data/lib/capybara/selector/definition/element.rb +28 -0
  65. data/lib/capybara/selector/definition/field.rb +40 -0
  66. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  67. data/lib/capybara/selector/definition/file_field.rb +13 -0
  68. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  69. data/lib/capybara/selector/definition/frame.rb +17 -0
  70. data/lib/capybara/selector/definition/id.rb +6 -0
  71. data/lib/capybara/selector/definition/label.rb +62 -0
  72. data/lib/capybara/selector/definition/link.rb +55 -0
  73. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  74. data/lib/capybara/selector/definition/option.rb +27 -0
  75. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  76. data/lib/capybara/selector/definition/select.rb +81 -0
  77. data/lib/capybara/selector/definition/table.rb +109 -0
  78. data/lib/capybara/selector/definition/table_row.rb +21 -0
  79. data/lib/capybara/selector/definition/xpath.rb +5 -0
  80. data/lib/capybara/selector/definition.rb +280 -0
  81. data/lib/capybara/selector/filter_set.rb +19 -18
  82. data/lib/capybara/selector/filters/base.rb +11 -2
  83. data/lib/capybara/selector/filters/locator_filter.rb +13 -3
  84. data/lib/capybara/selector/regexp_disassembler.rb +11 -7
  85. data/lib/capybara/selector/selector.rb +50 -440
  86. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  87. data/lib/capybara/selector.rb +473 -482
  88. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  89. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  90. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  91. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  92. data/lib/capybara/selenium/driver.rb +174 -62
  93. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +74 -18
  94. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  95. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +37 -3
  96. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +14 -1
  97. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  98. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  99. data/lib/capybara/selenium/extensions/find.rb +68 -45
  100. data/lib/capybara/selenium/extensions/html5_drag.rb +192 -22
  101. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  102. data/lib/capybara/selenium/extensions/scroll.rb +8 -10
  103. data/lib/capybara/selenium/node.rb +268 -72
  104. data/lib/capybara/selenium/nodes/chrome_node.rb +105 -9
  105. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  106. data/lib/capybara/selenium/nodes/firefox_node.rb +51 -61
  107. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  108. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  109. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  110. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  111. data/lib/capybara/selenium/patches/logs.rb +45 -0
  112. data/lib/capybara/selenium/patches/pause_duration_fix.rb +1 -1
  113. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  114. data/lib/capybara/server/animation_disabler.rb +43 -21
  115. data/lib/capybara/server/checker.rb +6 -2
  116. data/lib/capybara/server/middleware.rb +25 -13
  117. data/lib/capybara/server.rb +20 -4
  118. data/lib/capybara/session/config.rb +15 -11
  119. data/lib/capybara/session/matchers.rb +11 -11
  120. data/lib/capybara/session.rb +162 -131
  121. data/lib/capybara/spec/public/offset.js +6 -0
  122. data/lib/capybara/spec/public/test.js +105 -6
  123. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
  124. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  125. data/lib/capybara/spec/session/all_spec.rb +89 -15
  126. data/lib/capybara/spec/session/ancestor_spec.rb +5 -0
  127. data/lib/capybara/spec/session/assert_current_path_spec.rb +5 -2
  128. data/lib/capybara/spec/session/assert_text_spec.rb +26 -22
  129. data/lib/capybara/spec/session/attach_file_spec.rb +64 -31
  130. data/lib/capybara/spec/session/check_spec.rb +26 -4
  131. data/lib/capybara/spec/session/choose_spec.rb +14 -2
  132. data/lib/capybara/spec/session/click_button_spec.rb +109 -61
  133. data/lib/capybara/spec/session/click_link_or_button_spec.rb +9 -0
  134. data/lib/capybara/spec/session/click_link_spec.rb +23 -1
  135. data/lib/capybara/spec/session/current_scope_spec.rb +1 -1
  136. data/lib/capybara/spec/session/current_url_spec.rb +11 -1
  137. data/lib/capybara/spec/session/element/matches_selector_spec.rb +40 -39
  138. data/lib/capybara/spec/session/evaluate_script_spec.rb +12 -0
  139. data/lib/capybara/spec/session/fill_in_spec.rb +46 -5
  140. data/lib/capybara/spec/session/find_link_spec.rb +10 -0
  141. data/lib/capybara/spec/session/find_spec.rb +80 -7
  142. data/lib/capybara/spec/session/first_spec.rb +2 -2
  143. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +14 -1
  144. data/lib/capybara/spec/session/frame/within_frame_spec.rb +14 -1
  145. data/lib/capybara/spec/session/has_all_selectors_spec.rb +5 -5
  146. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  147. data/lib/capybara/spec/session/has_any_selectors_spec.rb +6 -2
  148. data/lib/capybara/spec/session/has_button_spec.rb +81 -0
  149. data/lib/capybara/spec/session/has_css_spec.rb +45 -8
  150. data/lib/capybara/spec/session/has_current_path_spec.rb +22 -7
  151. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  152. data/lib/capybara/spec/session/has_field_spec.rb +59 -1
  153. data/lib/capybara/spec/session/has_link_spec.rb +40 -0
  154. data/lib/capybara/spec/session/has_none_selectors_spec.rb +7 -7
  155. data/lib/capybara/spec/session/has_select_spec.rb +42 -8
  156. data/lib/capybara/spec/session/has_selector_spec.rb +19 -4
  157. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  158. data/lib/capybara/spec/session/has_table_spec.rb +177 -0
  159. data/lib/capybara/spec/session/has_text_spec.rb +31 -3
  160. data/lib/capybara/spec/session/html_spec.rb +1 -1
  161. data/lib/capybara/spec/session/matches_style_spec.rb +6 -4
  162. data/lib/capybara/spec/session/node_spec.rb +697 -23
  163. data/lib/capybara/spec/session/node_wrapper_spec.rb +1 -1
  164. data/lib/capybara/spec/session/refresh_spec.rb +2 -1
  165. data/lib/capybara/spec/session/reset_session_spec.rb +21 -7
  166. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
  167. data/lib/capybara/spec/session/save_page_spec.rb +4 -4
  168. data/lib/capybara/spec/session/save_screenshot_spec.rb +4 -4
  169. data/lib/capybara/spec/session/scroll_spec.rb +9 -7
  170. data/lib/capybara/spec/session/select_spec.rb +5 -10
  171. data/lib/capybara/spec/session/selectors_spec.rb +24 -3
  172. data/lib/capybara/spec/session/uncheck_spec.rb +3 -3
  173. data/lib/capybara/spec/session/unselect_spec.rb +1 -1
  174. data/lib/capybara/spec/session/visit_spec.rb +20 -0
  175. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  176. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +1 -1
  177. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +1 -1
  178. data/lib/capybara/spec/session/window/window_spec.rb +54 -57
  179. data/lib/capybara/spec/session/window/windows_spec.rb +2 -2
  180. data/lib/capybara/spec/session/within_spec.rb +36 -0
  181. data/lib/capybara/spec/spec_helper.rb +30 -19
  182. data/lib/capybara/spec/test_app.rb +122 -34
  183. data/lib/capybara/spec/views/animated.erb +49 -0
  184. data/lib/capybara/spec/views/form.erb +86 -8
  185. data/lib/capybara/spec/views/frame_child.erb +3 -2
  186. data/lib/capybara/spec/views/frame_one.erb +2 -1
  187. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  188. data/lib/capybara/spec/views/frame_two.erb +1 -1
  189. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  190. data/lib/capybara/spec/views/layout.erb +10 -0
  191. data/lib/capybara/spec/views/obscured.erb +10 -10
  192. data/lib/capybara/spec/views/offset.erb +33 -0
  193. data/lib/capybara/spec/views/path.erb +2 -2
  194. data/lib/capybara/spec/views/popup_one.erb +1 -1
  195. data/lib/capybara/spec/views/popup_two.erb +1 -1
  196. data/lib/capybara/spec/views/react.erb +45 -0
  197. data/lib/capybara/spec/views/scroll.erb +2 -1
  198. data/lib/capybara/spec/views/spatial.erb +31 -0
  199. data/lib/capybara/spec/views/tables.erb +67 -0
  200. data/lib/capybara/spec/views/with_animation.erb +39 -4
  201. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  202. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  203. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  204. data/lib/capybara/spec/views/with_hover.erb +3 -2
  205. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  206. data/lib/capybara/spec/views/with_html.erb +34 -6
  207. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  208. data/lib/capybara/spec/views/with_js.erb +7 -4
  209. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  210. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  211. data/lib/capybara/spec/views/with_scope.erb +2 -2
  212. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  213. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  214. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  215. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  216. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  217. data/lib/capybara/spec/views/with_windows.erb +1 -1
  218. data/lib/capybara/spec/views/within_frames.erb +1 -1
  219. data/lib/capybara/version.rb +1 -1
  220. data/lib/capybara/window.rb +14 -18
  221. data/lib/capybara.rb +91 -126
  222. data/spec/basic_node_spec.rb +30 -16
  223. data/spec/capybara_spec.rb +40 -28
  224. data/spec/counter_spec.rb +35 -0
  225. data/spec/css_builder_spec.rb +3 -1
  226. data/spec/css_splitter_spec.rb +1 -1
  227. data/spec/dsl_spec.rb +33 -22
  228. data/spec/filter_set_spec.rb +5 -5
  229. data/spec/fixtures/selenium_driver_rspec_failure.rb +3 -3
  230. data/spec/fixtures/selenium_driver_rspec_success.rb +3 -3
  231. data/spec/minitest_spec.rb +24 -2
  232. data/spec/minitest_spec_spec.rb +60 -45
  233. data/spec/per_session_config_spec.rb +1 -1
  234. data/spec/rack_test_spec.rb +131 -98
  235. data/spec/regexp_dissassembler_spec.rb +53 -39
  236. data/spec/result_spec.rb +68 -66
  237. data/spec/rspec/features_spec.rb +9 -4
  238. data/spec/rspec/scenarios_spec.rb +6 -2
  239. data/spec/rspec/shared_spec_matchers.rb +137 -98
  240. data/spec/rspec_matchers_spec.rb +25 -0
  241. data/spec/rspec_spec.rb +23 -21
  242. data/spec/sauce_spec_chrome.rb +43 -0
  243. data/spec/selector_spec.rb +77 -21
  244. data/spec/selenium_spec_chrome.rb +141 -39
  245. data/spec/selenium_spec_chrome_remote.rb +32 -17
  246. data/spec/selenium_spec_edge.rb +36 -8
  247. data/spec/selenium_spec_firefox.rb +110 -68
  248. data/spec/selenium_spec_firefox_remote.rb +22 -15
  249. data/spec/selenium_spec_ie.rb +29 -22
  250. data/spec/selenium_spec_safari.rb +162 -0
  251. data/spec/server_spec.rb +153 -81
  252. data/spec/session_spec.rb +11 -4
  253. data/spec/shared_selenium_node.rb +79 -0
  254. data/spec/shared_selenium_session.rb +179 -74
  255. data/spec/spec_helper.rb +80 -5
  256. data/spec/whitespace_normalizer_spec.rb +54 -0
  257. data/spec/xpath_builder_spec.rb +3 -1
  258. metadata +218 -30
  259. data/lib/capybara/spec/session/source_spec.rb +0 -0
  260. data/lib/capybara/spec/views/with_title.erb +0 -5
@@ -3,6 +3,7 @@
3
3
  require 'spec_helper'
4
4
  require 'selenium-webdriver'
5
5
  require 'shared_selenium_session'
6
+ require 'shared_selenium_node'
6
7
  require 'rspec/shared_spec_matchers'
7
8
 
8
9
  def selenium_host
@@ -20,8 +21,8 @@ def ensure_selenium_running!
20
21
  rescue StandardError
21
22
  if timer.expired?
22
23
  raise 'Selenium is not running. ' \
23
- "You can run a selenium server easily with: \n" \
24
- ' $ docker-compose up -d selenium_chrome'
24
+ "You can run a selenium server easily with: \n " \
25
+ '$ docker-compose up -d selenium_chrome'
25
26
  else
26
27
  puts 'Waiting for Selenium docker instance...'
27
28
  sleep 1
@@ -31,18 +32,17 @@ def ensure_selenium_running!
31
32
  end
32
33
 
33
34
  def selenium_gte?(version)
34
- defined?(Selenium::WebDriver::VERSION) && (Selenium::WebDriver::VERSION.to_f >= version)
35
+ defined?(Selenium::WebDriver::VERSION) && (Gem::Version.new(Selenium::WebDriver::VERSION) >= Gem::Version.new(version))
35
36
  end
36
37
 
37
38
  Capybara.register_driver :selenium_chrome_remote do |app|
38
39
  ensure_selenium_running!
39
40
 
40
41
  url = "http://#{selenium_host}:#{selenium_port}/wd/hub"
41
- browser_options = ::Selenium::WebDriver::Chrome::Options.new
42
+ browser_options = Selenium::WebDriver::Chrome::Options.new
42
43
 
43
44
  Capybara::Selenium::Driver.new app,
44
45
  browser: :remote,
45
- desired_capabilities: :chrome,
46
46
  options: browser_options,
47
47
  url: url
48
48
  end
@@ -53,29 +53,44 @@ module TestSessions
53
53
  Chrome = Capybara::Session.new(CHROME_REMOTE_DRIVER, TestApp)
54
54
  end
55
55
 
56
- TestSessions::Chrome.driver.browser.file_detector = lambda do |args|
57
- # args => ["/path/to/file"]
58
- str = args.first.to_s
59
- str if File.exist?(str)
60
- end
61
-
62
56
  skipped_tests = %i[response_headers status_code trigger download]
63
57
 
64
58
  Capybara::SpecHelper.run_specs TestSessions::Chrome, CHROME_REMOTE_DRIVER.to_s, capybara_skip: skipped_tests do |example|
65
59
  case example.metadata[:full_description]
66
- when 'Capybara::Session selenium_chrome_remote #attach_file with multipart form should not break when using HTML5 multiple file input uploading multiple files',
67
- 'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once for each set of files uploaded',
68
- 'Capybara::Session selenium_chrome_remote #attach_file with multipart form should fire change once when uploading multiple files from empty'
69
- pending "Selenium with Remote Chrome doesn't support multiple file upload" unless selenium_gte?(3.14)
60
+ when /Capybara::Session selenium_chrome_remote node #shadow_root should get visible text/
61
+ pending "Selenium doesn't currently support getting visible text for shadow root elements"
62
+ when /Capybara::Session selenium_chrome_remote node #shadow_root/
63
+ skip 'Not supported with this chromedriver version' if chromedriver_lt?('96.0', @session)
70
64
  end
71
65
  end
72
66
 
73
67
  RSpec.describe 'Capybara::Session with remote Chrome' do
74
68
  include Capybara::SpecHelper
75
- include_examples 'Capybara::Session', TestSessions::Chrome, CHROME_REMOTE_DRIVER
76
- include_examples Capybara::RSpecMatchers, TestSessions::Chrome, CHROME_REMOTE_DRIVER
69
+ ['Capybara::Session', 'Capybara::Node', Capybara::RSpecMatchers].each do |examples|
70
+ include_examples examples, TestSessions::Chrome, CHROME_REMOTE_DRIVER
71
+ end
77
72
 
78
73
  it 'is considered to be chrome' do
79
74
  expect(session.driver.browser.browser).to eq :chrome
80
75
  end
76
+
77
+ describe 'log access' do
78
+ let(:logs) do
79
+ session.driver.browser.then do |chrome_driver|
80
+ chrome_driver.respond_to?(:logs) ? chrome_driver : chrome_driver.manage
81
+ end.logs
82
+ end
83
+
84
+ it 'does not error when getting log types' do
85
+ expect do
86
+ logs.available_types
87
+ end.not_to raise_error
88
+ end
89
+
90
+ it 'does not error when getting logs' do
91
+ expect do
92
+ logs.get(:browser)
93
+ end.not_to raise_error
94
+ end
95
+ end
81
96
  end
@@ -3,30 +3,58 @@
3
3
  require 'spec_helper'
4
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
+ # unless ENV['CI']
10
+ # Selenium::WebDriver::Edge::Service.driver_path = '/usr/local/bin/msedgedriver'
11
+ # end
12
+
13
+ Selenium::WebDriver.logger.ignore(:selenium_manager)
14
+
15
+ if Selenium::WebDriver::Platform.mac?
16
+ Selenium::WebDriver::Edge.path = '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge'
17
+ end
18
+
8
19
  Capybara.register_driver :selenium_edge do |app|
9
20
  # ::Selenium::WebDriver.logger.level = "debug"
10
- Capybara::Selenium::Driver.new(app, browser: :edge)
21
+ # If we don't create an options object the path set above won't be used
22
+
23
+ # browser_options = Selenium::WebDriver::Edge::Options.new
24
+ # browser_options.add_argument('--headless') if ENV['HEADLESS']
25
+
26
+ browser_options = if ENV['HEADLESS']
27
+ Selenium::WebDriver::Options.edge(args: ['--headless=new'])
28
+ else
29
+ Selenium::WebDriver::Options.edge
30
+ end
31
+
32
+ Capybara::Selenium::Driver.new(app, browser: :edge, options: browser_options).tap do |driver|
33
+ driver.browser
34
+ driver.download_path = Capybara.save_path
35
+ end
11
36
  end
12
37
 
13
38
  module TestSessions
14
39
  SeleniumEdge = Capybara::Session.new(:selenium_edge, TestApp)
15
40
  end
16
41
 
17
- skipped_tests = %i[response_headers status_code trigger modals]
42
+ skipped_tests = %i[response_headers status_code trigger]
18
43
 
19
- $stdout.puts `#{Selenium::WebDriver::Edge.driver_path} --version` if ENV['CI']
44
+ Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Edge) if ENV['CI']
20
45
 
21
46
  Capybara::SpecHelper.run_specs TestSessions::SeleniumEdge, 'selenium', capybara_skip: skipped_tests do |example|
22
- case example.metadata[:description]
23
- when /#refresh it reposts$/
24
- skip 'Edge insists on prompting without providing a way to suppress'
47
+ case example.metadata[:full_description]
48
+ when 'Capybara::Session selenium #attach_file with a block can upload by clicking the file input'
49
+ pending "Edge doesn't allow clicking on file inputs"
50
+ when /Capybara::Session selenium node #shadow_root should get visible text/
51
+ pending "Selenium doesn't currently support getting visible text for shadow root elements"
25
52
  end
26
53
  end
27
54
 
28
55
  RSpec.describe 'Capybara::Session with Edge', capybara_skip: skipped_tests do
29
56
  include Capybara::SpecHelper
30
- include_examples 'Capybara::Session', TestSessions::SeleniumEdge, :selenium_edge
31
- include_examples Capybara::RSpecMatchers, TestSessions::SeleniumEdge, :selenium_edge
57
+ ['Capybara::Session', 'Capybara::Node', Capybara::RSpecMatchers].each do |examples|
58
+ include_examples examples, TestSessions::SeleniumEdge, :selenium_edge
59
+ end
32
60
  end
@@ -3,38 +3,44 @@
3
3
  require 'spec_helper'
4
4
  require 'selenium-webdriver'
5
5
  require 'shared_selenium_session'
6
+ require 'shared_selenium_node'
6
7
  require 'rspec/shared_spec_matchers'
7
8
 
8
- browser_options = ::Selenium::WebDriver::Firefox::Options.new
9
- browser_options.headless! if ENV['HEADLESS']
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']
10
13
  # browser_options.add_option("log", {"level": "trace"})
11
14
 
12
15
  browser_options.profile = Selenium::WebDriver::Firefox::Profile.new.tap do |profile|
13
16
  profile['browser.download.dir'] = Capybara.save_path
14
17
  profile['browser.download.folderList'] = 2
15
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
16
21
  end
17
22
 
18
23
  Capybara.register_driver :selenium_firefox do |app|
19
24
  # ::Selenium::WebDriver.logger.level = "debug"
20
- Capybara::Selenium::Driver.new(
21
- app,
22
- browser: :firefox,
23
- options: browser_options,
24
- timeout: 31
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
25
29
  # Get a trace level log from geckodriver
26
30
  # :driver_opts => { args: ['-vv'] }
27
- )
31
+ end
32
+
33
+ Capybara::Selenium::Driver.new(app, **driver_options)
28
34
  end
29
35
 
30
36
  Capybara.register_driver :selenium_firefox_not_clear_storage do |app|
31
- Capybara::Selenium::Driver.new(
32
- app,
33
- browser: :firefox,
34
- clear_local_storage: false,
35
- clear_session_storage: false,
36
- options: browser_options
37
- )
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)
38
44
  end
39
45
 
40
46
  module TestSessions
@@ -43,82 +49,127 @@ end
43
49
 
44
50
  skipped_tests = %i[response_headers status_code trigger]
45
51
 
46
- $stdout.puts `#{Selenium::WebDriver::Firefox.driver_path} --version` if ENV['CI']
52
+ Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::Firefox) if ENV['CI']
47
53
 
48
54
  Capybara::SpecHelper.run_specs TestSessions::SeleniumFirefox, 'selenium', capybara_skip: skipped_tests do |example|
49
55
  case example.metadata[:full_description]
50
56
  when 'Capybara::Session selenium node #click should allow multiple modifiers'
51
- pending "Firefox doesn't generate an event for shift+control+click" if firefox_gte?(62, @session) && !Gem.win_platform?
57
+ pending "Firefox on OSX doesn't generate an event for shift+control+click" if firefox_gte?(62, @session) && Selenium::WebDriver::Platform.mac?
52
58
  when /^Capybara::Session selenium node #double_click/
53
59
  pending "selenium-webdriver/geckodriver doesn't generate double click event" if firefox_lt?(59, @session)
54
60
  when 'Capybara::Session selenium #accept_prompt should accept the prompt with a blank response when there is a default'
55
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)
56
- when 'Capybara::Session selenium #attach_file with multipart form should fire change once for each set of files uploaded'
57
- pending 'Gekcodriver appends files so we have to first call clear for multiple files which creates an extra change ' \
58
- 'if files are already set'
59
62
  when 'Capybara::Session selenium #attach_file with multipart form should fire change once when uploading multiple files from empty'
60
63
  pending "FF < 62 doesn't support setting all files at once" if firefox_lt?(62, @session)
61
64
  when 'Capybara::Session selenium #accept_confirm should work with nested modals'
62
- skip 'Broken in FF 63 - https://bugzilla.mozilla.org/show_bug.cgi?id=1487358' if firefox_gte?(63, @session)
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
63
68
  when 'Capybara::Session selenium #click_link can download a file'
64
69
  skip 'Need to figure out testing of file downloading on windows platform' if Gem.win_platform?
65
70
  when 'Capybara::Session selenium #reset_session! removes ALL cookies'
66
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'
67
92
  end
68
93
  end
69
94
 
70
95
  RSpec.describe 'Capybara::Session with firefox' do # rubocop:disable RSpec/MultipleDescribes
71
96
  include Capybara::SpecHelper
72
- include_examples 'Capybara::Session', TestSessions::SeleniumFirefox, :selenium_firefox
73
- include_examples Capybara::RSpecMatchers, TestSessions::SeleniumFirefox, :selenium_firefox
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
127
+ end
128
+ end
74
129
  end
75
130
 
76
131
  RSpec.describe Capybara::Selenium::Driver do
77
- before do
78
- @driver = Capybara::Selenium::Driver.new(TestApp, browser: :firefox, options: browser_options)
79
- end
132
+ let(:driver) { described_class.new(TestApp, browser: :firefox, options: browser_options) }
80
133
 
81
134
  describe '#quit' do
82
135
  it 'should reset browser when quit' do
83
- expect(@driver.browser).to be_truthy
84
- @driver.quit
136
+ expect(driver.browser).to be_truthy
137
+ driver.quit
85
138
  # access instance variable directly so we don't create a new browser instance
86
- expect(@driver.instance_variable_get(:@browser)).to be_nil
139
+ expect(driver.instance_variable_get(:@browser)).to be_nil
87
140
  end
88
141
 
89
142
  context 'with errors' do
90
- before do
91
- @original_browser = @driver.browser
92
- end
143
+ let!(:original_browser) { driver.browser }
93
144
 
94
145
  after do
95
146
  # Ensure browser is actually quit so we don't leave hanging processe
96
- RSpec::Mocks.space.proxy_for(@original_browser).reset
97
- @original_browser.quit
147
+ RSpec::Mocks.space.proxy_for(original_browser).reset
148
+ original_browser.quit
98
149
  end
99
150
 
100
151
  it 'warns UnknownError returned during quit because the browser is probably already gone' do
101
- allow(@driver).to receive(:warn)
102
- allow(@driver.browser).to(
152
+ allow(driver).to receive(:warn)
153
+ allow(driver.browser).to(
103
154
  receive(:quit)
104
155
  .and_raise(Selenium::WebDriver::Error::UnknownError, 'random message')
105
156
  )
106
157
 
107
- expect { @driver.quit }.not_to raise_error
108
- expect(@driver.instance_variable_get(:@browser)).to be_nil
109
- expect(@driver).to have_received(:warn).with(/random message/)
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/)
110
161
  end
111
162
 
112
163
  it 'ignores silenced UnknownError returned during quit because the browser is almost definitely already gone' do
113
- allow(@driver).to receive(:warn)
114
- allow(@driver.browser).to(
164
+ allow(driver).to receive(:warn)
165
+ allow(driver.browser).to(
115
166
  receive(:quit)
116
167
  .and_raise(Selenium::WebDriver::Error::UnknownError, 'Error communicating with the remote browser')
117
168
  )
118
169
 
119
- expect { @driver.quit }.not_to raise_error
120
- expect(@driver.instance_variable_get(:@browser)).to be_nil
121
- expect(@driver).not_to have_received(:warn)
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)
122
173
  end
123
174
  end
124
175
  end
@@ -126,23 +177,23 @@ RSpec.describe Capybara::Selenium::Driver do
126
177
  context 'storage' do
127
178
  describe '#reset!' do
128
179
  it 'clears storage by default' do
129
- @session = TestSessions::SeleniumFirefox
130
- @session.visit('/with_js')
131
- @session.find(:css, '#set-storage').click
132
- @session.reset!
133
- @session.visit('/with_js')
134
- expect(@session.driver.browser.local_storage.keys).to be_empty
135
- expect(@session.driver.browser.session_storage.keys).to be_empty
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
136
187
  end
137
188
 
138
189
  it 'does not clear storage when false' do
139
- @session = Capybara::Session.new(:selenium_firefox_not_clear_storage, TestApp)
140
- @session.visit('/with_js')
141
- @session.find(:css, '#set-storage').click
142
- @session.reset!
143
- @session.visit('/with_js')
144
- expect(@session.driver.browser.local_storage.keys).not_to be_empty
145
- expect(@session.driver.browser.session_storage.keys).not_to be_empty
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
146
197
  end
147
198
  end
148
199
  end
@@ -155,7 +206,7 @@ RSpec.describe Capybara::Selenium::Driver do
155
206
  end
156
207
 
157
208
  RSpec.describe Capybara::Selenium::Node do
158
- context '#click' do
209
+ describe '#click' do
159
210
  it 'warns when attempting on a table row' do
160
211
  session = TestSessions::SeleniumFirefox
161
212
  session.visit('/tables')
@@ -174,13 +225,4 @@ RSpec.describe Capybara::Selenium::Node do
174
225
  expect(session).to have_link('Has been alt control meta')
175
226
  end
176
227
  end
177
-
178
- context '#send_keys' do
179
- it 'should process space' do
180
- session = TestSessions::SeleniumFirefox
181
- session.visit('/form')
182
- session.find(:css, '#address1_city').send_keys('ocean', [:shift, :space, 'side'])
183
- expect(session.find(:css, '#address1_city').value).to eq 'ocean SIDE'
184
- end
185
- end
186
228
  end
@@ -3,6 +3,7 @@
3
3
  require 'spec_helper'
4
4
  require 'selenium-webdriver'
5
5
  require 'shared_selenium_session'
6
+ require 'shared_selenium_node'
6
7
  require 'rspec/shared_spec_matchers'
7
8
 
8
9
  def selenium_host
@@ -20,8 +21,8 @@ def ensure_selenium_running!
20
21
  rescue StandardError
21
22
  if timer.expired?
22
23
  raise 'Selenium is not running. ' \
23
- "You can run a selenium server easily with: \n" \
24
- ' $ docker-compose up -d selenium_firefox'
24
+ "You can run a selenium server easily with: \n. " \
25
+ '$ docker-compose up -d selenium_firefox'
25
26
  else
26
27
  puts 'Waiting for Selenium docker instance...'
27
28
  sleep 1
@@ -34,11 +35,10 @@ Capybara.register_driver :selenium_firefox_remote do |app|
34
35
  ensure_selenium_running!
35
36
 
36
37
  url = "http://#{selenium_host}:#{selenium_port}/wd/hub"
37
- browser_options = ::Selenium::WebDriver::Firefox::Options.new
38
+ browser_options = Selenium::WebDriver::Firefox::Options.new
38
39
 
39
40
  Capybara::Selenium::Driver.new app,
40
41
  browser: :remote,
41
- desired_capabilities: :firefox,
42
42
  options: browser_options,
43
43
  url: url
44
44
  end
@@ -49,12 +49,6 @@ module TestSessions
49
49
  RemoteFirefox = Capybara::Session.new(FIREFOX_REMOTE_DRIVER, TestApp)
50
50
  end
51
51
 
52
- TestSessions::RemoteFirefox.driver.browser.file_detector = lambda do |args|
53
- # args => ["/path/to/file"]
54
- str = args.first.to_s
55
- str if File.exist?(str)
56
- end
57
-
58
52
  skipped_tests = %i[response_headers status_code trigger download]
59
53
 
60
54
  Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVER.to_s, capybara_skip: skipped_tests do |example|
@@ -63,9 +57,6 @@ Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVE
63
57
  skip "Firefox doesn't generate an event for shift+control+click" if firefox_gte?(62, @session)
64
58
  when 'Capybara::Session selenium_firefox_remote #accept_prompt should accept the prompt with a blank response when there is a default'
65
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)
66
- when 'Capybara::Session selenium_firefox_remote #attach_file with multipart form should fire change once for each set of files uploaded'
67
- pending 'Gekcodriver appends files so we have to first call clear for multiple files which creates an extra change ' \
68
- 'if files are already set'
69
60
  when 'Capybara::Session selenium_firefox_remote #attach_file with multipart form should fire change once when uploading multiple files from empty'
70
61
  pending "FF < 62 doesn't support setting all files at once" if firefox_lt?(62, @session)
71
62
  when 'Capybara::Session selenium_firefox_remote #reset_session! removes ALL cookies'
@@ -73,13 +64,29 @@ Capybara::SpecHelper.run_specs TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVE
73
64
  when /#accept_confirm should work with nested modals$/
74
65
  # skip because this is timing based and hence flaky when set to pending
75
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'
76
82
  end
77
83
  end
78
84
 
79
85
  RSpec.describe 'Capybara::Session with remote firefox' do
80
86
  include Capybara::SpecHelper
81
- include_examples 'Capybara::Session', TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVER
82
- include_examples Capybara::RSpecMatchers, TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVER
87
+ ['Capybara::Session', 'Capybara::Node', Capybara::RSpecMatchers].each do |examples|
88
+ include_examples examples, TestSessions::RemoteFirefox, FIREFOX_REMOTE_DRIVER
89
+ end
83
90
 
84
91
  it 'is considered to be firefox' do
85
92
  expect(session.driver.browser.browser).to eq :firefox
@@ -3,9 +3,16 @@
3
3
  require 'spec_helper'
4
4
  require 'selenium-webdriver'
5
5
  require 'shared_selenium_session'
6
+ require 'shared_selenium_node'
6
7
  require 'rspec/shared_spec_matchers'
7
8
 
8
- ::Selenium::WebDriver::IE.driver_path = 'C:\Tools\WebDriver\IEDriverServer.exe' if ENV['CI']
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
9
16
 
10
17
  def selenium_host
11
18
  ENV.fetch('SELENIUM_HOST', '192.168.56.102')
@@ -21,8 +28,8 @@ end
21
28
 
22
29
  Capybara.register_driver :selenium_ie do |app|
23
30
  # ::Selenium::WebDriver.logger.level = "debug"
24
- options = ::Selenium::WebDriver::IE::Options.new
25
- options.require_window_focus = true
31
+ options = Selenium::WebDriver::IE::Options.new
32
+ # options.require_window_focus = true
26
33
  # options.add_option("log", {"level": "trace"})
27
34
 
28
35
  if ENV['REMOTE']
@@ -32,21 +39,13 @@ Capybara.register_driver :selenium_ie do |app|
32
39
  Capybara::Selenium::Driver.new(app,
33
40
  browser: :remote,
34
41
  options: options,
35
- url: url).tap do |driver|
36
- puts driver.browser.capabilities.inspect
37
- driver.browser.file_detector = lambda do |args|
38
- str = args.first.to_s
39
- str if File.exist?(str)
40
- end
41
- end
42
+ url: url)
42
43
  else
43
44
  Capybara::Selenium::Driver.new(
44
45
  app,
45
46
  browser: :ie,
46
47
  options: options
47
- ).tap do |driver|
48
- puts driver.browser.capabilities.inspect
49
- end
48
+ )
50
49
  end
51
50
  end
52
51
 
@@ -58,7 +57,7 @@ TestSessions::SeleniumIE.current_window.resize_to(800, 500)
58
57
 
59
58
  skipped_tests = %i[response_headers status_code trigger modals hover form_attribute windows]
60
59
 
61
- $stdout.puts `#{Selenium::WebDriver::IE.driver_path} --version` if ENV['CI']
60
+ Capybara::SpecHelper.log_selenium_driver_version(Selenium::WebDriver::IE) if ENV['CI']
62
61
 
63
62
  TestSessions::SeleniumIE.current_window.resize_to(1600, 1200)
64
63
 
@@ -72,13 +71,10 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumIE, 'selenium', capybara_sk
72
71
  pending "IE 11 doesn't support date input types"
73
72
  when /#click_link_or_button with :disabled option happily clicks on links which incorrectly have the disabled attribute$/
74
73
  skip 'IE 11 obeys non-standard disabled attribute on anchor tag'
75
- when /#right_click should allow modifiers$/
76
- skip "Windows can't :meta click because :meta triggers start menu"
77
- when /#click should allow modifiers$/
74
+ when /#click should allow modifiers$/, /#double_click should allow modifiers$/
78
75
  pending "Doesn't work with IE for some unknown reason$"
79
- when /#double_click should allow modifiers$/
80
76
  pending "Doesn't work with IE for some unknown reason$"
81
- when /#click should allow multiple modifiers$/
77
+ when /#click should allow multiple modifiers$/, /#right_click should allow modifiers$/
82
78
  skip "Windows can't :meta click because :meta triggers start menu"
83
79
  when /#double_click should allow multiple modifiers$/
84
80
  skip "Windows can't :alt double click due to being properties shortcut"
@@ -92,7 +88,7 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumIE, 'selenium', capybara_sk
92
88
  pending "Window 7 and 8.1 don't support 308 http status code"
93
89
  when /#scroll_to can scroll an element to the center of the viewport$/,
94
90
  /#scroll_to can scroll an element to the center of the scrolling element$/
95
- pending " IE doesn't support ScrollToOptions"
91
+ pending "IE doesn't support ScrollToOptions"
96
92
  when /#attach_file with multipart form should fire change once for each set of files uploaded$/,
97
93
  /#attach_file with multipart form should fire change once when uploading multiple files from empty$/,
98
94
  /#attach_file with multipart form should not break when using HTML5 multiple file input uploading multiple files$/
@@ -104,13 +100,24 @@ Capybara::SpecHelper.run_specs TestSessions::SeleniumIE, 'selenium', capybara_sk
104
100
  # pending "IE driver doesn't error when clicking on covered elements, it just clicks the wrong element"
105
101
  when /#click should go to the same page if href is blank$/
106
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"
107
113
  end
108
114
  end
109
115
 
110
116
  RSpec.describe 'Capybara::Session with Internet Explorer', capybara_skip: skipped_tests do # rubocop:disable RSpec/MultipleDescribes
111
117
  include Capybara::SpecHelper
112
- include_examples 'Capybara::Session', TestSessions::SeleniumIE, :selenium_ie
113
- include_examples Capybara::RSpecMatchers, TestSessions::SeleniumIE, :selenium_ie
118
+ ['Capybara::Session', 'Capybara::Node', Capybara::RSpecMatchers].each do |examples|
119
+ include_examples examples, TestSessions::SeleniumIE, :selenium_ie
120
+ end
114
121
  end
115
122
 
116
123
  RSpec.describe Capybara::Selenium::Node do