capybara 2.18.0 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +945 -12
  4. data/License.txt +1 -1
  5. data/README.md +264 -90
  6. data/lib/capybara/config.rb +29 -57
  7. data/lib/capybara/cucumber.rb +2 -3
  8. data/lib/capybara/driver/base.rb +35 -18
  9. data/lib/capybara/driver/node.rb +40 -10
  10. data/lib/capybara/dsl.rb +10 -7
  11. data/lib/capybara/helpers.rb +70 -31
  12. data/lib/capybara/minitest/spec.rb +185 -83
  13. data/lib/capybara/minitest.rb +232 -112
  14. data/lib/capybara/node/actions.rb +274 -171
  15. data/lib/capybara/node/base.rb +42 -34
  16. data/lib/capybara/node/document.rb +15 -3
  17. data/lib/capybara/node/document_matchers.rb +19 -21
  18. data/lib/capybara/node/element.rb +362 -135
  19. data/lib/capybara/node/finders.rb +151 -137
  20. data/lib/capybara/node/matchers.rb +394 -209
  21. data/lib/capybara/node/simple.rb +59 -26
  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 +12 -9
  25. data/lib/capybara/queries/base_query.rb +39 -28
  26. data/lib/capybara/queries/current_path_query.rb +21 -27
  27. data/lib/capybara/queries/match_query.rb +14 -7
  28. data/lib/capybara/queries/selector_query.rb +659 -149
  29. data/lib/capybara/queries/sibling_query.rb +11 -9
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +56 -38
  32. data/lib/capybara/queries/title_query.rb +8 -11
  33. data/lib/capybara/rack_test/browser.rb +114 -42
  34. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  35. data/lib/capybara/rack_test/driver.rb +22 -17
  36. data/lib/capybara/rack_test/errors.rb +6 -0
  37. data/lib/capybara/rack_test/form.rb +93 -58
  38. data/lib/capybara/rack_test/node.rb +184 -81
  39. data/lib/capybara/rails.rb +3 -7
  40. data/lib/capybara/registration_container.rb +41 -0
  41. data/lib/capybara/registrations/drivers.rb +42 -0
  42. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  43. data/lib/capybara/registrations/servers.rb +66 -0
  44. data/lib/capybara/result.rb +97 -63
  45. data/lib/capybara/rspec/features.rb +17 -50
  46. data/lib/capybara/rspec/matcher_proxies.rb +52 -15
  47. data/lib/capybara/rspec/matchers/base.rb +113 -0
  48. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  49. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  50. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  51. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  52. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  53. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  54. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  55. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  56. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  57. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  58. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/rspec/matchers.rb +146 -310
  61. data/lib/capybara/rspec.rb +7 -11
  62. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  63. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  64. data/lib/capybara/selector/css.rb +85 -13
  65. data/lib/capybara/selector/definition/button.rb +68 -0
  66. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  67. data/lib/capybara/selector/definition/css.rb +10 -0
  68. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  69. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  70. data/lib/capybara/selector/definition/element.rb +28 -0
  71. data/lib/capybara/selector/definition/field.rb +40 -0
  72. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  73. data/lib/capybara/selector/definition/file_field.rb +13 -0
  74. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  75. data/lib/capybara/selector/definition/frame.rb +17 -0
  76. data/lib/capybara/selector/definition/id.rb +6 -0
  77. data/lib/capybara/selector/definition/label.rb +62 -0
  78. data/lib/capybara/selector/definition/link.rb +55 -0
  79. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  80. data/lib/capybara/selector/definition/option.rb +27 -0
  81. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  82. data/lib/capybara/selector/definition/select.rb +81 -0
  83. data/lib/capybara/selector/definition/table.rb +109 -0
  84. data/lib/capybara/selector/definition/table_row.rb +21 -0
  85. data/lib/capybara/selector/definition/xpath.rb +5 -0
  86. data/lib/capybara/selector/definition.rb +280 -0
  87. data/lib/capybara/selector/filter.rb +2 -17
  88. data/lib/capybara/selector/filter_set.rb +80 -33
  89. data/lib/capybara/selector/filters/base.rb +50 -6
  90. data/lib/capybara/selector/filters/expression_filter.rb +8 -26
  91. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  92. data/lib/capybara/selector/filters/node_filter.rb +16 -12
  93. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  94. data/lib/capybara/selector/selector.rb +93 -210
  95. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  96. data/lib/capybara/selector.rb +475 -523
  97. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  99. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  100. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  101. data/lib/capybara/selenium/driver.rb +298 -267
  102. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  103. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  104. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  105. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  106. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  107. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  108. data/lib/capybara/selenium/extensions/find.rb +110 -0
  109. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  110. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  111. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  112. data/lib/capybara/selenium/node.rb +517 -145
  113. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  114. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  115. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  116. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  117. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  118. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  119. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  120. data/lib/capybara/selenium/patches/logs.rb +45 -0
  121. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  122. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  123. data/lib/capybara/server/animation_disabler.rb +80 -0
  124. data/lib/capybara/server/checker.rb +44 -0
  125. data/lib/capybara/server/middleware.rb +71 -0
  126. data/lib/capybara/server.rb +59 -67
  127. data/lib/capybara/session/config.rb +81 -67
  128. data/lib/capybara/session/matchers.rb +28 -20
  129. data/lib/capybara/session.rb +337 -365
  130. data/lib/capybara/spec/public/jquery.js +5 -5
  131. data/lib/capybara/spec/public/offset.js +6 -0
  132. data/lib/capybara/spec/public/test.js +151 -12
  133. data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
  134. data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
  135. data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
  136. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  137. data/lib/capybara/spec/session/all_spec.rb +161 -57
  138. data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
  140. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  141. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  142. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  143. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  144. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +22 -12
  145. data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +117 -55
  148. data/lib/capybara/spec/session/choose_spec.rb +64 -31
  149. data/lib/capybara/spec/session/click_button_spec.rb +231 -173
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
  151. data/lib/capybara/spec/session/click_link_spec.rb +93 -58
  152. data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
  153. data/lib/capybara/spec/session/current_url_spec.rb +57 -39
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -2
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
  162. data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
  163. data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
  164. data/lib/capybara/spec/session/find_button_spec.rb +25 -24
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +37 -41
  167. data/lib/capybara/spec/session/find_link_spec.rb +46 -17
  168. data/lib/capybara/spec/session/find_spec.rb +260 -145
  169. data/lib/capybara/spec/session/first_spec.rb +80 -52
  170. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  171. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  172. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +33 -20
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
  174. data/lib/capybara/spec/session/go_back_spec.rb +2 -1
  175. data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +100 -13
  180. data/lib/capybara/spec/session/has_css_spec.rb +272 -137
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
  182. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  183. data/lib/capybara/spec/session/has_field_spec.rb +139 -59
  184. data/lib/capybara/spec/session/has_link_spec.rb +47 -6
  185. data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
  186. data/lib/capybara/spec/session/has_select_spec.rb +107 -72
  187. data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
  188. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  189. data/lib/capybara/spec/session/has_table_spec.rb +183 -5
  190. data/lib/capybara/spec/session/has_text_spec.rb +106 -62
  191. data/lib/capybara/spec/session/has_title_spec.rb +20 -14
  192. data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
  193. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  194. data/lib/capybara/spec/session/html_spec.rb +14 -6
  195. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  196. data/lib/capybara/spec/session/node_spec.rb +1024 -153
  197. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  198. data/lib/capybara/spec/session/refresh_spec.rb +12 -6
  199. data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
  200. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  201. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  202. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
  203. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  204. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  205. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  206. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  207. data/lib/capybara/spec/session/select_spec.rb +107 -81
  208. data/lib/capybara/spec/session/selectors_spec.rb +52 -19
  209. data/lib/capybara/spec/session/sibling_spec.rb +10 -10
  210. data/lib/capybara/spec/session/text_spec.rb +37 -21
  211. data/lib/capybara/spec/session/title_spec.rb +17 -5
  212. data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
  213. data/lib/capybara/spec/session/unselect_spec.rb +39 -38
  214. data/lib/capybara/spec/session/visit_spec.rb +85 -53
  215. data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
  216. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  218. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
  219. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
  220. data/lib/capybara/spec/session/window/window_spec.rb +97 -63
  221. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  222. data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
  223. data/lib/capybara/spec/session/within_spec.rb +83 -44
  224. data/lib/capybara/spec/spec_helper.rb +54 -44
  225. data/lib/capybara/spec/test_app.rb +158 -43
  226. data/lib/capybara/spec/views/animated.erb +49 -0
  227. data/lib/capybara/spec/views/form.erb +163 -42
  228. data/lib/capybara/spec/views/frame_child.erb +4 -3
  229. data/lib/capybara/spec/views/frame_one.erb +2 -1
  230. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  231. data/lib/capybara/spec/views/frame_two.erb +1 -1
  232. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  233. data/lib/capybara/spec/views/layout.erb +10 -0
  234. data/lib/capybara/spec/views/obscured.erb +47 -0
  235. data/lib/capybara/spec/views/offset.erb +33 -0
  236. data/lib/capybara/spec/views/path.erb +2 -2
  237. data/lib/capybara/spec/views/popup_one.erb +1 -1
  238. data/lib/capybara/spec/views/popup_two.erb +1 -1
  239. data/lib/capybara/spec/views/react.erb +45 -0
  240. data/lib/capybara/spec/views/scroll.erb +21 -0
  241. data/lib/capybara/spec/views/spatial.erb +31 -0
  242. data/lib/capybara/spec/views/tables.erb +68 -1
  243. data/lib/capybara/spec/views/with_animation.erb +81 -0
  244. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  245. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  246. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  247. data/lib/capybara/spec/views/with_hover.erb +3 -2
  248. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  249. data/lib/capybara/spec/views/with_html.erb +69 -12
  250. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  251. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  252. data/lib/capybara/spec/views/with_js.erb +30 -5
  253. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  254. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  255. data/lib/capybara/spec/views/with_scope.erb +2 -2
  256. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  257. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  258. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  259. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  260. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  261. data/lib/capybara/spec/views/with_windows.erb +1 -1
  262. data/lib/capybara/spec/views/within_frames.erb +5 -2
  263. data/lib/capybara/version.rb +2 -1
  264. data/lib/capybara/window.rb +36 -34
  265. data/lib/capybara.rb +134 -107
  266. data/spec/basic_node_spec.rb +60 -34
  267. data/spec/capybara_spec.rb +63 -88
  268. data/spec/counter_spec.rb +35 -0
  269. data/spec/css_builder_spec.rb +101 -0
  270. data/spec/css_splitter_spec.rb +38 -0
  271. data/spec/dsl_spec.rb +85 -64
  272. data/spec/filter_set_spec.rb +27 -9
  273. data/spec/fixtures/certificate.pem +25 -0
  274. data/spec/fixtures/key.pem +27 -0
  275. data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
  276. data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
  277. data/spec/minitest_spec.rb +52 -7
  278. data/spec/minitest_spec_spec.rb +94 -63
  279. data/spec/per_session_config_spec.rb +14 -13
  280. data/spec/rack_test_spec.rb +194 -125
  281. data/spec/regexp_dissassembler_spec.rb +250 -0
  282. data/spec/result_spec.rb +111 -50
  283. data/spec/rspec/features_spec.rb +37 -31
  284. data/spec/rspec/scenarios_spec.rb +10 -8
  285. data/spec/rspec/shared_spec_matchers.rb +473 -422
  286. data/spec/rspec/views_spec.rb +5 -3
  287. data/spec/rspec_matchers_spec.rb +52 -11
  288. data/spec/rspec_spec.rb +109 -89
  289. data/spec/sauce_spec_chrome.rb +43 -0
  290. data/spec/selector_spec.rb +397 -68
  291. data/spec/selenium_spec_chrome.rb +187 -40
  292. data/spec/selenium_spec_chrome_remote.rb +96 -0
  293. data/spec/selenium_spec_edge.rb +60 -0
  294. data/spec/selenium_spec_firefox.rb +201 -41
  295. data/spec/selenium_spec_firefox_remote.rb +94 -0
  296. data/spec/selenium_spec_ie.rb +149 -0
  297. data/spec/selenium_spec_safari.rb +162 -0
  298. data/spec/server_spec.rb +213 -102
  299. data/spec/session_spec.rb +53 -16
  300. data/spec/shared_selenium_node.rb +79 -0
  301. data/spec/shared_selenium_session.rb +473 -122
  302. data/spec/spec_helper.rb +126 -7
  303. data/spec/whitespace_normalizer_spec.rb +54 -0
  304. data/spec/xpath_builder_spec.rb +93 -0
  305. metadata +355 -73
  306. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  307. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  308. data/.yard/yard_extensions.rb +0 -78
  309. data/lib/capybara/query.rb +0 -7
  310. data/lib/capybara/rspec/compound.rb +0 -95
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -72
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -234
  314. data/lib/capybara/spec/session/source_spec.rb +0 -0
  315. data/lib/capybara/spec/views/with_title.erb +0 -5
  316. data/spec/selenium_spec_marionette.rb +0 -127
