capybara 3.3.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.
Files changed (308) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +803 -13
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +25 -9
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +17 -3
  9. data/lib/capybara/driver/node.rb +31 -6
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +31 -7
  12. data/lib/capybara/minitest/spec.rb +180 -88
  13. data/lib/capybara/minitest.rb +262 -149
  14. data/lib/capybara/node/actions.rb +202 -116
  15. data/lib/capybara/node/base.rb +34 -19
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +10 -12
  18. data/lib/capybara/node/element.rb +269 -115
  19. data/lib/capybara/node/finders.rb +99 -77
  20. data/lib/capybara/node/matchers.rb +327 -151
  21. data/lib/capybara/node/simple.rb +48 -13
  22. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  23. data/lib/capybara/queries/active_element_query.rb +18 -0
  24. data/lib/capybara/queries/ancestor_query.rb +8 -9
  25. data/lib/capybara/queries/base_query.rb +23 -16
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +1 -0
  28. data/lib/capybara/queries/selector_query.rb +587 -130
  29. data/lib/capybara/queries/sibling_query.rb +8 -6
  30. data/lib/capybara/queries/style_query.rb +6 -2
  31. data/lib/capybara/queries/text_query.rb +28 -14
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +92 -25
  34. data/lib/capybara/rack_test/driver.rb +16 -7
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +68 -41
  37. data/lib/capybara/rack_test/node.rb +106 -39
  38. data/lib/capybara/rails.rb +1 -1
  39. data/lib/capybara/registration_container.rb +41 -0
  40. data/lib/capybara/registrations/drivers.rb +42 -0
  41. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/lib/capybara/registrations/servers.rb +66 -0
  43. data/lib/capybara/result.rb +75 -52
  44. data/lib/capybara/rspec/features.rb +7 -7
  45. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  46. data/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/lib/capybara/rspec/matchers.rb +141 -339
  60. data/lib/capybara/rspec.rb +2 -0
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/lib/capybara/selector/css.rb +27 -25
  64. data/lib/capybara/selector/definition/button.rb +68 -0
  65. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/lib/capybara/selector/definition/css.rb +10 -0
  67. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/lib/capybara/selector/definition/element.rb +28 -0
  70. data/lib/capybara/selector/definition/field.rb +40 -0
  71. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/lib/capybara/selector/definition/id.rb +6 -0
  76. data/lib/capybara/selector/definition/label.rb +62 -0
  77. data/lib/capybara/selector/definition/link.rb +55 -0
  78. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/lib/capybara/selector/definition/option.rb +27 -0
  80. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/lib/capybara/selector/definition/select.rb +81 -0
  82. data/lib/capybara/selector/definition/table.rb +109 -0
  83. data/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/lib/capybara/selector/definition.rb +280 -0
  86. data/lib/capybara/selector/filter.rb +1 -0
  87. data/lib/capybara/selector/filter_set.rb +73 -25
  88. data/lib/capybara/selector/filters/base.rb +24 -5
  89. data/lib/capybara/selector/filters/expression_filter.rb +3 -3
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +16 -2
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +85 -348
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -447
  96. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/lib/capybara/selenium/driver.rb +255 -143
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +93 -11
  102. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/lib/capybara/selenium/node.rb +436 -134
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  115. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  118. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/lib/capybara/server/animation_disabler.rb +56 -19
  123. data/lib/capybara/server/checker.rb +9 -3
  124. data/lib/capybara/server/middleware.rb +28 -12
  125. data/lib/capybara/server.rb +33 -10
  126. data/lib/capybara/session/config.rb +34 -10
  127. data/lib/capybara/session/matchers.rb +23 -16
  128. data/lib/capybara/session.rb +230 -170
  129. data/lib/capybara/spec/public/jquery.js +5 -5
  130. data/lib/capybara/spec/public/offset.js +6 -0
  131. data/lib/capybara/spec/public/test.js +121 -8
  132. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  133. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  134. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  135. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  136. data/lib/capybara/spec/session/all_spec.rb +127 -40
  137. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  138. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  139. data/lib/capybara/spec/session/assert_current_path_spec.rb +21 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +52 -58
  141. data/lib/capybara/spec/session/assert_style_spec.rb +7 -7
  142. data/lib/capybara/spec/session/assert_text_spec.rb +74 -50
  143. data/lib/capybara/spec/session/assert_title_spec.rb +12 -12
  144. data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
  145. data/lib/capybara/spec/session/body_spec.rb +6 -6
  146. data/lib/capybara/spec/session/check_spec.rb +102 -47
  147. data/lib/capybara/spec/session/choose_spec.rb +58 -32
  148. data/lib/capybara/spec/session/click_button_spec.rb +219 -163
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -23
  150. data/lib/capybara/spec/session/click_link_spec.rb +77 -54
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +38 -29
  153. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  154. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  155. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +8 -8
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +16 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +68 -56
  159. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  160. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  161. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  162. data/lib/capybara/spec/session/fill_in_spec.rb +101 -46
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
  165. data/lib/capybara/spec/session/find_field_spec.rb +32 -30
  166. data/lib/capybara/spec/session/find_link_spec.rb +31 -21
  167. data/lib/capybara/spec/session/find_spec.rb +244 -141
  168. data/lib/capybara/spec/session/first_spec.rb +43 -43
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +30 -18
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +45 -18
  173. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  174. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  175. data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
  176. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  177. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  178. data/lib/capybara/spec/session/has_button_spec.rb +94 -13
  179. data/lib/capybara/spec/session/has_css_spec.rb +272 -132
  180. data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
  181. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +44 -4
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +31 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +111 -71
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +181 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +101 -53
  190. data/lib/capybara/spec/session/has_title_spec.rb +19 -14
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
  192. data/lib/capybara/spec/session/headers_spec.rb +1 -1
  193. data/lib/capybara/spec/session/html_spec.rb +13 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  195. data/lib/capybara/spec/session/node_spec.rb +894 -142
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +63 -35
  199. data/lib/capybara/spec/session/response_code_spec.rb +1 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
  202. data/lib/capybara/spec/session/save_page_spec.rb +37 -37
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +10 -10
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  206. data/lib/capybara/spec/session/select_spec.rb +85 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +49 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +25 -24
  210. data/lib/capybara/spec/session/title_spec.rb +7 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +33 -21
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +68 -49
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
  216. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +20 -16
  217. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +6 -2
  218. data/lib/capybara/spec/session/window/window_spec.rb +62 -63
  219. data/lib/capybara/spec/session/window/windows_spec.rb +5 -1
  220. data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
  221. data/lib/capybara/spec/session/within_spec.rb +79 -42
  222. data/lib/capybara/spec/spec_helper.rb +41 -53
  223. data/lib/capybara/spec/test_app.rb +132 -43
  224. data/lib/capybara/spec/views/animated.erb +49 -0
  225. data/lib/capybara/spec/views/form.erb +139 -42
  226. data/lib/capybara/spec/views/frame_child.erb +4 -3
  227. data/lib/capybara/spec/views/frame_one.erb +2 -1
  228. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  229. data/lib/capybara/spec/views/frame_two.erb +1 -1
  230. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  231. data/lib/capybara/spec/views/layout.erb +10 -0
  232. data/lib/capybara/spec/views/obscured.erb +47 -0
  233. data/lib/capybara/spec/views/offset.erb +33 -0
  234. data/lib/capybara/spec/views/path.erb +2 -2
  235. data/lib/capybara/spec/views/popup_one.erb +1 -1
  236. data/lib/capybara/spec/views/popup_two.erb +1 -1
  237. data/lib/capybara/spec/views/react.erb +45 -0
  238. data/lib/capybara/spec/views/scroll.erb +21 -0
  239. data/lib/capybara/spec/views/spatial.erb +31 -0
  240. data/lib/capybara/spec/views/tables.erb +67 -0
  241. data/lib/capybara/spec/views/with_animation.erb +39 -4
  242. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  243. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  244. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  245. data/lib/capybara/spec/views/with_hover.erb +3 -2
  246. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  247. data/lib/capybara/spec/views/with_html.erb +37 -9
  248. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  249. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  250. data/lib/capybara/spec/views/with_js.erb +26 -5
  251. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  252. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  253. data/lib/capybara/spec/views/with_scope.erb +2 -2
  254. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  255. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  256. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  257. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  258. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  259. data/lib/capybara/spec/views/with_windows.erb +1 -1
  260. data/lib/capybara/spec/views/within_frames.erb +1 -1
  261. data/lib/capybara/version.rb +1 -1
  262. data/lib/capybara/window.rb +19 -25
  263. data/lib/capybara.rb +126 -111
  264. data/spec/basic_node_spec.rb +59 -34
  265. data/spec/capybara_spec.rb +56 -44
  266. data/spec/counter_spec.rb +35 -0
  267. data/spec/css_builder_spec.rb +101 -0
  268. data/spec/css_splitter_spec.rb +8 -8
  269. data/spec/dsl_spec.rb +79 -52
  270. data/spec/filter_set_spec.rb +9 -9
  271. data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
  272. data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
  273. data/spec/minitest_spec.rb +45 -7
  274. data/spec/minitest_spec_spec.rb +87 -64
  275. data/spec/per_session_config_spec.rb +6 -6
  276. data/spec/rack_test_spec.rb +172 -116
  277. data/spec/regexp_dissassembler_spec.rb +250 -0
  278. data/spec/result_spec.rb +80 -72
  279. data/spec/rspec/features_spec.rb +21 -16
  280. data/spec/rspec/scenarios_spec.rb +10 -6
  281. data/spec/rspec/shared_spec_matchers.rb +407 -365
  282. data/spec/rspec/views_spec.rb +3 -3
  283. data/spec/rspec_matchers_spec.rb +35 -10
  284. data/spec/rspec_spec.rb +63 -41
  285. data/spec/sauce_spec_chrome.rb +43 -0
  286. data/spec/selector_spec.rb +334 -89
  287. data/spec/selenium_spec_chrome.rb +176 -62
  288. data/spec/selenium_spec_chrome_remote.rb +54 -14
  289. data/spec/selenium_spec_edge.rb +41 -8
  290. data/spec/selenium_spec_firefox.rb +228 -0
  291. data/spec/selenium_spec_firefox_remote.rb +94 -0
  292. data/spec/selenium_spec_ie.rb +129 -11
  293. data/spec/selenium_spec_safari.rb +162 -0
  294. data/spec/server_spec.rb +171 -97
  295. data/spec/session_spec.rb +34 -18
  296. data/spec/shared_selenium_node.rb +79 -0
  297. data/spec/shared_selenium_session.rb +344 -80
  298. data/spec/spec_helper.rb +124 -2
  299. data/spec/whitespace_normalizer_spec.rb +54 -0
  300. data/spec/xpath_builder_spec.rb +93 -0
  301. metadata +326 -28
  302. data/lib/capybara/rspec/compound.rb +0 -94
  303. data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +0 -31
  304. data/lib/capybara/selenium/nodes/marionette_node.rb +0 -31
  305. data/lib/capybara/spec/session/has_style_spec.rb +0 -25
  306. data/lib/capybara/spec/session/source_spec.rb +0 -0
  307. data/lib/capybara/spec/views/with_title.erb +0 -5
  308. data/spec/selenium_spec_marionette.rb +0 -167
