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
@@ -1,38 +0,0 @@
1
- <div id="selectors">
2
- <h2>Built-in Selectors</h2>
3
- <ul>
4
- <% @selectors.each do |name, selector| %>
5
- <li>
6
- <h3>:<%= name %></h3>
7
- <div class="docstring">
8
- <div class="discussion">
9
- <p><%= h(selector.docstring) %></p>
10
- </div>
11
- </div>
12
- <div class="tags">
13
- <p class="inline">Locator:</p>
14
- <% if locator=selector.tag('locator') %>
15
- <p class="inline"><%= h locator.text %></p>
16
- <% end %>
17
- <% if selector.has_tag?('filter') %>
18
- <p>Filters:</p>
19
- <ul class="param">
20
- <% selector.tags('filter').each do |filter| %>
21
- <li>
22
- <span class="name"><%= filter.name %></span>
23
- <% if filter.types %>
24
- <span class="type">(<tt><%= h(filter.types.join(', ')) %></tt>)</span>
25
- <% end %>
26
- <% if filter.text %>
27
-
28
- <div class="inline"><p><%= h filter.text %></p></div>
29
- <% end %>
30
- </li>
31
- <% end %>
32
- </ul>
33
- <% end %>
34
- </div
35
- </li>
36
- <% end %>
37
- </ul>
38
- </div>
@@ -1,17 +0,0 @@
1
- def init
2
- super
3
- sections.place(:builtins).before(:subclasses)
4
- end
5
-
6
- def builtins
7
- return if object.path != "Capybara::Selector" # only show built-in selectors for Selector class
8
-
9
- @selectors = Registry.all(:selector)
10
- return if @selectors.nil? || @selectors.empty?
11
-
12
- @selectors = @selectors.map do |selector|
13
- [selector.name, selector]
14
- end
15
-
16
- erb(:selectors)
17
- end
@@ -1,78 +0,0 @@
1
- YARD::Templates::Engine.register_template_path Pathname.new('./.yard/templates_custom')
2
-
3
- YARD::Tags::Library.define_tag "Locator", :locator
4
- YARD::Tags::Library.define_tag "Filter", :filter, :with_types_and_name
5
-
6
- class SelectorObject < YARD::CodeObjects::Base
7
- def path
8
- "__Capybara" + sep + super
9
- end
10
- end
11
-
12
- class AddSelectorHandler < YARD::Handlers::Ruby::Base
13
- handles method_call(:add_selector)
14
- namespace_only
15
- process do
16
- name = statement.parameters.first.jump(:tstring_content, :ident).source
17
- # object = YARD::CodeObjects::MethodObject.new(namespace, name.to_sym)
18
- # object = SelectorObject.new(YARD::Registry.resolve(P("Capybara"), "#add_selector", false, true), name.to_sym)
19
- object = SelectorObject.new(namespace, name)
20
- register(object)
21
- parse_block(statement.last.last, :owner => object)
22
-
23
- # modify the object
24
- object.dynamic = true
25
- end
26
- end
27
-
28
- class AddExpressionFilterHandler < YARD::Handlers::Ruby::Base
29
- handles method_call(:xpath)
30
- handles method_call(:css)
31
-
32
- process do
33
- return unless owner.is_a?(SelectorObject)
34
- return if statement.parameters.empty?
35
- # names = statement.parameters.children.map { |p| p.jump(:tstring_content, :ident).source.sub(/^:/, '') }
36
- names = statement.parameters.children.map &:source
37
- current_names = owner.tags(:filter).map(&:name)
38
- (names-current_names).each do |name|
39
- owner.add_tag(YARD::Tags::Tag.new(:filter, nil, nil, name))
40
- end
41
- end
42
- end
43
-
44
- class AddFilterHandler < YARD::Handlers::Ruby::Base
45
- handles method_call(:filter)
46
-
47
- process do
48
- return unless owner.is_a?(SelectorObject)
49
- return if statement.parameters.empty?
50
- name = statement.parameters.first.source
51
- type = if statement.parameters[1] && statement.parameters[1].source == ':boolean'
52
- 'Boolean'
53
- else
54
- nil
55
- end
56
- if owner.tags(:filter).none? {|tag| tag.name == name }
57
- filter_tag = YARD::Tags::Tag.new(:filter, nil, type, name)
58
- owner.add_tag(filter_tag)
59
- end
60
- end
61
- end
62
-
63
- class FilterSetHandler < YARD::Handlers::Ruby::Base
64
- handles method_call(:filter_set)
65
-
66
- process do
67
- return unless owner.is_a?(SelectorObject)
68
- return if statement.parameters.empty? || !statement.parameters[1]
69
-
70
- names = statement.parameters[1].flatten.map { |name| ":#{name}" }
71
- names.each do |name|
72
- if owner.tags(:filter).none? {|tag| tag.name == name }
73
- filter_tag = YARD::Tags::Tag.new(:filter, nil, nil, name)
74
- owner.add_tag(filter_tag)
75
- end
76
- end
77
- end
78
- end
@@ -1,90 +0,0 @@
1
- module Capybara
2
- module RSpecMatchers
3
- module Compound
4
- include ::RSpec::Matchers::Composable
5
-
6
- def and(matcher)
7
- Capybara::RSpecMatchers::Compound::And.new(self, matcher)
8
- end
9
-
10
- def and_then(matcher)
11
- ::RSpec::Matchers::BuiltIn::Compound::And.new(self, matcher)
12
- end
13
-
14
- def or(matcher)
15
- Capybara::RSpecMatchers::Compound::Or.new(self, matcher)
16
- end
17
-
18
- class CapybaraEvaluator
19
- def initialize(actual)
20
- @actual = actual
21
- @match_results = Hash.new { |h, matcher| h[matcher] = matcher.matches?(@actual) }
22
- end
23
-
24
- def matcher_matches?(matcher)
25
- @match_results[matcher]
26
- end
27
-
28
- def reset
29
- @match_results.clear
30
- end
31
- end
32
-
33
- class And < ::RSpec::Matchers::BuiltIn::Compound::And
34
- private
35
-
36
- def match(_expected, actual)
37
- @evaluator = CapybaraEvaluator.new(actual)
38
- syncer = sync_element(actual)
39
- begin
40
- syncer.synchronize do
41
- @evaluator.reset
42
- raise ::Capybara::ElementNotFound unless [matcher_1_matches?, matcher_2_matches?].all?
43
- true
44
- end
45
- rescue
46
- false
47
- end
48
- end
49
-
50
- def sync_element(el)
51
- if el.respond_to? :synchronize
52
- el
53
- elsif el.respond_to? :current_scope
54
- el.current_scope
55
- else
56
- Capybara.string(el)
57
- end
58
- end
59
- end
60
-
61
- class Or < ::RSpec::Matchers::BuiltIn::Compound::Or
62
- private
63
-
64
- def match(_expected, actual)
65
- @evaluator = CapybaraEvaluator.new(actual)
66
- syncer = sync_element(actual)
67
- begin
68
- syncer.synchronize do
69
- @evaluator.reset
70
- raise ::Capybara::ElementNotFound unless [matcher_1_matches?, matcher_2_matches?].any?
71
- true
72
- end
73
- rescue
74
- false
75
- end
76
- end
77
-
78
- def sync_element(el)
79
- if el.respond_to? :synchronize
80
- el
81
- elsif el.respond_to? :current_scope
82
- el.current_scope
83
- else
84
- Capybara.string(el)
85
- end
86
- end
87
- end
88
- end
89
- end
90
- end
@@ -1,149 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- Capybara::SpecHelper.spec '#assert_selector' do
4
- before do
5
- @session.visit('/with_html')
6
- end
7
-
8
- it "should be true if the given selector is on the page" do
9
- @session.assert_selector(:xpath, "//p")
10
- @session.assert_selector(:css, "p a#foo")
11
- @session.assert_selector("//p[contains(.,'est')]")
12
- end
13
-
14
- it "should be false if the given selector is not on the page" do
15
- expect { @session.assert_selector(:xpath, "//abbr") }.to raise_error(Capybara::ElementNotFound)
16
- expect { @session.assert_selector(:css, "p a#doesnotexist") }.to raise_error(Capybara::ElementNotFound)
17
- expect { @session.assert_selector("//p[contains(.,'thisstringisnotonpage')]") }.to raise_error(Capybara::ElementNotFound)
18
- end
19
-
20
- it "should use default selector" do
21
- Capybara.default_selector = :css
22
- expect { @session.assert_selector("p a#doesnotexist") }.to raise_error(Capybara::ElementNotFound)
23
- @session.assert_selector("p a#foo")
24
- end
25
-
26
- it "should respect scopes" do
27
- @session.within "//p[@id='first']" do
28
- @session.assert_selector(".//a[@id='foo']")
29
- expect { @session.assert_selector(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
30
- end
31
- end
32
-
33
- context "with count" do
34
- it "should be true if the content is on the page the given number of times" do
35
- @session.assert_selector("//p", count: 3)
36
- @session.assert_selector("//p//a[@id='foo']", count: 1)
37
- @session.assert_selector("//p[contains(.,'est')]", count: 1)
38
- end
39
-
40
- it "should be false if the content is on the page the given number of times" do
41
- expect { @session.assert_selector("//p", count: 6) }.to raise_error(Capybara::ElementNotFound)
42
- expect { @session.assert_selector("//p//a[@id='foo']", count: 2) }.to raise_error(Capybara::ElementNotFound)
43
- expect { @session.assert_selector("//p[contains(.,'est')]", count: 5) }.to raise_error(Capybara::ElementNotFound)
44
- end
45
-
46
- it "should be false if the content isn't on the page at all" do
47
- expect { @session.assert_selector("//abbr", count: 2) }.to raise_error(Capybara::ElementNotFound)
48
- expect { @session.assert_selector("//p//a[@id='doesnotexist']", count: 1) }.to raise_error(Capybara::ElementNotFound)
49
- end
50
- end
51
-
52
- context "with text" do
53
- it "should discard all matches where the given string is not contained" do
54
- @session.assert_selector("//p//a", text: "Redirect", count: 1)
55
- expect { @session.assert_selector("//p", text: "Doesnotexist") }.to raise_error(Capybara::ElementNotFound)
56
- end
57
-
58
- it "should discard all matches where the given regexp is not matched" do
59
- @session.assert_selector("//p//a", text: /re[dab]i/i, count: 1)
60
- expect { @session.assert_selector("//p//a", text: /Red$/) }.to raise_error(Capybara::ElementNotFound)
61
- end
62
- end
63
-
64
- context "with wait", requires: [:js] do
65
- it "should find element if it appears before given wait duration" do
66
- Capybara.using_wait_time(0.1) do
67
- @session.visit('/with_js')
68
- @session.click_link('Click me')
69
- @session.assert_selector(:css, "a#has-been-clicked", text: "Has been clicked", wait: 2)
70
- end
71
- end
72
- end
73
- end
74
-
75
- Capybara::SpecHelper.spec '#refute_selector' do
76
- it "should be an alias of #assert_no_selector" do
77
- expect(Capybara::Node::Matchers.instance_method(:refute_selector)).to eq Capybara::Node::Matchers.instance_method(:assert_no_selector)
78
- end
79
- end
80
-
81
- Capybara::SpecHelper.spec '#assert_no_selector' do
82
- before do
83
- @session.visit('/with_html')
84
- end
85
-
86
- it "should be false if the given selector is on the page" do
87
- expect { @session.assert_no_selector(:xpath, "//p") }.to raise_error(Capybara::ElementNotFound)
88
- expect { @session.assert_no_selector(:css, "p a#foo") }.to raise_error(Capybara::ElementNotFound)
89
- expect { @session.assert_no_selector("//p[contains(.,'est')]") }.to raise_error(Capybara::ElementNotFound)
90
- end
91
-
92
- it "should be true if the given selector is not on the page" do
93
- @session.assert_no_selector(:xpath, "//abbr")
94
- @session.assert_no_selector(:css, "p a#doesnotexist")
95
- @session.assert_no_selector("//p[contains(.,'thisstringisnotonpage')]")
96
- end
97
-
98
- it "should use default selector" do
99
- Capybara.default_selector = :css
100
- @session.assert_no_selector("p a#doesnotexist")
101
- expect { @session.assert_no_selector("p a#foo") }.to raise_error(Capybara::ElementNotFound)
102
- end
103
-
104
- it "should respect scopes" do
105
- @session.within "//p[@id='first']" do
106
- expect { @session.assert_no_selector(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
107
- @session.assert_no_selector(".//a[@id='red']")
108
- end
109
- end
110
-
111
- context "with count" do
112
- it "should be false if the content is on the page the given number of times" do
113
- expect { @session.assert_no_selector("//p", count: 3) }.to raise_error(Capybara::ElementNotFound)
114
- expect { @session.assert_no_selector("//p//a[@id='foo']", count: 1) }.to raise_error(Capybara::ElementNotFound)
115
- expect { @session.assert_no_selector("//p[contains(.,'est')]", count: 1) }.to raise_error(Capybara::ElementNotFound)
116
- end
117
-
118
- it "should be true if the content is on the page the wrong number of times" do
119
- @session.assert_no_selector("//p", count: 6)
120
- @session.assert_no_selector("//p//a[@id='foo']", count: 2)
121
- @session.assert_no_selector("//p[contains(.,'est')]", count: 5)
122
- end
123
-
124
- it "should be true if the content isn't on the page at all" do
125
- @session.assert_no_selector("//abbr", count: 2)
126
- @session.assert_no_selector("//p//a[@id='doesnotexist']", count: 1)
127
- end
128
- end
129
-
130
- context "with text" do
131
- it "should discard all matches where the given string is contained" do
132
- expect { @session.assert_no_selector("//p//a", text: "Redirect", count: 1) }.to raise_error(Capybara::ElementNotFound)
133
- @session.assert_no_selector("//p", text: "Doesnotexist")
134
- end
135
-
136
- it "should discard all matches where the given regexp is matched" do
137
- expect { @session.assert_no_selector("//p//a", text: /re[dab]i/i, count: 1) }.to raise_error(Capybara::ElementNotFound)
138
- @session.assert_no_selector("//p//a", text: /Red$/)
139
- end
140
- end
141
-
142
- context "with wait", requires: [:js] do
143
- it "should not find element if it appears after given wait duration" do
144
- @session.visit('/with_js')
145
- @session.click_link('Click me')
146
- @session.assert_no_selector(:css, "a#has-been-clicked", text: "Has been clicked", wait: 0.1)
147
- end
148
- end
149
- 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,143 +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
- Capybara.register_driver :selenium_marionette do |app|
14
- # ::Selenium::WebDriver.logger.level = "debug"
15
- Capybara::Selenium::Driver.new(
16
- app,
17
- browser: :firefox,
18
- desired_capabilities: { marionette: true, 'moz:webdriverClick': true },
19
- options: browser_options
20
- # Get a trace level log from geckodriver
21
- # :driver_opts => { args: ['-vv'] }
22
- )
23
- end
24
-
25
- Capybara.register_driver :selenium_marionette_clear_storage do |app|
26
- Capybara::Selenium::Driver.new(
27
- app,
28
- browser: :firefox,
29
- desired_capabilities: { marionette: true },
30
- clear_local_storage: true,
31
- clear_session_storage: true,
32
- options: browser_options
33
- )
34
- end
35
-
36
- module TestSessions
37
- SeleniumMarionette = Capybara::Session.new(:selenium_marionette, TestApp)
38
- end
39
-
40
- skipped_tests = %i[response_headers status_code trigger]
41
- skipped_tests << :windows if ENV['TRAVIS'] && ENV['SKIP_WINDOW']
42
-
43
- $stdout.puts `#{Selenium::WebDriver::Firefox.driver_path} --version` if ENV['CI']
44
-
45
- Capybara::SpecHelper.run_specs TestSessions::SeleniumMarionette, "selenium", capybara_skip: skipped_tests
46
-
47
- RSpec.describe "Capybara::Session with firefox" do
48
- include Capybara::SpecHelper
49
- include_examples "Capybara::Session", TestSessions::SeleniumMarionette, :selenium_marionette
50
- include_examples Capybara::RSpecMatchers, TestSessions::SeleniumMarionette, :selenium_marionette
51
- end
52
-
53
- RSpec.describe Capybara::Selenium::Driver do
54
- before do
55
- @driver = Capybara::Selenium::Driver.new(TestApp, browser: :firefox, options: browser_options)
56
- end
57
-
58
- describe '#quit' do
59
- it "should reset browser when quit" do
60
- expect(@driver.browser).to be
61
- @driver.quit
62
- # access instance variable directly so we don't create a new browser instance
63
- expect(@driver.instance_variable_get(:@browser)).to be_nil
64
- end
65
-
66
- context "with errors" do
67
- before do
68
- @original_browser = @driver.browser
69
- end
70
- after do
71
- # Ensure browser is actually quit so we don't leave hanging processe
72
- RSpec::Mocks.space.proxy_for(@original_browser).reset
73
- @original_browser.quit
74
- end
75
-
76
- it "warns UnknownError returned during quit because the browser is probably already gone" do
77
- expect_any_instance_of(Capybara::Selenium::Driver).to receive(:warn).with(/random message/)
78
- allow(@driver.browser).to(
79
- receive(:quit)
80
- .and_raise(Selenium::WebDriver::Error::UnknownError, "random message")
81
- )
82
-
83
- expect { @driver.quit }.not_to raise_error
84
- expect(@driver.instance_variable_get(:@browser)).to be_nil
85
- end
86
-
87
- it "ignores silenced UnknownError returned during quit because the browser is almost definitely already gone" do
88
- expect_any_instance_of(Capybara::Selenium::Driver).not_to receive(:warn)
89
- allow(@driver.browser).to(
90
- receive(:quit)
91
- .and_raise(Selenium::WebDriver::Error::UnknownError, "Error communicating with the remote browser")
92
- )
93
-
94
- expect { @driver.quit }.not_to raise_error
95
- expect(@driver.instance_variable_get(:@browser)).to be_nil
96
- end
97
- end
98
- end
99
-
100
- context "storage" do
101
- describe "#reset!" do
102
- it "does not clear either storage by default" do
103
- @session = TestSessions::SeleniumMarionette
104
- @session.visit('/with_js')
105
- @session.find(:css, '#set-storage').click
106
- @session.reset!
107
- @session.visit('/with_js')
108
- expect(@session.driver.browser.local_storage.keys).not_to be_empty
109
- expect(@session.driver.browser.session_storage.keys).not_to be_empty
110
- end
111
-
112
- it "clears storage when set" do
113
- @session = Capybara::Session.new(:selenium_marionette_clear_storage, TestApp)
114
- @session.visit('/with_js')
115
- @session.find(:css, '#set-storage').click
116
- @session.reset!
117
- @session.visit('/with_js')
118
- expect(@session.driver.browser.local_storage.keys).to be_empty
119
- expect(@session.driver.browser.session_storage.keys).to be_empty
120
- end
121
- end
122
- end
123
-
124
- context "#refresh" do
125
- def extract_results(session)
126
- expect(session).to have_xpath("//pre[@id='results']")
127
- YAML.load Nokogiri::HTML(session.body).xpath("//pre[@id='results']").first.inner_html.lstrip
128
- end
129
-
130
- it "can repost by accepting confirm" do
131
- @session = TestSessions::SeleniumMarionette
132
- @session.visit('/form')
133
- @session.select('Sweden', from: 'form_region')
134
- @session.click_button('awesome')
135
- expect do
136
- @session.accept_confirm(wait: 0.1) do
137
- @session.refresh
138
- sleep 2
139
- end
140
- end.to change { extract_results(@session)['post_count'] }.by(1)
141
- end
142
- end
143
- end