@@ -1,458 +1,516 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#click_button' do
3
4
  before do
4
5
  @session.visit('/form')
5
6
  end
6
7
 
7
- it "should wait for asynchronous load", requires: [:js] do
8
+ it 'should wait for asynchronous load', requires: [:js] do
8
9
  @session.visit('/with_js')
9
- @session.click_link('Click me')
10
- @session.click_button('New Here')
10
+ @session.using_wait_time(1.5) do
11
+ @session.click_link('Click me')
12
+ @session.click_button('New Here')
13
+ end
11
14
  end
12
15
 
13
- it "casts to string" do
16
+ it 'casts to string' do
14
17
  @session.click_button(:'Relative Action')
15
18
  expect(extract_results(@session)['relative']).to eq('Relative Action')
16
19
  expect(@session.current_path).to eq('/relative')
17
20
  end
18
21
 
19
- context "with multiple values with the same name" do
20
- it "should use the latest given value" do
22
+ context 'with multiple values with the same name' do
23
+ it 'should use the latest given value' do
21
24
  @session.check('Terms of Use')
22
25
  @session.click_button('awesome')
23
26
  expect(extract_results(@session)['terms_of_use']).to eq('1')
24
27
  end
25
28
  end
26
29
 
27
- context "with a form that has a relative url as an action" do
28
- it "should post to the correct url" do
30
+ context 'with a form that has a relative url as an action' do
31
+ it 'should post to the correct url' do
29
32
  @session.click_button('Relative Action')