@@ -1,94 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- if defined?(::RSpec::Expectations::Version)
4
- module Capybara
5
- module RSpecMatchers
6
- module Compound
7
- include ::RSpec::Matchers::Composable
8
-
9
- def and(matcher)
10
- And.new(self, matcher)
11
- end
12
-
13
- def and_then(matcher)
14
- ::RSpec::Matchers::BuiltIn::Compound::And.new(self, matcher)
15
- end
16
-
17
- def or(matcher)
18
- Or.new(self, matcher)
19
- end
20
-
21
- class CapybaraEvaluator
22
- def initialize(actual)
23
- @actual = actual
24
- @match_results = Hash.new { |h, matcher| h[matcher] = matcher.matches?(@actual) }
25
- end
26
-
27
- def matcher_matches?(matcher)
28
- @match_results[matcher]
29
- end
30
-
31
- def reset
32
- @match_results.clear
33
- end
34
- end
35
-
36
- class And < ::RSpec::Matchers::BuiltIn::Compound::And
37
- private
38
-
39
- def match(_expected, actual)
40
- @evaluator = CapybaraEvaluator.new(actual)
41
- syncer = sync_element(actual)
42
- begin
43
- syncer.synchronize do
44
- @evaluator.reset
45
- raise ::Capybara::ElementNotFound unless [matcher_1_matches?, matcher_2_matches?].all?
46
- true
47
- end
48
- rescue StandardError
49
- false
50
- end
51
- end
52
-
53
- def sync_element(el)
54
- if el.respond_to? :synchronize
55
- el
56
- elsif el.respond_to? :current_scope
57
- el.current_scope
58
- else
59
- Capybara.string(el)
60
- end
61
- end
62
- end
63
-
64
- class Or < ::RSpec::Matchers::BuiltIn::Compound::Or
65
- private
66
-
67
- def match(_expected, actual)
68
- @evaluator = CapybaraEvaluator.new(actual)
69
- syncer = sync_element(actual)
70
- begin
71
- syncer.synchronize do
72
- @evaluator.reset
73
- raise ::Capybara::ElementNotFound unless [matcher_1_matches?, matcher_2_matches?].any?
74
- true
75
- end
76
- rescue StandardError
77
- false
78
- end
79
- end
80
-
81
- def sync_element(el)
82
- if el.respond_to? :synchronize
83
- el
84
- elsif el.respond_to? :current_scope
85
- el.current_scope
86
- else
87
- Capybara.string(el)
88
- end
89
- end
90
- end
91
- end
92
- end
93
- end
94
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'capybara/selenium/nodes/marionette_node'
4
-
5
- module Capybara::Selenium::Driver::MarionetteDriver
6
- def resize_window_to(handle, width, height)
7
- within_given_window(handle) do
8
- # Don't set the size if already set - See https://github.com/mozilla/geckodriver/issues/643
9
- if window_size(handle) == [width, height]
10
- {}
11
- else
12
- super
13
- end
14
- end
15
- end
16
-
17
- def reset!
18
- # Use instance variable directly so we avoid starting the browser just to reset the session
19
- return unless @browser
20
-
21
- switch_to_window(window_handles.first)
22
- window_handles.slice(1..-1).each { |win| close_window(win) }
23
- super
24
- end
25
-
26
- private
27
-
28
- def build_node(native_node)
29
- ::Capybara::Selenium::MarionetteNode.new(self, native_node)
30
- end
31
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class Capybara::Selenium::MarionetteNode < Capybara::Selenium::Node
4
- def click(keys = [], **options)
5
- super
6
- rescue ::Selenium::WebDriver::Error::ElementNotInteractableError
7
- if tag_name == "tr"
8
- warn "You are attempting to click a table row which has issues in geckodriver/marionette - see https://github.com/mozilla/geckodriver/issues/1228. " \
9
- "Your test should probably be clicking on a table cell like a user would. Clicking the first cell in the row instead."
10
- return find_css('th:first-child,td:first-child')[0].click
11
- end
12
- raise
13
- end
14
-
15
- def disabled?
16
- return true if super
17
-
18
- # workaround for selenium-webdriver/geckodriver reporting elements as enabled when they are nested in disabling elements
19
- if %w[option optgroup].include? tag_name
20
- find_xpath("parent::*[self::optgroup or self::select]")[0].disabled?
21
- else
22
- !find_xpath("parent::fieldset[@disabled] | ancestor::*[not(self::legend) or preceding-sibling::legend][parent::fieldset[@disabled]]").empty?
23
- end
24
- end
25
-
26
- def set_file(value) # rubocop:disable Naming/AccessorMethodName
27
- path_names = value.to_s.empty? ? [] : value
28
- native.clear
29
- Array(path_names).each { |p| native.send_keys(p) }
30
- end
31
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Capybara::SpecHelper.spec '#has_style?', requires: [:css] do
4
- before do
5
- @session.visit('/with_html')
6
- end
7
-
8
- it "should be true if the element has the given style" do
9
- expect(@session.find(:css, '#first')).to have_style(display: 'block')
10
- expect(@session.find(:css, '#first').has_style?(display: 'block')).to be true
11
- expect(@session.find(:css, '#second')).to have_style('display' => 'inline')
12
- expect(@session.find(:css, '#second').has_style?('display' => 'inline')).to be true
13
- end
14
-
15
- it "should be false if the element does not have the given style" do
16
- expect(@session.find(:css, '#first').has_style?('display' => 'inline')).to be false
17
- expect(@session.find(:css, '#second').has_style?(display: 'block')).to be false
18
- end
19
-
20
- it "allows Regexp for value matching" do
21
- expect(@session.find(:css, '#first')).to have_style(display: /^bl/)
22
- expect(@session.find(:css, '#first').has_style?('display' => /^bl/)).to be true
23
- expect(@session.find(:css, '#first').has_style?(display: /^in/)).to be false
24
- end
25
- end
File without changes
@@ -1,5 +0,0 @@
1
-
2
- <title>Test Title</title>
3
- <body>
4
- <svg><title>abcdefg</title></svg>
5
- </body>
@@ -1,167 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'spec_helper'
4
- require "selenium-webdriver"
5
- require 'shared_selenium_session'
6
- require 'rspec/shared_spec_matchers'
7
-
8
- browser_options = ::Selenium::WebDriver::Firefox::Options.new
9
- browser_options.args << '--headless' if ENV['HEADLESS']
10
- browser_options.add_preference 'dom.file.createInChild', true
11
- # browser_options.add_option("log", {"level": "trace"})
12
-
13
- browser_options.profile = Selenium::WebDriver::Firefox::Profile.new.tap do |profile|
14
- profile['browser.download.dir'] = Capybara.save_path
15
- profile['browser.download.folderList'] = 2
16
- profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/csv'
17
- end
18
-
19
- Capybara.register_driver :selenium_marionette do |app|
20
- # ::Selenium::WebDriver.logger.level = "debug"
21
- Capybara::Selenium::Driver.new(
22
- app,
23
- browser: :firefox,
24
- desired_capabilities: { marionette: true, 'moz:webdriverClick': true },
25
- options: browser_options,
26
- # Get a trace level log from geckodriver
27
- # :driver_opts => { args: ['-vv'] }
28
- )
29
- end
30
-
31
- Capybara.register_driver :selenium_marionette_clear_storage do |app|
32
- Capybara::Selenium::Driver.new(
33
- app,
34
- browser: :firefox,
35
- desired_capabilities: { marionette: true },
36
- clear_local_storage: true,
37
- clear_session_storage: true,
38
- options: browser_options
39
- )
40
- end
41
-
42
- module TestSessions
43
- SeleniumMarionette = Capybara::Session.new(:selenium_marionette, TestApp)
44
- end
45
-
46
- skipped_tests = %i[response_headers status_code trigger]
47
- skipped_tests << :windows if ENV['TRAVIS'] && ENV['SKIP_WINDOW']
48
-
49
- $stdout.puts `#{Selenium::WebDriver::Firefox.driver_path} --version` if ENV['CI']
50
-
51
- Capybara::SpecHelper.run_specs TestSessions::SeleniumMarionette, "selenium", capybara_skip: skipped_tests
52
-
53
- RSpec.describe "Capybara::Session with firefox" do # rubocop:disable RSpec/MultipleDescribes
54
- include Capybara::SpecHelper
55
- include_examples "Capybara::Session", TestSessions::SeleniumMarionette, :selenium_marionette
56
- include_examples Capybara::RSpecMatchers, TestSessions::SeleniumMarionette, :selenium_marionette
57
- end
58
-
59
- RSpec.describe Capybara::Selenium::Driver do
60
- before do
61
- @driver = Capybara::Selenium::Driver.new(TestApp, browser: :firefox, options: browser_options)
62
- end
63
-
64
- describe '#quit' do
65
- it "should reset browser when quit" do
66
- expect(@driver.browser).to be_truthy
67
- @driver.quit
68
- # access instance variable directly so we don't create a new browser instance
69
- expect(@driver.instance_variable_get(:@browser)).to be_nil
70
- end
71
-
72
- context "with errors" do
73
- before do
74
- @original_browser = @driver.browser
75
- end
76
-
77
- after do
78
- # Ensure browser is actually quit so we don't leave hanging processe
79
- RSpec::Mocks.space.proxy_for(@original_browser).reset
80
- @original_browser.quit
81
- end
82
-
83
- it "warns UnknownError returned during quit because the browser is probably already gone" do
84
- allow(@driver).to receive(:warn)
85
- allow(@driver.browser).to(
86
- receive(:quit)
87
- .and_raise(Selenium::WebDriver::Error::UnknownError, "random message")
88
- )
89
-
90
- expect { @driver.quit }.not_to raise_error
91
- expect(@driver.instance_variable_get(:@browser)).to be_nil
92
- expect(@driver).to have_received(:warn).with(/random message/)
93
- end
94
-
95
- it "ignores silenced UnknownError returned during quit because the browser is almost definitely already gone" do
96
- allow(@driver).to receive(:warn)
97
- allow(@driver.browser).to(
98
- receive(:quit)
99
- .and_raise(Selenium::WebDriver::Error::UnknownError, "Error communicating with the remote browser")
100
- )
101
-
102
- expect { @driver.quit }.not_to raise_error
103
- expect(@driver.instance_variable_get(:@browser)).to be_nil
104
- expect(@driver).not_to have_received(:warn)
105
- end
106
- end
107
- end
108
-
109
- context "storage" do
110
- describe "#reset!" do
111
- it "does not clear either storage by default" do
112
- @session = TestSessions::SeleniumMarionette
113
- @session.visit('/with_js')
114
- @session.find(:css, '#set-storage').click
115
- @session.reset!
116
- @session.visit('/with_js')
117
- expect(@session.driver.browser.local_storage.keys).not_to be_empty
118
- expect(@session.driver.browser.session_storage.keys).not_to be_empty
119
- end
120
-
121
- it "clears storage when set" do
122
- @session = Capybara::Session.new(:selenium_marionette_clear_storage, TestApp)
123
- @session.visit('/with_js')
124
- @session.find(:css, '#set-storage').click
125
- @session.reset!
126
- @session.visit('/with_js')
127
- expect(@session.driver.browser.local_storage.keys).to be_empty
128
- expect(@session.driver.browser.session_storage.keys).to be_empty
129
- end
130
- end
131
- end
132
-
133
- context "#refresh" do
134
- def extract_results(session)
135
- expect(session).to have_xpath("//pre[@id='results']")
136
- YAML.load Nokogiri::HTML(session.body).xpath("//pre[@id='results']").first.inner_html.lstrip
137
- end
138
-
139
- it "can repost by accepting confirm" do
140
- @session = TestSessions::SeleniumMarionette
141
- @session.visit('/form')
142
- @session.select('Sweden', from: 'form_region')
143
- @session.click_button('awesome')
144
- sleep 1
145
- expect do
146
- @session.accept_confirm(wait: 0.1) do
147
- @session.refresh
148
- sleep 2
149
- end
150
- sleep 1
151
- end.to change { extract_results(@session)['post_count'] }.by(1)
152
- end
153
- end
154
- end
155
-
156
- RSpec.describe Capybara::Selenium::Node do
157
- context "#click" do
158
- it "warns when attempting on a table row" do
159
- session = TestSessions::SeleniumMarionette
160
- session.visit('/tables')
161
- tr = session.find(:css, '#agent_table tr:first-child')
162
- allow(tr.base).to receive(:warn)
163
- tr.click
164
- expect(tr.base).to have_received(:warn).with(/Clicking the first cell in the row instead/)
165
- end
166
- end
167
- end