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.
Files changed (312) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +891 -12
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +29 -10
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +22 -4
  9. data/lib/capybara/driver/node.rb +38 -9
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +57 -8
  12. data/lib/capybara/minitest/spec.rb +185 -84
  13. data/lib/capybara/minitest.rb +264 -145
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +35 -20
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +13 -15
  18. data/lib/capybara/node/element.rb +350 -113
  19. data/lib/capybara/node/finders.rb +104 -82
  20. data/lib/capybara/node/matchers.rb +363 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  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 +9 -10
  25. data/lib/capybara/queries/base_query.rb +25 -18
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +11 -0
  28. data/lib/capybara/queries/selector_query.rb +617 -104
  29. data/lib/capybara/queries/sibling_query.rb +9 -7
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +40 -22
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +106 -31
  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 +74 -49
  37. data/lib/capybara/rack_test/node.rb +120 -47
  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 +87 -53
  44. data/lib/capybara/rspec/features.rb +8 -10
  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 +142 -315
  60. data/lib/capybara/rspec.rb +3 -2
  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 +85 -8
  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 +72 -28
  88. data/lib/capybara/selector/filters/base.rb +45 -2
  89. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +89 -200
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -534
  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 +270 -245
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  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 +460 -170
  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 +80 -0
  123. data/lib/capybara/server/checker.rb +44 -0
  124. data/lib/capybara/server/middleware.rb +71 -0
  125. data/lib/capybara/server.rb +58 -67
  126. data/lib/capybara/session/config.rb +40 -6
  127. data/lib/capybara/session/matchers.rb +26 -19
  128. data/lib/capybara/session.rb +252 -194
  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 +126 -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 +135 -44
  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.rb → assert_current_path_spec.rb} +20 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  141. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  142. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
  143. data/lib/capybara/spec/session/{assert_title.rb → 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 +11 -13
  146. data/lib/capybara/spec/session/check_spec.rb +112 -51
  147. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  148. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  150. data/lib/capybara/spec/session/click_link_spec.rb +89 -55
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  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.rb → assert_match_selector_spec.rb} +11 -9
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -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 +110 -44
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  165. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  166. data/lib/capybara/spec/session/find_link_spec.rb +42 -14
  167. data/lib/capybara/spec/session/find_spec.rb +251 -142
  168. data/lib/capybara/spec/session/first_spec.rb +45 -44
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
  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 +98 -12
  179. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  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 +46 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
  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.rb → 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 +958 -122
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +65 -37
  199. data/lib/capybara/spec/session/{response_code.rb → 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 +5 -4
  202. data/lib/capybara/spec/session/save_page_spec.rb +41 -38
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
  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 +102 -76
  207. data/lib/capybara/spec/session/selectors_spec.rb +51 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +26 -24
  210. data/lib/capybara/spec/session/title_spec.rb +8 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +41 -22
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +79 -53
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
  219. data/lib/capybara/spec/session/window/window_spec.rb +88 -54
  220. data/lib/capybara/spec/session/window/windows_spec.rb +11 -8
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +82 -44
  223. data/lib/capybara/spec/spec_helper.rb +46 -52
  224. data/lib/capybara/spec/test_app.rb +148 -41
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +156 -42
  227. data/lib/capybara/spec/views/frame_child.erb +4 -3
  228. data/lib/capybara/spec/views/frame_one.erb +2 -1
  229. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  230. data/lib/capybara/spec/views/frame_two.erb +1 -1
  231. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  232. data/lib/capybara/spec/views/layout.erb +10 -0
  233. data/lib/capybara/spec/views/obscured.erb +47 -0
  234. data/lib/capybara/spec/views/offset.erb +33 -0
  235. data/lib/capybara/spec/views/path.erb +2 -2
  236. data/lib/capybara/spec/views/popup_one.erb +1 -1
  237. data/lib/capybara/spec/views/popup_two.erb +1 -1
  238. data/lib/capybara/spec/views/react.erb +45 -0
  239. data/lib/capybara/spec/views/scroll.erb +21 -0
  240. data/lib/capybara/spec/views/spatial.erb +31 -0
  241. data/lib/capybara/spec/views/tables.erb +68 -1
  242. data/lib/capybara/spec/views/with_animation.erb +81 -0
  243. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  244. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  245. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  246. data/lib/capybara/spec/views/with_hover.erb +3 -2
  247. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  248. data/lib/capybara/spec/views/with_html.erb +46 -11
  249. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  250. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  251. data/lib/capybara/spec/views/with_js.erb +30 -5
  252. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  253. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  254. data/lib/capybara/spec/views/with_scope.erb +2 -2
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  257. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  258. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  259. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  260. data/lib/capybara/spec/views/with_windows.erb +1 -1
  261. data/lib/capybara/spec/views/within_frames.erb +1 -1
  262. data/lib/capybara/version.rb +1 -1
  263. data/lib/capybara/window.rb +32 -26
  264. data/lib/capybara.rb +128 -104
  265. data/spec/basic_node_spec.rb +59 -34
  266. data/spec/capybara_spec.rb +65 -51
  267. data/spec/counter_spec.rb +35 -0
  268. data/spec/css_builder_spec.rb +101 -0
  269. data/spec/css_splitter_spec.rb +38 -0
  270. data/spec/dsl_spec.rb +84 -55
  271. data/spec/filter_set_spec.rb +24 -7
  272. data/spec/fixtures/certificate.pem +25 -0
  273. data/spec/fixtures/key.pem +27 -0
  274. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
  275. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
  276. data/spec/minitest_spec.rb +49 -5
  277. data/spec/minitest_spec_spec.rb +92 -62
  278. data/spec/per_session_config_spec.rb +6 -6
  279. data/spec/rack_test_spec.rb +183 -115
  280. data/spec/regexp_dissassembler_spec.rb +250 -0
  281. data/spec/result_spec.rb +99 -39
  282. data/spec/rspec/features_spec.rb +28 -25
  283. data/spec/rspec/scenarios_spec.rb +10 -6
  284. data/spec/rspec/shared_spec_matchers.rb +418 -364
  285. data/spec/rspec/views_spec.rb +4 -3
  286. data/spec/rspec_matchers_spec.rb +35 -10
  287. data/spec/rspec_spec.rb +109 -85
  288. data/spec/sauce_spec_chrome.rb +43 -0
  289. data/spec/selector_spec.rb +392 -62
  290. data/spec/selenium_spec_chrome.rb +183 -41
  291. data/spec/selenium_spec_chrome_remote.rb +96 -0
  292. data/spec/selenium_spec_edge.rb +41 -8
  293. data/spec/selenium_spec_firefox.rb +228 -0
  294. data/spec/selenium_spec_firefox_remote.rb +94 -0
  295. data/spec/selenium_spec_ie.rb +129 -11
  296. data/spec/selenium_spec_safari.rb +162 -0
  297. data/spec/server_spec.rb +192 -81
  298. data/spec/session_spec.rb +52 -16
  299. data/spec/shared_selenium_node.rb +79 -0
  300. data/spec/shared_selenium_session.rb +460 -123
  301. data/spec/spec_helper.rb +124 -2
  302. data/spec/whitespace_normalizer_spec.rb +54 -0
  303. data/spec/xpath_builder_spec.rb +93 -0
  304. metadata +344 -45
  305. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  306. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  307. data/.yard/yard_extensions.rb +0 -78
  308. data/lib/capybara/rspec/compound.rb +0 -90
  309. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  310. data/lib/capybara/spec/session/source_spec.rb +0 -0
  311. data/lib/capybara/spec/views/with_title.erb +0 -5
  312. data/spec/selenium_spec_marionette.rb +0 -143
@@ -0,0 +1,119 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#scroll_to', requires: [:scroll] do
4
+ before do
5
+ @session.visit('/scroll')
6
+ end
7
+
8
+ it 'can scroll an element to the top of the viewport' do
9
+ el = @session.find(:css, '#scroll')
10
+ @session.scroll_to(el, align: :top)
11
+ expect(el.evaluate_script('this.getBoundingClientRect().top')).to be_within(1).of(0)
12
+ end
13
+
14
+ it 'can scroll an element to the bottom of the viewport' do
15
+ el = @session.find(:css, '#scroll')
16
+ @session.scroll_to(el, align: :bottom)
17
+ el_bottom = el.evaluate_script('this.getBoundingClientRect().bottom')
18
+ viewport_bottom = el.evaluate_script('document.documentElement.clientHeight')
19
+ expect(el_bottom).to be_within(1).of(viewport_bottom)
20
+ end
21
+
22
+ it 'can scroll an element to the center of the viewport' do
23
+ el = @session.find(:css, '#scroll')
24
+ @session.scroll_to(el, align: :center)
25
+ el_center = el.evaluate_script('(function(rect){return (rect.top + rect.bottom)/2})(this.getBoundingClientRect())')
26
+ viewport_bottom = el.evaluate_script('document.documentElement.clientHeight')
27
+ expect(el_center).to be_within(2).of(viewport_bottom / 2)
28
+ end
29
+
30
+ it 'can scroll the window to the vertical top' do
31
+ @session.scroll_to :bottom
32
+ @session.scroll_to :top
33
+ expect(@session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')).to eq [0, 0]
34
+ end
35
+
36
+ it 'can scroll the window to the vertical bottom' do
37
+ @session.scroll_to :bottom
38
+ max_scroll = @session.evaluate_script('document.documentElement.scrollHeight - document.documentElement.clientHeight')
39
+ scrolled_location_x, scrolled_location_y = @session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')
40
+ expect(scrolled_location_x).to be_within(0.5).of(0)
41
+ expect(scrolled_location_y).to be_within(0.5).of(max_scroll)
42
+ end
43
+
44
+ it 'can scroll the window to the vertical center' do
45
+ @session.scroll_to :center
46
+ max_scroll = @session.evaluate_script('document.documentElement.scrollHeight - document.documentElement.clientHeight')
47
+ expect(@session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')).to eq [0, max_scroll / 2]
48
+ end
49
+
50
+ it 'can scroll the window to specific location' do
51
+ @session.scroll_to 100, 100
52
+ expect(@session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')).to eq [100, 100]
53
+ end
54
+
55
+ it 'can scroll an element to the top of the scrolling element' do
56
+ scrolling_element = @session.find(:css, '#scrollable')
57
+ el = scrolling_element.find(:css, '#inner')
58
+ scrolling_element.scroll_to(el, align: :top)
59
+ scrolling_element_top = scrolling_element.evaluate_script('this.getBoundingClientRect().top')
60
+ expect(el.evaluate_script('this.getBoundingClientRect().top')).to be_within(3).of(scrolling_element_top)
61
+ end
62
+
63
+ it 'can scroll an element to the bottom of the scrolling element' do
64
+ scrolling_element = @session.find(:css, '#scrollable')
65
+ el = scrolling_element.find(:css, '#inner')
66
+ scrolling_element.scroll_to(el, align: :bottom)
67
+ el_bottom = el.evaluate_script('this.getBoundingClientRect().bottom')
68
+ scroller_bottom = scrolling_element.evaluate_script('this.getBoundingClientRect().top + this.clientHeight')
69
+ expect(el_bottom).to be_within(1).of(scroller_bottom)
70
+ end
71
+
72
+ it 'can scroll an element to the center of the scrolling element' do
73
+ scrolling_element = @session.find(:css, '#scrollable')
74
+ el = scrolling_element.find(:css, '#inner')
75
+ scrolling_element.scroll_to(el, align: :center)
76
+ el_center = el.evaluate_script('(function(rect){return (rect.top + rect.bottom)/2})(this.getBoundingClientRect())')
77
+ scrollable_center = scrolling_element.evaluate_script('(this.clientHeight / 2) + this.getBoundingClientRect().top')
78
+ expect(el_center).to be_within(1).of(scrollable_center)
79
+ end
80
+
81
+ it 'can scroll the scrolling element to the top' do
82
+ scrolling_element = @session.find(:css, '#scrollable')
83
+ scrolling_element.scroll_to :bottom
84
+ scrolling_element.scroll_to :top
85
+ expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [0, 0]
86
+ end
87
+
88
+ it 'can scroll the scrolling element to the bottom' do
89
+ scrolling_element = @session.find(:css, '#scrollable')
90
+ scrolling_element.scroll_to :bottom
91
+ max_scroll = scrolling_element.evaluate_script('this.scrollHeight - this.clientHeight')
92
+ expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [0, max_scroll]
93
+ end
94
+
95
+ it 'can scroll the scrolling element to the vertical center' do
96
+ scrolling_element = @session.find(:css, '#scrollable')
97
+ scrolling_element.scroll_to :center
98
+ max_scroll = scrolling_element.evaluate_script('this.scrollHeight - this.clientHeight')
99
+ expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [0, max_scroll / 2]
100
+ end
101
+
102
+ it 'can scroll the scrolling element to specific location' do
103
+ scrolling_element = @session.find(:css, '#scrollable')
104
+ scrolling_element.scroll_to 100, 100
105
+ expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [100, 100]
106
+ end
107
+
108
+ it 'can scroll the window by a specific amount' do
109
+ @session.scroll_to(:current, offset: [50, 75])
110
+ expect(@session.evaluate_script('[window.scrollX || window.pageXOffset, window.scrollY || window.pageYOffset]')).to eq [50, 75]
111
+ end
112
+
113
+ it 'can scroll the scroll the scrolling element by a specific amount' do
114
+ scrolling_element = @session.find(:css, '#scrollable')
115
+ scrolling_element.scroll_to 100, 100
116
+ scrolling_element.scroll_to(:current, offset: [-50, 50])
117
+ expect(scrolling_element.evaluate_script('[this.scrollLeft, this.scrollTop]')).to eq [50, 150]
118
+ end
119
+ end
@@ -1,92 +1,118 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- Capybara::SpecHelper.spec "#select" do
3
+ Capybara::SpecHelper.spec '#select' do
4
4
  before do
5
5
  @session.visit('/form')
6
6
  end
7
7
 
8
- it "should return value of the first option" do
8
+ it 'should return value of the first option' do
9
9
  expect(@session.find_field('Title').value).to eq('Mrs')
10
10
  end
11
11
 
12
- it "should return value of the selected option" do
13
- @session.select("Miss", from: 'Title')
12
+ it 'should return value of the selected option' do
13
+ @session.select('Miss', from: 'Title')
14
14
  expect(@session.find_field('Title').value).to eq('Miss')
15
15
  end
16
16
 
17
- it "should allow selecting exact options where there are inexact matches", :exact_false do
18
- @session.select("Mr", from: 'Title')
17
+ it 'should allow selecting exact options where there are inexact matches', :exact_false do
18
+ @session.select('Mr', from: 'Title')
19
19
  expect(@session.find_field('Title').value).to eq('Mr')
20
20
  end
21
21
 
22
- it "should allow selecting options where they are the only inexact match", :exact_false do
23
- @session.select("Mis", from: 'Title')
22
+ it 'should allow selecting options where they are the only inexact match', :exact_false do
23
+ @session.select('Mis', from: 'Title')
24
24
  expect(@session.find_field('Title').value).to eq('Miss')
25
25
  end
26
26
 
27
- it "should not allow selecting options where they are the only inexact match if `exact: true` is specified" do
27
+ it 'should not allow selecting options where they are the only inexact match if `exact: true` is specified' do
28
28
  sel = @session.find(:select, 'Title')
29
29
  expect do
30
- sel.select("Mis", exact: true)
30
+ sel.select('Mis', exact: true)
31
31
  end.to raise_error(Capybara::ElementNotFound)
32
32
  end
33
33
 
34
- it "should not allow selecting an option if the match is ambiguous", :exact_false do
34
+ it 'should not allow selecting an option if the match is ambiguous', :exact_false do
35
35
  expect do
36
- @session.select("M", from: 'Title')
36
+ @session.select('M', from: 'Title')
37
37
  end.to raise_error(Capybara::Ambiguous)
38
38
  end
39
39
 
40
- it "should return the value attribute rather than content if present" do
40
+ it 'should return the value attribute rather than content if present' do
41
41
  expect(@session.find_field('Locale').value).to eq('en')
42
42
  end
43
43
 
44
- it "should select an option from a select box by id" do
45
- @session.select("Finish", from: 'form_locale')
44
+ it 'should select an option from a select box by id' do
45
+ @session.select('Finnish', from: 'form_locale')
46
46
  @session.click_button('awesome')
47
47
  expect(extract_results(@session)['locale']).to eq('fi')
48
48
  end
49
49
 
50
- it "should select an option from a select box by label" do
51
- @session.select("Finish", from: 'Locale')
50
+ it 'should select an option from a select box by label' do
51
+ @session.select('Finnish', from: 'Locale')
52
52
  @session.click_button('awesome')
53
53
  expect(extract_results(@session)['locale']).to eq('fi')
54
54
  end
55
55
 
56
- it "should select an option without giving a select box" do
57
- @session.select("Swedish")
56
+ it 'should select an option without giving a select box' do
57
+ @session.select('Swedish')
58
58
  @session.click_button('awesome')
59
59
  expect(extract_results(@session)['locale']).to eq('sv')
60
60
  end
61
61
 
62
- it "should escape quotes" do
62
+ it 'should escape quotes' do
63
63
  @session.select("John's made-up language", from: 'Locale')
64
64
  @session.click_button('awesome')
65
65
  expect(extract_results(@session)['locale']).to eq('jo')
66
66
  end
67
67
 
68
- it "should obey from" do
69
- @session.select("Miss", from: "Other title")
68
+ it 'should obey from' do
69
+ @session.select('Miss', from: 'Other title')
70
70
  @session.click_button('awesome')
71
71
  results = extract_results(@session)
72
- expect(results['other_title']).to eq("Miss")
73
- expect(results['title']).not_to eq("Miss")
72
+ expect(results['other_title']).to eq('Miss')
73
+ expect(results['title']).not_to eq('Miss')
74
74
  end
75
75
 
76
- it "show match labels with preceding or trailing whitespace" do
77
- @session.select("Lojban", from: 'Locale')
76
+ it 'show match labels with preceding or trailing whitespace' do
77
+ @session.select('Lojban', from: 'Locale')
78
78
  @session.click_button('awesome')
79
79
  expect(extract_results(@session)['locale']).to eq('jbo')
80
80
  end
81
81
 
82
- it "casts to string" do
82
+ it 'casts to string' do
83
83
  @session.select(:Miss, from: :Title)
84
84
  expect(@session.find_field('Title').value).to eq('Miss')
85
85
  end
86
86
 
87
+ context 'input with datalist' do
88
+ it 'should select an option' do
89
+ @session.select('Audi', from: 'manufacturer')
90
+ @session.click_button('awesome')
91
+ expect(extract_results(@session)['manufacturer']).to eq('Audi')
92
+ end
93
+
94
+ it 'should not find an input without a datalist' do
95
+ expect do
96
+ @session.select('Thomas', from: 'form_first_name')
97
+ end.to raise_error(/Unable to find input box with datalist completion "form_first_name"/)
98
+ end
99
+
100
+ it "should not select an option that doesn't exist" do
101
+ expect do
102
+ @session.select('Tata', from: 'manufacturer')
103
+ end.to raise_error(/Unable to find datalist option "Tata"/)
104
+ end
105
+
106
+ it 'should not select a disabled option' do
107
+ expect do
108
+ @session.select('Mercedes', from: 'manufacturer')
109
+ end.to raise_error(/Unable to find datalist option "Mercedes"/)
110
+ end
111
+ end
112
+
87
113
  context "with a locator that doesn't exist" do
88
- it "should raise an error" do
89
- msg = "Unable to find visible select box \"does not exist\" that is not disabled"
114
+ it 'should raise an error' do
115
+ msg = /Unable to find select box "does not exist"/
90
116
  expect do
91
117
  @session.select('foo', from: 'does not exist')
92
118
  end.to raise_error(Capybara::ElementNotFound, msg)
@@ -94,110 +120,110 @@ Capybara::SpecHelper.spec "#select" do
94
120
  end
95
121
 
96
122
  context "with an option that doesn't exist" do
97
- it "should raise an error" do
98
- msg = /^Unable to find visible option "Does not Exist" within/
123
+ it 'should raise an error' do
124
+ msg = /^Unable to find option "Does not Exist" within/
99
125
  expect do
100
126
  @session.select('Does not Exist', from: 'form_locale')
101
127
  end.to raise_error(Capybara::ElementNotFound, msg)
102
128
  end
103
129
  end
104
130
 
105
- context "on a disabled select" do
106
- it "should raise an error" do
131
+ context 'on a disabled select' do
132
+ it 'should raise an error' do
107
133
  expect do
108
134
  @session.select('Should not see me', from: 'Disabled Select')
109
135
  end.to raise_error(Capybara::ElementNotFound)
110
136
  end
111
137
  end
112
138
 
113
- context "on a disabled option" do
114
- it "should not select" do
139
+ context 'on a disabled option' do
140
+ it 'should not select' do
115
141
  @session.select('Other', from: 'form_title')
116
142
  expect(@session.find_field('form_title').value).not_to eq 'Other'
117
143
  end
118
-
119
- it "should warn" do
120
- expect_any_instance_of(Capybara::Node::Element).to receive(:warn).once
121
- @session.select('Other', from: 'form_title')
122
- end
123
144
  end
124
145
 
125
- context "with multiple select" do
126
- it "should return an empty value" do
146
+ context 'with multiple select' do
147
+ it 'should return an empty value' do
127
148
  expect(@session.find_field('Languages').value).to eq([])
128
149
  end
129
150
 
130
- it "should return value of the selected options" do
131
- @session.select("Ruby", from: 'Languages')
132
- @session.select("Javascript", from: 'Languages')
151
+ it 'should return value of the selected options' do
152
+ @session.select('Ruby', from: 'Languages')
153
+ @session.select('Javascript', from: 'Languages')
133
154
  expect(@session.find_field('Languages').value).to include('Ruby', 'Javascript')
134
155
  end
135
156
 
136
- it "should select one option" do
137
- @session.select("Ruby", from: 'Languages')
157
+ it 'should select one option' do
158
+ @session.select('Ruby', from: 'Languages')
138
159
  @session.click_button('awesome')
139
160
  expect(extract_results(@session)['languages']).to eq(['Ruby'])
140
161
  end
141
162
 
142
- it "should select multiple options" do
143
- @session.select("Ruby", from: 'Languages')
144
- @session.select("Javascript", from: 'Languages')
163
+ it 'should select multiple options' do
164
+ @session.select('Ruby', from: 'Languages')
165
+ @session.select('Javascript', from: 'Languages')
145
166
  @session.click_button('awesome')
146
167
  expect(extract_results(@session)['languages']).to include('Ruby', 'Javascript')
147
168
  end
148
169
 
149
- it "should remain selected if already selected" do
150
- @session.select("Ruby", from: 'Languages')
151
- @session.select("Javascript", from: 'Languages')
152
- @session.select("Ruby", from: 'Languages')
170
+ it 'should remain selected if already selected' do
171
+ @session.select('Ruby', from: 'Languages')
172
+ @session.select('Javascript', from: 'Languages')
173
+ @session.select('Ruby', from: 'Languages')
153
174
  @session.click_button('awesome')
154
175
  expect(extract_results(@session)['languages']).to include('Ruby', 'Javascript')
155
176
  end
156
177
 
157
- it "should return value attribute rather than content if present" do
178
+ it 'should return value attribute rather than content if present' do
158
179
  expect(@session.find_field('Underwear').value).to include('thermal')
159
180
  end
160
181
  end
161
182
 
162
- context "with :exact option" do
163
- context "when `false`" do
164
- it "can match select box approximately" do
165
- @session.select("Finish", from: "Loc", exact: false)
166
- @session.click_button("awesome")
167
- expect(extract_results(@session)["locale"]).to eq("fi")
183
+ context 'with :exact option' do
184
+ context 'when `false`' do
185
+ it 'can match select box approximately' do
186
+ @session.select('Finnish', from: 'Loc', exact: false)
187
+ @session.click_button('awesome')
188
+ expect(extract_results(@session)['locale']).to eq('fi')
168
189
  end
169
190
 
170
- it "can match option approximately" do
171
- @session.select("Fin", from: "Locale", exact: false)
172
- @session.click_button("awesome")
173
- expect(extract_results(@session)["locale"]).to eq("fi")
191
+ it 'can match option approximately' do
192
+ @session.select('Fin', from: 'Locale', exact: false)
193
+ @session.click_button('awesome')
194
+ expect(extract_results(@session)['locale']).to eq('fi')
174
195
  end
175
196
 
176
- it "can match option approximately when :from not given" do
177
- @session.select("made-up language", exact: false)
178
- @session.click_button("awesome")
179
- expect(extract_results(@session)["locale"]).to eq("jo")
197
+ it 'can match option approximately when :from not given' do
198
+ @session.select('made-up language', exact: false)
199
+ @session.click_button('awesome')
200
+ expect(extract_results(@session)['locale']).to eq('jo')
180
201
  end
181
202
  end
182
203
 
183
- context "when `true`" do
184
- it "can match select box approximately" do
204
+ context 'when `true`' do
205
+ it 'can match select box approximately' do
185
206
  expect do
186
- @session.select("Finish", from: "Loc", exact: true)
207
+ @session.select('Finnish', from: 'Loc', exact: true)
187
208
  end.to raise_error(Capybara::ElementNotFound)
188
209
  end
189
210
 
190
- it "can match option approximately" do
211
+ it 'can match option approximately' do
191
212
  expect do
192
- @session.select("Fin", from: "Locale", exact: true)
213
+ @session.select('Fin', from: 'Locale', exact: true)
193
214
  end.to raise_error(Capybara::ElementNotFound)
194
215
  end
195
216
 
196
- it "can match option approximately when :from not given" do
217
+ it 'can match option approximately when :from not given' do
197
218
  expect do
198
- @session.select("made-up language", exact: true)
219
+ @session.select('made-up language', exact: true)
199
220
  end.to raise_error(Capybara::ElementNotFound)
200
221
  end
201
222
  end
202
223
  end
224
+
225
+ it 'should error when not passed a locator for :from option' do
226
+ select = @session.find(:select, 'Title')
227
+ expect { @session.select('Mr', from: select) }.to raise_error(ArgumentError, /does not take an element/)
228
+ end
203
229
  end
@@ -1,33 +1,48 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec Capybara::Selector do
2
4
  before do
3
5
  @session.visit('/form')
4
6
  end
5
7
 
6
- describe ":label selector" do
7
- it "finds a label by text" do
8
+ describe ':label selector' do
9
+ it 'finds a label by text' do
8
10
  expect(@session.find(:label, 'Customer Name').text).to eq 'Customer Name'
9
11
  end
10
12
 
11
- it "finds a label by for attribute string" do
13
+ it 'finds a label by for attribute string' do
12
14
  expect(@session.find(:label, for: 'form_other_title')['for']).to eq 'form_other_title'
13
15
  end
14
16
 
15
- it "finds a label from nested input using :for filter with id string" do
17
+ it 'finds a label for for attribute regex' do
18
+ expect(@session.find(:label, for: /_other_title/)['for']).to eq 'form_other_title'
19
+ end
20
+
21
+ it 'finds a label from nested input using :for filter with id string' do
16
22
  expect(@session.find(:label, for: 'nested_label').text).to eq 'Nested Label'
17
23
  end
18
24
 
19
- it "finds a label from nested input using :for filter with element" do
25
+ it 'finds a label from nested input using :for filter with id regexp' do
26
+ expect(@session.find(:label, for: /nested_lab/).text).to eq 'Nested Label'
27
+ end
28
+
29
+ it 'finds a label from nested input using :for filter with element' do
20
30
  input = @session.find(:id, 'nested_label')
21
31
  expect(@session.find(:label, for: input).text).to eq 'Nested Label'
22
32
  end
23
33
 
24
- it "finds the label for an non-nested element when using :for filter" do
34
+ it 'finds a label from nested input using :for filter with element when no id on label' do
35
+ input = @session.find(:css, '#wrapper_label').find(:css, 'input')
36
+ expect(@session.find(:label, for: input).text).to eq 'Wrapper Label'
37
+ end
38
+
39
+ it 'finds the label for an non-nested element when using :for filter' do
25
40
  select = @session.find(:id, 'form_other_title')
26
41
  expect(@session.find(:label, for: select)['for']).to eq 'form_other_title'
27
42
  end
28
43
 
29
- context "with exact option" do
30
- it "matches substrings" do
44
+ context 'with exact option' do
45
+ it 'matches substrings' do
31
46
  expect(@session.find(:label, 'Customer Na', exact: false).text).to eq 'Customer Name'
32
47
  end
33
48
 
@@ -37,29 +52,47 @@ Capybara::SpecHelper.spec Capybara::Selector do
37
52
  end
38
53
  end
39
54
 
40
- describe "field selectors" do
41
- it "can find specifically by id" do
42
- expect(@session.find(:field, id: 'customer_email').value).to eq "ben@ben.com"
55
+ describe 'field selectors' do
56
+ context 'with :id option' do
57
+ it 'can find specifically by id' do
58
+ expect(@session.find(:field, id: 'customer_email').value).to eq 'ben@ben.com'
59
+ end
60
+
61
+ it 'can find by regex' do
62
+ expect(@session.find(:field, id: /ustomer.emai/).value).to eq 'ben@ben.com'
63
+ end
64
+
65
+ it 'can find by case-insensitive id' do
66
+ expect(@session.find(:field, id: /StOmer.emAI/i).value).to eq 'ben@ben.com'
67
+ end
68
+ end
69
+
70
+ it 'can find specifically by name string' do
71
+ expect(@session.find(:field, name: 'form[other_title]')['id']).to eq 'form_other_title'
72
+ end
73
+
74
+ it 'can find specifically by name regex' do
75
+ expect(@session.find(:field, name: /form\[other_.*\]/)['id']).to eq 'form_other_title'
43
76
  end
44
77
 
45
- it "can find specifically by name" do
46
- expect(@session.find(:field, name: 'form[other_title]')['id']).to eq "form_other_title"
78
+ it 'can find specifically by placeholder string' do
79
+ expect(@session.find(:field, placeholder: 'FirstName')['id']).to eq 'form_first_name'
47
80
  end
48
81
 
49
- it "can find specifically by placeholder" do
50
- expect(@session.find(:field, placeholder: 'FirstName')['id']).to eq "form_first_name"
82
+ it 'can find specifically by placeholder regex' do
83
+ expect(@session.find(:field, placeholder: /FirstN.*/)['id']).to eq 'form_first_name'
51
84
  end
52
85
 
53
- it "can find by type" do
86
+ it 'can find by type' do
54
87
  expect(@session.find(:field, 'Confusion', type: 'checkbox')['id']).to eq 'confusion_checkbox'
55
88
  expect(@session.find(:field, 'Confusion', type: 'text')['id']).to eq 'confusion_text'
56
89
  expect(@session.find(:field, 'Confusion', type: 'textarea')['id']).to eq 'confusion_textarea'
57
90
  end
58
91
 
59
- it "can find by class" do
92
+ it 'can find by class' do
60
93
  expect(@session.find(:field, class: 'confusion-checkbox')['id']).to eq 'confusion_checkbox'
61
94
  expect(@session).to have_selector(:field, class: 'confusion', count: 3)
62
- expect(@session.find(:field, class: ['confusion', 'confusion-textarea'])['id']).to eq 'confusion_textarea'
95
+ expect(@session.find(:field, class: %w[confusion confusion-textarea])['id']).to eq 'confusion_textarea'
63
96
  end
64
97
  end
65
98
  end
@@ -9,31 +9,31 @@ Capybara::SpecHelper.spec '#sibling' do
9
9
  Capybara::Selector.remove(:monkey)
10
10
  end
11
11
 
12
- it "should find a prior sibling element using the given locator" do
12
+ it 'should find a prior sibling element using the given locator' do
13
13
  el = @session.find(:css, '#mid_sibling')
14
14
  expect(el.sibling('//div[@data-pre]')[:id]).to eq('pre_sibling')
15
15
  end
16
16
 
17
- it "should find a following sibling element using the given locator" do
17
+ it 'should find a following sibling element using the given locator' do
18
18
  el = @session.find(:css, '#mid_sibling')
19
19
  expect(el.sibling('//div[@data-post]')[:id]).to eq('post_sibling')
20
20
  end
21
21
 
22
- it "should raise an error if there are multiple matches" do
22
+ it 'should raise an error if there are multiple matches' do
23
23
  el = @session.find(:css, '#mid_sibling')
24
24
  expect { el.sibling('//div') }.to raise_error(Capybara::Ambiguous)
25
25
  end
26
26
 
27
- context "with css selectors" do
28
- it "should find the first element using the given locator" do
27
+ context 'with css selectors' do
28
+ it 'should find the first element using the given locator' do
29
29
  el = @session.find(:css, '#mid_sibling')
30
30
  expect(el.sibling(:css, '#pre_sibling')).to have_text('Pre Sibling')
31
31
  expect(el.sibling(:css, '#post_sibling')).to have_text('Post Sibling')
32
32
  end
33
33
  end
34
34
 
35
- context "with custom selector" do
36
- it "should use the custom selector" do
35
+ context 'with custom selector' do
36
+ it 'should use the custom selector' do
37
37
  Capybara.add_selector(:data_attribute) do
38
38
  xpath { |attr| ".//*[@data-#{attr}]" }
39
39
  end
@@ -43,10 +43,10 @@ Capybara::SpecHelper.spec '#sibling' do
43
43
  end
44
44
  end
45
45
 
46
- it "should raise ElementNotFound with a useful default message if nothing was found" do
46
+ it 'should raise ElementNotFound with a useful default message if nothing was found' do
47
47
  el = @session.find(:css, '#child')
48
48
  expect do
49
49
  el.sibling(:xpath, '//div[@id="nosuchthing"]')
50
- end.to raise_error(Capybara::ElementNotFound, "Unable to find xpath \"//div[@id=\\\"nosuchthing\\\"]\" that is a sibling of visible css \"#child\"")
50
+ end.to raise_error(Capybara::ElementNotFound, 'Unable to find xpath "//div[@id=\\"nosuchthing\\"]" that is a sibling of visible css "#child"')
51
51
  end
52
52
  end