30
33
  expect(extract_results(@session)['relative']).to eq('Relative Action')
31
34
  expect(@session.current_path).to eq('/relative')
32
35
  end
33
36
  end
34
37
 
35
- context "with a form that has no action specified" do
36
- it "should post to the correct url" do
38
+ context 'with a form that has no action specified' do
39
+ it 'should post to the correct url' do
37
40
  @session.click_button('No Action')
38
41
  expect(extract_results(@session)['no_action']).to eq('No Action')
39
42
  expect(@session.current_path).to eq('/form')
40
43
  end
41
44
  end
42
45
 
43
- context "with value given on a submit button" do
44
- context "on a form with HTML5 fields" do
46
+ context 'with value given on a submit button' do
47
+ context 'on a form with HTML5 fields' do
48
+ let(:results) { extract_results(@session) }
49
+
45
50
  before do
46
51
  @session.click_button('html5_submit')
47
- @results = extract_results(@session)
48
52
  end
49
53
 
50
- it "should serialise and submit search fields" do
51
- expect(@results['html5_search']).to eq('what are you looking for')
54
+ it 'should serialise and submit search fields' do
55
+ expect(results['html5_search']).to eq('what are you looking for')
52
56
  end
53
57
 
54
- it "should serialise and submit email fields" do
55
- expect(@results['html5_email']).to eq('person@email.com')
58
+ it 'should serialise and submit email fields' do
59
+ expect(results['html5_email']).to eq('person@email.com')
56
60
  end
57
61
 
58
- it "should serialise and submit url fields" do
59
- expect(@results['html5_url']).to eq('http://www.example.com')
62
+ it 'should serialise and submit url fields' do
63
+ expect(results['html5_url']).to eq('http://www.example.com')
60
64
  end
61
65
 
62
- it "should serialise and submit tel fields" do
63
- expect(@results['html5_tel']).to eq('911')
66
+ it 'should serialise and submit tel fields' do
67
+ expect(results['html5_tel']).to eq('911')
64
68
  end
65
69
 
66
- it "should serialise and submit color fields" do
67
- expect(@results['html5_color'].upcase).to eq('#FFFFFF')
70
+ it 'should serialise and submit color fields' do
71
+ expect(results['html5_color'].upcase).to eq('#FFFFFF')
68
72
  end
69
73
  end
70
74
 
71
- context "on an HTML4 form" do
75
+ context 'on an HTML4 form' do
76
+ let(:results) { extract_results(@session) }
77
+
72
78
  before do
73
79
  @session.click_button('awesome')
74
- @results = extract_results(@session)
75
80
  end
76
81
 
77
- it "should serialize and submit text fields" do
78
- expect(@results['first_name']).to eq('John')
82
+ it 'should serialize and submit text fields' do
83
+ expect(results['first_name']).to eq('John')
79
84
  end
80
85
 
81
- it "should escape fields when submitting" do
82
- expect(@results['phone']).to eq('+1 555 7021')
86
+ it 'should escape fields when submitting' do
87
+ expect(results['phone']).to eq('+1 555 7021')
83
88
  end
84
89
 
85
- it "should serialize and submit password fields" do
86
- expect(@results['password']).to eq('seeekrit')
90
+ it 'should serialize and submit password fields' do
91
+ expect(results['password']).to eq('seeekrit')
87
92
  end
88
93
 
89
- it "should serialize and submit hidden fields" do
90
- expect(@results['token']).to eq('12345')
94
+ it 'should serialize and submit hidden fields' do
95
+ expect(results['token']).to eq('12345')
91
96
  end
92
97
 
93
- it "should not serialize fields from other forms" do
94
- expect(@results['middle_name']).to be_nil
98
+ it 'should not serialize fields from other forms' do
99
+ expect(results['middle_name']).to be_nil
95
100
  end
96
101
 
97
- it "should submit the button that was clicked, but not other buttons" do
98
- expect(@results['awesome']).to eq('awesome')
99
- expect(@results['crappy']).to be_nil
102
+ it 'should submit the button that was clicked, but not other buttons' do
103
+ expect(results['awesome']).to eq('awesome')
104
+ expect(results['crappy']).to be_nil
100
105
  end
101
106
 
102
- it "should serialize radio buttons" do
103
- expect(@results['gender']).to eq('female')
107
+ it 'should serialize radio buttons' do
108
+ expect(results['gender']).to eq('female')
104
109
  end
105
110
 
106
111
  it "should default radio value to 'on' if none specified" do
107
- expect(@results['valueless_radio']).to eq('on')
112
+ expect(results['valueless_radio']).to eq('on')
108
113
  end
109
114
 
110
- it "should serialize check boxes" do
111
- expect(@results['pets']).to include('dog', 'hamster')
112
- expect(@results['pets']).not_to include('cat')
115
+ it 'should serialize check boxes' do
116
+ expect(results['pets']).to include('dog', 'hamster')
117
+ expect(results['pets']).not_to include('cat')
113
118
  end
114
119
 
115
120
  it "should default checkbox value to 'on' if none specififed" do
116
- expect(@results['valueless_checkbox']).to eq('on')
121
+ expect(results['valueless_checkbox']).to eq('on')
117
122
  end
118
123
 
119
- it "should serialize text areas" do
120
- expect(@results['description']).to eq('Descriptive text goes here')
124
+ it 'should serialize text areas' do
125
+ expect(results['description']).to eq('Descriptive text goes here')
121
126
  end
122
127
 
123
- it "should serialize select tag with values" do
124
- expect(@results['locale']).to eq('en')
128
+ it 'should serialize select tag with values' do
129
+ expect(results['locale']).to eq('en')
125
130
  end
126
131
 
127
- it "should serialize select tag without values" do
128
- expect(@results['region']).to eq('Norway')
132
+ it 'should serialize select tag without values' do
133
+ expect(results['region']).to eq('Norway')
129
134
  end
130
135
 
131
- it "should serialize first option for select tag with no selection" do
132
- expect(@results['city']).to eq('London')
136
+ it 'should serialize first option for select tag with no selection' do
137
+ expect(results['city']).to eq('London')
133
138
  end
134
139
 
135
- it "should not serialize a select tag without options" do
136
- expect(@results['tendency']).to be_nil
140
+ it 'should not serialize a select tag without options' do
141
+ expect(results['tendency']).to be_nil
137
142
  end
138
143
 
139
- it "should convert lf to cr/lf in submitted textareas" do
140
- expect(@results['newline']).to eq("\r\nNew line after and before textarea tag\r\n")
144
+ it 'should convert lf to cr/lf in submitted textareas' do
145
+ expect(results['newline']).to eq("\r\nNew line after and before textarea tag\r\n")
141
146
  end
142
147
 
143
- it "should not submit disabled fields" do
144
- expect(@results['disabled_text_field']).to be_nil
145
- expect(@results['disabled_textarea']).to be_nil
146
- expect(@results['disabled_checkbox']).to be_nil
147
- expect(@results['disabled_radio']).to be_nil
148
- expect(@results['disabled_select']).to be_nil
149
- expect(@results['disabled_file']).to be_nil
148
+ it 'should not submit disabled fields' do
149
+ expect(results['disabled_text_field']).to be_nil
150
+ expect(results['disabled_textarea']).to be_nil
151
+ expect(results['disabled_checkbox']).to be_nil
152
+ expect(results['disabled_radio']).to be_nil
153
+ expect(results['disabled_select']).to be_nil
154
+ expect(results['disabled_file']).to be_nil
150
155
  end
151
156
  end
152
157
  end
153
158
 
154
- context "with id given on a submit button" do
155
- it "should submit the associated form" do
159
+ context 'input type=submit button' do
160
+ it 'should submit by button id' do
156
161
  @session.click_button('awe123')
157
162
  expect(extract_results(@session)['first_name']).to eq('John')
158
163
  end
159
164
 
160
- it "should work with partial matches" do
161
- @session.click_button('Go')
162
- expect(@session).to have_content('You landed')
165
+ it 'should submit by specific button id' do
166
+ @session.click_button(id: 'awe123')
167
+ expect(extract_results(@session)['first_name']).to eq('John')
163
168
  end
164
- end
165
169
 
166
- context "with title given on a submit button" do
167
- it "should submit the associated form" do
170
+ it 'should submit by button title' do
168
171
  @session.click_button('What an Awesome Button')
169
172
  expect(extract_results(@session)['first_name']).to eq('John')
170
173
  end
171
174
 
172
- it "should work with partial matches" do
175
+ it 'should submit by partial title', :exact_false do
173
176
  @session.click_button('What an Awesome')
174
177
  expect(extract_results(@session)['first_name']).to eq('John')
175
178
  end
179
+
180
+ it 'should submit by button name' do
181
+ @session.click_button('form[awesome]')
182
+ expect(extract_results(@session)['first_name']).to eq('John')
183
+ end
184
+
185
+ it 'should submit by specific button name' do
186
+ @session.click_button(name: 'form[awesome]')
187
+ expect(extract_results(@session)['first_name']).to eq('John')
188
+ end
189
+
190
+ it 'should submit by specific button name regex' do
191
+ @session.click_button(name: /form\[awes.*\]/)
192
+ expect(extract_results(@session)['first_name']).to eq('John')
193
+ end
176
194
  end
177
195
 
178
- context "with fields associated with the form using the form attribute" do
196
+ context 'when Capybara.enable_aria_role = true' do
197
+ it 'should click on a button role', requires: [:js] do
198
+ Capybara.enable_aria_role = true
199
+ @session.using_wait_time(1.5) do
200
+ @session.visit('/with_js')
201
+ @session.click_button('ARIA button')
202
+ expect(@session).to have_button('ARIA button has been clicked')
203
+ end
204
+ end
205
+ end
206
+
207
+ context 'with fields associated with the form using the form attribute', requires: [:form_attribute] do
208
+ let(:results) { extract_results(@session) }
209
+
179
210
  before do
180
211
  @session.click_button('submit_form1')
181
- @results = extract_results(@session)
182
212
  end
183
213
 
184
- it "should serialize and submit text fields" do
185
- expect(@results['outside_input']).to eq('outside_input')
214
+ it 'should serialize and submit text fields' do
215
+ expect(results['outside_input']).to eq('outside_input')
186
216
  end
187
217
 
188
- it "should serialize text areas" do
189
- expect(@results['outside_textarea']).to eq('Some text here')
218
+ it 'should serialize text areas' do
219
+ expect(results['outside_textarea']).to eq('Some text here')
190
220
  end
191
221
 
192
- it "should serialize select tags" do
193
- expect(@results['outside_select']).to eq('Ruby')
222
+ it 'should serialize select tags' do
223
+ expect(results['outside_select']).to eq('Ruby')
194
224
  end
195
225
 
196
- it "should not serliaze fields associated with a different form" do
197
- expect(@results['for_form2']).to be_nil
226
+ it 'should not serliaze fields associated with a different form' do
227
+ expect(results['for_form2']).to be_nil
198
228
  end
199
229
  end
200
230
 
231
+ context 'with submit button outside the form defined by <button> tag', requires: [:form_attribute] do
232
+ let(:results) { extract_results(@session) }
201
233
 
202
- context "with submit button outside the form defined by <button> tag" do
203
234
  before do
204
235
  @session.click_button('outside_button')
205
- @results = extract_results(@session)
206
236
  end
207
237
 
208
- it "should submit the associated form" do
209
- expect(@results['which_form']).to eq('form2')
238
+ it 'should submit the associated form' do
239
+ expect(results['which_form']).to eq('form2')
210
240
  end
211
241
 
212
- it "should submit the button that was clicked, but not other buttons" do
213
- expect(@results['outside_button']).to eq('outside_button')
214
- expect(@results['unused']).to be_nil
242
+ it 'should submit the button that was clicked, but not other buttons' do
243
+ expect(results['outside_button']).to eq('outside_button')
244
+ expect(results['unused']).to be_nil
215
245
  end
216
246
  end
217
247
 
218
- context "with submit button outside the form defined by <input type='submit'> tag" do
248
+ context "with submit button outside the form defined by <input type='submit'> tag", requires: [:form_attribute] do
249
+ let(:results) { extract_results(@session) }
250
+
219
251
  before do
220
252
  @session.click_button('outside_submit')
221
- @results = extract_results(@session)
222
253
  end
223
254
 
224
- it "should submit the associated form" do
225
- expect(@results['which_form']).to eq('form1')
255
+ it 'should submit the associated form' do
256
+ expect(results['which_form']).to eq('form1')
226
257
  end
227
258
 
228
- it "should submit the button that was clicked, but not other buttons" do
229
- expect(@results['outside_submit']).to eq('outside_submit')
230
- expect(@results['submit_form1']).to be_nil
259
+ it 'should submit the button that was clicked, but not other buttons' do
260
+ expect(results['outside_submit']).to eq('outside_submit')
261
+ expect(results['submit_form1']).to be_nil
231
262
  end
232
263
  end
233
264
 
234
- context "with submit button for form1 located within form2" do
235
- it "should submit the form associated with the button" do
265
+ context 'with submit button for form1 located within form2', requires: [:form_attribute] do
266
+ it 'should submit the form associated with the button' do
236
267
  @session.click_button('other_form_button')
237
- expect(extract_results(@session)['which_form']).to eq("form1")
268
+ expect(extract_results(@session)['which_form']).to eq('form1')
238
269
  end
239
270
  end
240
271
 
241
- context "with submit button not associated with any form" do
242
- it "should not error when clicked" do
272
+ context 'with submit button not associated with any form' do
273
+ it 'should not error when clicked' do
243
274
  expect { @session.click_button('no_form_button') }.not_to raise_error
244
275
  end
245
276
  end
246
277
 
247
- context "with alt given on an image button" do
248
- it "should submit the associated form" do
278
+ context 'with alt given on an image button' do
279
+ it 'should submit the associated form' do
249
280
  @session.click_button('oh hai thar')
250
281
  expect(extract_results(@session)['first_name']).to eq('John')
251
282
  end
252
283
 
253
- it "should work with partial matches" do
284
+ it 'should work with partial matches', :exact_false do
254
285
  @session.click_button('hai')
255
286
  expect(extract_results(@session)['first_name']).to eq('John')
256
287
  end
257
288
  end
258
289
 
259
-
260
- context "with value given on an image button" do
261
- it "should submit the associated form" do
290
+ context 'with value given on an image button' do
291
+ it 'should submit the associated form' do
262
292
  @session.click_button('okay')
263
293
  expect(extract_results(@session)['first_name']).to eq('John')
264
294
  end
265
295
 
266
- it "should work with partial matches" do
296
+ it 'should work with partial matches', :exact_false do
267
297
  @session.click_button('kay')
268
298
  expect(extract_results(@session)['first_name']).to eq('John')
269
299
  end
270
300
  end
271
301
 
272
- context "with id given on an image button" do
273
- it "should submit the associated form" do
302
+ context 'with id given on an image button' do
303
+ it 'should submit the associated form' do
274
304
  @session.click_button('okay556')
275
305
  expect(extract_results(@session)['first_name']).to eq('John')
276
306
  end
277
307
  end
278
308
 
279
- context "with title given on an image button" do
280
- it "should submit the associated form" do
309
+ context 'with title given on an image button' do
310
+ it 'should submit the associated form' do
281
311
  @session.click_button('Okay 556 Image')
282
312
  expect(extract_results(@session)['first_name']).to eq('John')
283
313
  end
284
314
 
285
- it "should work with partial matches" do
315
+ it 'should work with partial matches', :exact_false do
286
316
  @session.click_button('Okay 556')
287
317
  expect(extract_results(@session)['first_name']).to eq('John')
288
318
  end
289
319
  end
290
320
 
291
- context "with text given on a button defined by <button> tag" do
292
- it "should submit the associated form" do
293
- @session.click_button('Click me')
321
+ context 'with text given on a button defined by <button> tag' do
322
+ it 'should submit the associated form' do
323
+ @session.click_button('Click me!')
294
324
  expect(extract_results(@session)['first_name']).to eq('John')
295
325
  end
296
326
 
297
- it "should work with partial matches" do
327
+ it 'should work with partial matches', :exact_false do
298
328
  @session.click_button('Click')
299
329
  expect(extract_results(@session)['first_name']).to eq('John')
300
330
  end
301
331
  end
302
332
 
303
- context "with id given on a button defined by <button> tag" do
304
- it "should submit the associated form" do
333
+ context 'with id given on a button defined by <button> tag' do
334
+ it 'should submit the associated form' do
305
335
  @session.click_button('click_me_123')
306
336
  expect(extract_results(@session)['first_name']).to eq('John')
307
337
  end
308
338
 
309
- it "should serialize and send GET forms" do
339
+ it 'should serialize and send GET forms' do
310
340
  @session.visit('/form')
311
341
  @session.click_button('med')
312
- @results = extract_results(@session)
313
- expect(@results['middle_name']).to eq('Darren')
314
- expect(@results['foo']).to be_nil
342
+ results = extract_results(@session)
343
+ expect(results['middle_name']).to eq('Darren')
344
+ expect(results['foo']).to be_nil
315
345
  end
316
346
  end
317
347
 
318
- context "with value given on a button defined by <button> tag" do
319
- it "should submit the associated form" do
348
+ context 'with name given on a button defined by <button> tag' do
349
+ it 'should submit the associated form when name is locator' do
350
+ @session.click_button('form[no_value]')
351
+ expect(extract_results(@session)['first_name']).to eq('John')
352
+ end
353
+
354
+ it 'should submit the associated form when name is specific' do
355
+ @session.click_button(name: 'form[no_value]')
356
+ expect(extract_results(@session)['first_name']).to eq('John')
357
+ end
358
+ end
359
+
360
+ context 'with value given on a button defined by <button> tag' do
361
+ it 'should submit the associated form' do
320
362
  @session.click_button('click_me')
321
363
  expect(extract_results(@session)['first_name']).to eq('John')
322
364
  end
323
365
 
324
- it "should work with partial matches" do
366
+ it 'should work with partial matches', :exact_false do
325
367
  @session.click_button('ck_me')
326
368
  expect(extract_results(@session)['first_name']).to eq('John')
327
369
  end
328
370
  end
329
371
 
330
- context "with title given on a button defined by <button> tag" do
331
- it "should submit the associated form" do
372
+ context 'with title given on a button defined by <button> tag' do
373
+ it 'should submit the associated form' do
332
374
  @session.click_button('Click Title button')
333
375
  expect(extract_results(@session)['first_name']).to eq('John')
334
376
  end
335
377
 
336
- it "should work with partial matches" do
378
+ it 'should work with partial matches', :exact_false do
337
379
  @session.click_button('Click Title')
338
380
  expect(extract_results(@session)['first_name']).to eq('John')
339
381
  end
340
382
  end
341
383
 
342
- context "with descendant image alt given on a button defined by <button> tag" do
343
- it "should submit the associated form" do
384
+ context 'with descendant image alt given on a button defined by <button> tag' do
385
+ it 'should submit the associated form' do
344
386
  @session.click_button('A horse eating hay')
345
387
  expect(extract_results(@session)['first_name']).to eq('John')
346
388
  end
347
389
 
348
- it "should work with partial matches" do
390
+ it 'should work with partial matches', :exact_false do
349
391
  @session.click_button('se eating h')
350
392
  expect(extract_results(@session)['first_name']).to eq('John')
351
393
  end
352
394
  end
353
395
 
354
396
  context "with a locator that doesn't exist" do
355
- it "should raise an error" do
356
- msg = "Unable to find visible button \"does not exist\""
397
+ it 'should raise an error' do
398
+ msg = /Unable to find button "does not exist"/
357
399
  expect do
358
400
  @session.click_button('does not exist')
359
401
  end.to raise_error(Capybara::ElementNotFound, msg)
360
402
  end
361
403
  end
362
404
 
363
- context "with formaction attribute on button" do
364
- it "should submit to the formaction attribute" do
405
+ context 'with formaction attribute on button' do
406
+ it 'should submit to the formaction attribute' do
365
407
  @session.click_button('Formaction button')
366
- @results = extract_results(@session)
408
+ results = extract_results(@session)
367
409
  expect(@session.current_path).to eq '/form'
368
- expect(@results['which_form']).to eq 'formaction form'
410
+ expect(results['which_form']).to eq 'formaction form'
369
411
  end
370
412
  end
371
413
 
372
- context "with formmethod attribute on button" do
373
- it "should submit to the formethod attribute" do
414
+ context 'with formmethod attribute on button' do
415
+ it 'should submit to the formethod attribute' do
374
416
  @session.click_button('Formmethod button')
375
- @results = extract_results(@session)
417
+ results = extract_results(@session)
376
418
  expect(@session.current_path).to eq '/form/get'
377
- expect(@results['which_form']).to eq 'formaction form'
419
+ expect(results['which_form']).to eq 'formaction form'
378
420
  end
379
421
  end
380
422
 
381
- it "should serialize and send valueless buttons that were clicked" do
423
+ it 'should serialize and send valueless buttons that were clicked' do
382
424
  @session.click_button('No Value!')
383
- @results = extract_results(@session)
384
- expect(@results['no_value']).not_to be_nil
425
+ results = extract_results(@session)
426
+ expect(results['no_value']).not_to be_nil
427
+ end
428
+
429
+ it 'should send button in document order' do
430
+ @session.click_button('outside_button')
431
+ results = extract_results(@session)
432
+ expect(results.keys).to eq %w[for_form2 outside_button which_form post_count]
385
433
  end
386
434
 
387
- it "should not send image buttons that were not clicked" do
435
+ it 'should not send image buttons that were not clicked' do
388
436
  @session.click_button('Click me!')
389
- @results = extract_results(@session)
390
- expect(@results['okay']).to be_nil
437
+ results = extract_results(@session)
438
+ expect(results['okay']).to be_nil
391
439
  end
392
440
 
393
- it "should serialize and send GET forms" do
441
+ it 'should serialize and send GET forms' do
394
442
  @session.visit('/form')
395
443
  @session.click_button('med')
396
- @results = extract_results(@session)
397
- expect(@results['middle_name']).to eq('Darren')
398
- expect(@results['foo']).to be_nil
444
+ results = extract_results(@session)
445
+ expect(results['middle_name']).to eq('Darren')
446
+ expect(results['foo']).to be_nil
399
447
  end
400
448
 
401
- it "should follow redirects" do
449
+ it 'should follow redirects' do
402
450
  @session.click_button('Go FAR')
403
451
  expect(@session).to have_content('You landed')
404
452
  expect(@session.current_url).to match(%r{/landed$})
405
453
  end
406
454
 
407
- it "should post pack to the same URL when no action given" do
455
+ it 'should follow temporary redirects that maintain method' do
456
+ @session.click_button('Go 307')
457
+ expect(@session).to have_content('You post landed: TWTW')
458
+ end
459
+
460
+ it 'should follow permanent redirects that maintain method' do
461
+ @session.click_button('Go 308')
462
+ expect(@session).to have_content('You post landed: TWTW')
463
+ end
464
+
465
+ it 'should post pack to the same URL when no action given' do
408
466
  @session.visit('/postback')
409
467
  @session.click_button('With no action')
410
468
  expect(@session).to have_content('Postback')
411
469
  end
412
470
 
413
- it "should post pack to the same URL when blank action given" do
471
+ it 'should post pack to the same URL when blank action given' do
414
472
  @session.visit('/postback')
415
473
  @session.click_button('With blank action')
416
474
  expect(@session).to have_content('Postback')
417
475
  end
418
476
 
419
- it "ignores disabled buttons" do
477
+ it 'ignores disabled buttons' do
420
478
  expect do
421
479
  @session.click_button('Disabled button')
422
480
  end.to raise_error(Capybara::ElementNotFound)
423
481
  end
424
482
 
425
- it "should encode complex field names, like array[][value]" do
483
+ it 'should encode complex field names, like array[][value]' do
426
484
  @session.visit('/form')
427
- @session.fill_in('address1_city', :with =>'Paris')
428
- @session.fill_in('address1_street', :with =>'CDG')
485
+ @session.fill_in('address1_city', with: 'Paris')
486
+ @session.fill_in('address1_street', with: 'CDG')
429
487
 
430
488
  @session.fill_in('address2_city', with: 'Mikolaiv')
431
489
  @session.fill_in('address2_street', with: 'PGS')
432
490
 
433
- @session.click_button "awesome"
491
+ @session.click_button 'awesome'
434
492
 
435
- addresses=extract_results(@session)["addresses"]
493
+ addresses = extract_results(@session)['addresses']
436
494
  expect(addresses.size).to eq(2)
437
495
 
438
- expect(addresses[0]["street"]).to eq('CDG')
439
- expect(addresses[0]["city"]).to eq('Paris')
440
- expect(addresses[0]["country"]).to eq('France')
496
+ expect(addresses[0]['street']).to eq('CDG')
497
+ expect(addresses[0]['city']).to eq('Paris')
498
+ expect(addresses[0]['country']).to eq('France')
441
499
 
442
- expect(addresses[1]["street"]).to eq('PGS')
443
- expect(addresses[1]["city"]).to eq('Mikolaiv')
444
- expect(addresses[1]["country"]).to eq('Ukraine')
500
+ expect(addresses[1]['street']).to eq('PGS')
501
+ expect(addresses[1]['city']).to eq('Mikolaiv')
502
+ expect(addresses[1]['country']).to eq('Ukraine')
445
503
  end
446
504
 
447
- context "with :exact option" do
448
- it "should accept partial matches when false" do
449
- @session.click_button('What an Awesome', exact: false)
505
+ context 'with :exact option' do
506
+ it 'should accept partial matches when false' do
507
+ @session.click_button('What an Awesome', exact: false)
450
508
  expect(extract_results(@session)['first_name']).to eq('John')
451
509
  end
452
510
 
453
- it "should not accept partial matches when true" do
511
+ it 'should not accept partial matches when true' do
454
512
  expect do
455
- @session.click_button('What an Awesome', exact: true)
513
+ @session.click_button('What an Awesome', exact: true)
456
514
  end.to raise_error(Capybara::ElementNotFound)
457
515
  end
458
516
  end