mega-max-rb 0.0.1

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 (319) hide show
  1. checksums.yaml +7 -0
  2. data/capybara-3.40.0/History.md +2043 -0
  3. data/capybara-3.40.0/License.txt +22 -0
  4. data/capybara-3.40.0/README.md +1264 -0
  5. data/capybara-3.40.0/lib/capybara/config.rb +104 -0
  6. data/capybara-3.40.0/lib/capybara/cucumber.rb +27 -0
  7. data/capybara-3.40.0/lib/capybara/driver/base.rb +178 -0
  8. data/capybara-3.40.0/lib/capybara/driver/node.rb +143 -0
  9. data/capybara-3.40.0/lib/capybara/dsl.rb +59 -0
  10. data/capybara-3.40.0/lib/capybara/helpers.rb +127 -0
  11. data/capybara-3.40.0/lib/capybara/minitest/spec.rb +279 -0
  12. data/capybara-3.40.0/lib/capybara/minitest.rb +398 -0
  13. data/capybara-3.40.0/lib/capybara/node/actions.rb +420 -0
  14. data/capybara-3.40.0/lib/capybara/node/base.rb +144 -0
  15. data/capybara-3.40.0/lib/capybara/node/document.rb +48 -0
  16. data/capybara-3.40.0/lib/capybara/node/document_matchers.rb +67 -0
  17. data/capybara-3.40.0/lib/capybara/node/element.rb +613 -0
  18. data/capybara-3.40.0/lib/capybara/node/finders.rb +335 -0
  19. data/capybara-3.40.0/lib/capybara/node/matchers.rb +908 -0
  20. data/capybara-3.40.0/lib/capybara/node/simple.rb +216 -0
  21. data/capybara-3.40.0/lib/capybara/node/whitespace_normalizer.rb +81 -0
  22. data/capybara-3.40.0/lib/capybara/queries/active_element_query.rb +18 -0
  23. data/capybara-3.40.0/lib/capybara/queries/ancestor_query.rb +28 -0
  24. data/capybara-3.40.0/lib/capybara/queries/base_query.rb +106 -0
  25. data/capybara-3.40.0/lib/capybara/queries/current_path_query.rb +61 -0
  26. data/capybara-3.40.0/lib/capybara/queries/match_query.rb +26 -0
  27. data/capybara-3.40.0/lib/capybara/queries/selector_query.rb +761 -0
  28. data/capybara-3.40.0/lib/capybara/queries/sibling_query.rb +27 -0
  29. data/capybara-3.40.0/lib/capybara/queries/style_query.rb +45 -0
  30. data/capybara-3.40.0/lib/capybara/queries/text_query.rb +116 -0
  31. data/capybara-3.40.0/lib/capybara/queries/title_query.rb +39 -0
  32. data/capybara-3.40.0/lib/capybara/rack_test/browser.rb +200 -0
  33. data/capybara-3.40.0/lib/capybara/rack_test/css_handlers.rb +13 -0
  34. data/capybara-3.40.0/lib/capybara/rack_test/driver.rb +110 -0
  35. data/capybara-3.40.0/lib/capybara/rack_test/errors.rb +6 -0
  36. data/capybara-3.40.0/lib/capybara/rack_test/form.rb +149 -0
  37. data/capybara-3.40.0/lib/capybara/rack_test/node.rb +324 -0
  38. data/capybara-3.40.0/lib/capybara/rails.rb +16 -0
  39. data/capybara-3.40.0/lib/capybara/registration_container.rb +41 -0
  40. data/capybara-3.40.0/lib/capybara/registrations/drivers.rb +42 -0
  41. data/capybara-3.40.0/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/capybara-3.40.0/lib/capybara/registrations/servers.rb +66 -0
  43. data/capybara-3.40.0/lib/capybara/result.rb +186 -0
  44. data/capybara-3.40.0/lib/capybara/rspec/features.rb +23 -0
  45. data/capybara-3.40.0/lib/capybara/rspec/matcher_proxies.rb +82 -0
  46. data/capybara-3.40.0/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/capybara-3.40.0/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/capybara-3.40.0/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/capybara-3.40.0/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/capybara-3.40.0/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/capybara-3.40.0/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/capybara-3.40.0/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/capybara-3.40.0/lib/capybara/rspec/matchers.rb +207 -0
  60. data/capybara-3.40.0/lib/capybara/rspec.rb +31 -0
  61. data/capybara-3.40.0/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/capybara-3.40.0/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/capybara-3.40.0/lib/capybara/selector/css.rb +102 -0
  64. data/capybara-3.40.0/lib/capybara/selector/definition/button.rb +68 -0
  65. data/capybara-3.40.0/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/capybara-3.40.0/lib/capybara/selector/definition/css.rb +10 -0
  67. data/capybara-3.40.0/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/capybara-3.40.0/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/capybara-3.40.0/lib/capybara/selector/definition/element.rb +28 -0
  70. data/capybara-3.40.0/lib/capybara/selector/definition/field.rb +40 -0
  71. data/capybara-3.40.0/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/capybara-3.40.0/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/capybara-3.40.0/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/capybara-3.40.0/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/capybara-3.40.0/lib/capybara/selector/definition/id.rb +6 -0
  76. data/capybara-3.40.0/lib/capybara/selector/definition/label.rb +62 -0
  77. data/capybara-3.40.0/lib/capybara/selector/definition/link.rb +55 -0
  78. data/capybara-3.40.0/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/capybara-3.40.0/lib/capybara/selector/definition/option.rb +27 -0
  80. data/capybara-3.40.0/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/capybara-3.40.0/lib/capybara/selector/definition/select.rb +81 -0
  82. data/capybara-3.40.0/lib/capybara/selector/definition/table.rb +109 -0
  83. data/capybara-3.40.0/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/capybara-3.40.0/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/capybara-3.40.0/lib/capybara/selector/definition.rb +280 -0
  86. data/capybara-3.40.0/lib/capybara/selector/filter.rb +5 -0
  87. data/capybara-3.40.0/lib/capybara/selector/filter_set.rb +121 -0
  88. data/capybara-3.40.0/lib/capybara/selector/filters/base.rb +77 -0
  89. data/capybara-3.40.0/lib/capybara/selector/filters/expression_filter.rb +22 -0
  90. data/capybara-3.40.0/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/capybara-3.40.0/lib/capybara/selector/filters/node_filter.rb +31 -0
  92. data/capybara-3.40.0/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/capybara-3.40.0/lib/capybara/selector/selector.rb +159 -0
  94. data/capybara-3.40.0/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/capybara-3.40.0/lib/capybara/selector.rb +494 -0
  96. data/capybara-3.40.0/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/capybara-3.40.0/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/capybara-3.40.0/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/capybara-3.40.0/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/capybara-3.40.0/lib/capybara/selenium/driver.rb +517 -0
  101. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  102. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/capybara-3.40.0/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/capybara-3.40.0/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/capybara-3.40.0/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/capybara-3.40.0/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/capybara-3.40.0/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/capybara-3.40.0/lib/capybara/selenium/node.rb +636 -0
  112. data/capybara-3.40.0/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/capybara-3.40.0/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  114. data/capybara-3.40.0/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  115. data/capybara-3.40.0/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/capybara-3.40.0/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/capybara-3.40.0/lib/capybara/selenium/patches/atoms.rb +18 -0
  118. data/capybara-3.40.0/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/capybara-3.40.0/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/capybara-3.40.0/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/capybara-3.40.0/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/capybara-3.40.0/lib/capybara/server/animation_disabler.rb +80 -0
  123. data/capybara-3.40.0/lib/capybara/server/checker.rb +44 -0
  124. data/capybara-3.40.0/lib/capybara/server/middleware.rb +71 -0
  125. data/capybara-3.40.0/lib/capybara/server.rb +126 -0
  126. data/capybara-3.40.0/lib/capybara/session/config.rb +128 -0
  127. data/capybara-3.40.0/lib/capybara/session/matchers.rb +87 -0
  128. data/capybara-3.40.0/lib/capybara/session.rb +951 -0
  129. data/capybara-3.40.0/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
  130. data/capybara-3.40.0/lib/capybara/spec/fixtures/capybara.jpg +3 -0
  131. data/capybara-3.40.0/lib/capybara/spec/fixtures/no_extension +1 -0
  132. data/capybara-3.40.0/lib/capybara/spec/fixtures/test_file.txt +1 -0
  133. data/capybara-3.40.0/lib/capybara/spec/public/jquery-ui.js +13 -0
  134. data/capybara-3.40.0/lib/capybara/spec/public/jquery.js +5 -0
  135. data/capybara-3.40.0/lib/capybara/spec/public/offset.js +6 -0
  136. data/capybara-3.40.0/lib/capybara/spec/public/test.js +284 -0
  137. data/capybara-3.40.0/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
  138. data/capybara-3.40.0/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
  139. data/capybara-3.40.0/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
  140. data/capybara-3.40.0/lib/capybara/spec/session/active_element_spec.rb +31 -0
  141. data/capybara-3.40.0/lib/capybara/spec/session/all_spec.rb +274 -0
  142. data/capybara-3.40.0/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  143. data/capybara-3.40.0/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  144. data/capybara-3.40.0/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  145. data/capybara-3.40.0/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  146. data/capybara-3.40.0/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  147. data/capybara-3.40.0/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  148. data/capybara-3.40.0/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  149. data/capybara-3.40.0/lib/capybara/spec/session/attach_file_spec.rb +222 -0
  150. data/capybara-3.40.0/lib/capybara/spec/session/body_spec.rb +23 -0
  151. data/capybara-3.40.0/lib/capybara/spec/session/check_spec.rb +251 -0
  152. data/capybara-3.40.0/lib/capybara/spec/session/choose_spec.rb +127 -0
  153. data/capybara-3.40.0/lib/capybara/spec/session/click_button_spec.rb +517 -0
  154. data/capybara-3.40.0/lib/capybara/spec/session/click_link_or_button_spec.rb +138 -0
  155. data/capybara-3.40.0/lib/capybara/spec/session/click_link_spec.rb +240 -0
  156. data/capybara-3.40.0/lib/capybara/spec/session/current_scope_spec.rb +31 -0
  157. data/capybara-3.40.0/lib/capybara/spec/session/current_url_spec.rb +125 -0
  158. data/capybara-3.40.0/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
  159. data/capybara-3.40.0/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
  160. data/capybara-3.40.0/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
  161. data/capybara-3.40.0/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
  162. data/capybara-3.40.0/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
  163. data/capybara-3.40.0/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
  164. data/capybara-3.40.0/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  165. data/capybara-3.40.0/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
  166. data/capybara-3.40.0/lib/capybara/spec/session/execute_script_spec.rb +28 -0
  167. data/capybara-3.40.0/lib/capybara/spec/session/fill_in_spec.rb +292 -0
  168. data/capybara-3.40.0/lib/capybara/spec/session/find_button_spec.rb +74 -0
  169. data/capybara-3.40.0/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
  170. data/capybara-3.40.0/lib/capybara/spec/session/find_field_spec.rb +113 -0
  171. data/capybara-3.40.0/lib/capybara/spec/session/find_link_spec.rb +80 -0
  172. data/capybara-3.40.0/lib/capybara/spec/session/find_spec.rb +545 -0
  173. data/capybara-3.40.0/lib/capybara/spec/session/first_spec.rb +156 -0
  174. data/capybara-3.40.0/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  175. data/capybara-3.40.0/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  176. data/capybara-3.40.0/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  177. data/capybara-3.40.0/lib/capybara/spec/session/frame/within_frame_spec.rb +114 -0
  178. data/capybara-3.40.0/lib/capybara/spec/session/go_back_spec.rb +12 -0
  179. data/capybara-3.40.0/lib/capybara/spec/session/go_forward_spec.rb +14 -0
  180. data/capybara-3.40.0/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  181. data/capybara-3.40.0/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  182. data/capybara-3.40.0/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  183. data/capybara-3.40.0/lib/capybara/spec/session/has_button_spec.rb +150 -0
  184. data/capybara-3.40.0/lib/capybara/spec/session/has_css_spec.rb +375 -0
  185. data/capybara-3.40.0/lib/capybara/spec/session/has_current_path_spec.rb +151 -0
  186. data/capybara-3.40.0/lib/capybara/spec/session/has_element_spec.rb +47 -0
  187. data/capybara-3.40.0/lib/capybara/spec/session/has_field_spec.rb +389 -0
  188. data/capybara-3.40.0/lib/capybara/spec/session/has_link_spec.rb +79 -0
  189. data/capybara-3.40.0/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  190. data/capybara-3.40.0/lib/capybara/spec/session/has_select_spec.rb +316 -0
  191. data/capybara-3.40.0/lib/capybara/spec/session/has_selector_spec.rb +217 -0
  192. data/capybara-3.40.0/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  193. data/capybara-3.40.0/lib/capybara/spec/session/has_table_spec.rb +209 -0
  194. data/capybara-3.40.0/lib/capybara/spec/session/has_text_spec.rb +375 -0
  195. data/capybara-3.40.0/lib/capybara/spec/session/has_title_spec.rb +71 -0
  196. data/capybara-3.40.0/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
  197. data/capybara-3.40.0/lib/capybara/spec/session/headers_spec.rb +8 -0
  198. data/capybara-3.40.0/lib/capybara/spec/session/html_spec.rb +47 -0
  199. data/capybara-3.40.0/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  200. data/capybara-3.40.0/lib/capybara/spec/session/node_spec.rb +1399 -0
  201. data/capybara-3.40.0/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  202. data/capybara-3.40.0/lib/capybara/spec/session/refresh_spec.rb +34 -0
  203. data/capybara-3.40.0/lib/capybara/spec/session/reset_session_spec.rb +161 -0
  204. data/capybara-3.40.0/lib/capybara/spec/session/response_code_spec.rb +8 -0
  205. data/capybara-3.40.0/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
  206. data/capybara-3.40.0/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
  207. data/capybara-3.40.0/lib/capybara/spec/session/save_page_spec.rb +110 -0
  208. data/capybara-3.40.0/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
  209. data/capybara-3.40.0/lib/capybara/spec/session/screenshot_spec.rb +18 -0
  210. data/capybara-3.40.0/lib/capybara/spec/session/scroll_spec.rb +119 -0
  211. data/capybara-3.40.0/lib/capybara/spec/session/select_spec.rb +229 -0
  212. data/capybara-3.40.0/lib/capybara/spec/session/selectors_spec.rb +98 -0
  213. data/capybara-3.40.0/lib/capybara/spec/session/sibling_spec.rb +52 -0
  214. data/capybara-3.40.0/lib/capybara/spec/session/text_spec.rb +74 -0
  215. data/capybara-3.40.0/lib/capybara/spec/session/title_spec.rb +29 -0
  216. data/capybara-3.40.0/lib/capybara/spec/session/uncheck_spec.rb +100 -0
  217. data/capybara-3.40.0/lib/capybara/spec/session/unselect_spec.rb +116 -0
  218. data/capybara-3.40.0/lib/capybara/spec/session/visit_spec.rb +224 -0
  219. data/capybara-3.40.0/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
  220. data/capybara-3.40.0/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
  221. data/capybara-3.40.0/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
  222. data/capybara-3.40.0/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
  223. data/capybara-3.40.0/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
  224. data/capybara-3.40.0/lib/capybara/spec/session/window/window_spec.rb +203 -0
  225. data/capybara-3.40.0/lib/capybara/spec/session/window/windows_spec.rb +34 -0
  226. data/capybara-3.40.0/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
  227. data/capybara-3.40.0/lib/capybara/spec/session/within_spec.rb +212 -0
  228. data/capybara-3.40.0/lib/capybara/spec/spec_helper.rb +141 -0
  229. data/capybara-3.40.0/lib/capybara/spec/test_app.rb +305 -0
  230. data/capybara-3.40.0/lib/capybara/spec/views/animated.erb +49 -0
  231. data/capybara-3.40.0/lib/capybara/spec/views/buttons.erb +5 -0
  232. data/capybara-3.40.0/lib/capybara/spec/views/fieldsets.erb +30 -0
  233. data/capybara-3.40.0/lib/capybara/spec/views/form.erb +738 -0
  234. data/capybara-3.40.0/lib/capybara/spec/views/frame_child.erb +18 -0
  235. data/capybara-3.40.0/lib/capybara/spec/views/frame_one.erb +10 -0
  236. data/capybara-3.40.0/lib/capybara/spec/views/frame_parent.erb +9 -0
  237. data/capybara-3.40.0/lib/capybara/spec/views/frame_two.erb +9 -0
  238. data/capybara-3.40.0/lib/capybara/spec/views/header_links.erb +8 -0
  239. data/capybara-3.40.0/lib/capybara/spec/views/host_links.erb +13 -0
  240. data/capybara-3.40.0/lib/capybara/spec/views/initial_alert.erb +11 -0
  241. data/capybara-3.40.0/lib/capybara/spec/views/layout.erb +10 -0
  242. data/capybara-3.40.0/lib/capybara/spec/views/obscured.erb +47 -0
  243. data/capybara-3.40.0/lib/capybara/spec/views/offset.erb +33 -0
  244. data/capybara-3.40.0/lib/capybara/spec/views/path.erb +13 -0
  245. data/capybara-3.40.0/lib/capybara/spec/views/popup_one.erb +9 -0
  246. data/capybara-3.40.0/lib/capybara/spec/views/popup_two.erb +9 -0
  247. data/capybara-3.40.0/lib/capybara/spec/views/postback.erb +14 -0
  248. data/capybara-3.40.0/lib/capybara/spec/views/react.erb +45 -0
  249. data/capybara-3.40.0/lib/capybara/spec/views/scroll.erb +21 -0
  250. data/capybara-3.40.0/lib/capybara/spec/views/spatial.erb +31 -0
  251. data/capybara-3.40.0/lib/capybara/spec/views/tables.erb +130 -0
  252. data/capybara-3.40.0/lib/capybara/spec/views/with_animation.erb +81 -0
  253. data/capybara-3.40.0/lib/capybara/spec/views/with_base_tag.erb +11 -0
  254. data/capybara-3.40.0/lib/capybara/spec/views/with_count.erb +8 -0
  255. data/capybara-3.40.0/lib/capybara/spec/views/with_dragula.erb +24 -0
  256. data/capybara-3.40.0/lib/capybara/spec/views/with_fixed_header_footer.erb +18 -0
  257. data/capybara-3.40.0/lib/capybara/spec/views/with_hover.erb +24 -0
  258. data/capybara-3.40.0/lib/capybara/spec/views/with_hover1.erb +10 -0
  259. data/capybara-3.40.0/lib/capybara/spec/views/with_html.erb +210 -0
  260. data/capybara-3.40.0/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  261. data/capybara-3.40.0/lib/capybara/spec/views/with_html_entities.erb +2 -0
  262. data/capybara-3.40.0/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  263. data/capybara-3.40.0/lib/capybara/spec/views/with_js.erb +162 -0
  264. data/capybara-3.40.0/lib/capybara/spec/views/with_jstree.erb +26 -0
  265. data/capybara-3.40.0/lib/capybara/spec/views/with_namespace.erb +21 -0
  266. data/capybara-3.40.0/lib/capybara/spec/views/with_scope.erb +42 -0
  267. data/capybara-3.40.0/lib/capybara/spec/views/with_scope_other.erb +6 -0
  268. data/capybara-3.40.0/lib/capybara/spec/views/with_shadow.erb +31 -0
  269. data/capybara-3.40.0/lib/capybara/spec/views/with_simple_html.erb +2 -0
  270. data/capybara-3.40.0/lib/capybara/spec/views/with_slow_unload.erb +18 -0
  271. data/capybara-3.40.0/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  272. data/capybara-3.40.0/lib/capybara/spec/views/with_unload_alert.erb +15 -0
  273. data/capybara-3.40.0/lib/capybara/spec/views/with_windows.erb +54 -0
  274. data/capybara-3.40.0/lib/capybara/spec/views/within_frames.erb +15 -0
  275. data/capybara-3.40.0/lib/capybara/version.rb +5 -0
  276. data/capybara-3.40.0/lib/capybara/window.rb +142 -0
  277. data/capybara-3.40.0/lib/capybara.rb +521 -0
  278. data/capybara-3.40.0/spec/basic_node_spec.rb +168 -0
  279. data/capybara-3.40.0/spec/capybara_spec.rb +124 -0
  280. data/capybara-3.40.0/spec/counter_spec.rb +35 -0
  281. data/capybara-3.40.0/spec/css_builder_spec.rb +101 -0
  282. data/capybara-3.40.0/spec/css_splitter_spec.rb +38 -0
  283. data/capybara-3.40.0/spec/dsl_spec.rb +291 -0
  284. data/capybara-3.40.0/spec/filter_set_spec.rb +46 -0
  285. data/capybara-3.40.0/spec/fixtures/capybara.csv +1 -0
  286. data/capybara-3.40.0/spec/fixtures/certificate.pem +25 -0
  287. data/capybara-3.40.0/spec/fixtures/key.pem +27 -0
  288. data/capybara-3.40.0/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
  289. data/capybara-3.40.0/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
  290. data/capybara-3.40.0/spec/minitest_spec.rb +175 -0
  291. data/capybara-3.40.0/spec/minitest_spec_spec.rb +166 -0
  292. data/capybara-3.40.0/spec/per_session_config_spec.rb +68 -0
  293. data/capybara-3.40.0/spec/rack_test_spec.rb +297 -0
  294. data/capybara-3.40.0/spec/regexp_dissassembler_spec.rb +250 -0
  295. data/capybara-3.40.0/spec/result_spec.rb +202 -0
  296. data/capybara-3.40.0/spec/rspec/features_spec.rb +101 -0
  297. data/capybara-3.40.0/spec/rspec/scenarios_spec.rb +23 -0
  298. data/capybara-3.40.0/spec/rspec/shared_spec_matchers.rb +983 -0
  299. data/capybara-3.40.0/spec/rspec/views_spec.rb +14 -0
  300. data/capybara-3.40.0/spec/rspec_matchers_spec.rb +87 -0
  301. data/capybara-3.40.0/spec/rspec_spec.rb +149 -0
  302. data/capybara-3.40.0/spec/sauce_spec_chrome.rb +43 -0
  303. data/capybara-3.40.0/spec/selector_spec.rb +528 -0
  304. data/capybara-3.40.0/spec/selenium_spec_chrome.rb +209 -0
  305. data/capybara-3.40.0/spec/selenium_spec_chrome_remote.rb +96 -0
  306. data/capybara-3.40.0/spec/selenium_spec_edge.rb +60 -0
  307. data/capybara-3.40.0/spec/selenium_spec_firefox.rb +228 -0
  308. data/capybara-3.40.0/spec/selenium_spec_firefox_remote.rb +94 -0
  309. data/capybara-3.40.0/spec/selenium_spec_ie.rb +149 -0
  310. data/capybara-3.40.0/spec/selenium_spec_safari.rb +162 -0
  311. data/capybara-3.40.0/spec/server_spec.rb +315 -0
  312. data/capybara-3.40.0/spec/session_spec.rb +91 -0
  313. data/capybara-3.40.0/spec/shared_selenium_node.rb +79 -0
  314. data/capybara-3.40.0/spec/shared_selenium_session.rb +566 -0
  315. data/capybara-3.40.0/spec/spec_helper.rb +133 -0
  316. data/capybara-3.40.0/spec/whitespace_normalizer_spec.rb +54 -0
  317. data/capybara-3.40.0/spec/xpath_builder_spec.rb +93 -0
  318. data/mega-max-rb.gemspec +12 -0
  319. metadata +358 -0
@@ -0,0 +1,420 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capybara
4
+ module Node
5
+ module Actions
6
+ # @!macro waiting_behavior
7
+ # If the driver is capable of executing JavaScript, this method will wait for a set amount of time
8
+ # and continuously retry finding the element until either the element is found or the time
9
+ # expires. The length of time this method will wait is controlled through {Capybara.configure default_max_wait_time}.
10
+ #
11
+ # @option options [false, true, Numeric] wait
12
+ # Maximum time to wait for matching element to appear. Defaults to {Capybara.configure default_max_wait_time}.
13
+
14
+ ##
15
+ #
16
+ # Finds a button or link and clicks it. See {#click_button} and
17
+ # {#click_link} for what locator will match against for each type of element.
18
+ #
19
+ # @overload click_link_or_button([locator], **options)
20
+ # @macro waiting_behavior
21
+ # @param [String] locator See {#click_button} and {#click_link}
22
+ #
23
+ # @return [Capybara::Node::Element] The element clicked
24
+ #
25
+ def click_link_or_button(locator = nil, **options)
26
+ find(:link_or_button, locator, **options).click
27
+ end
28
+ alias_method :click_on, :click_link_or_button
29
+
30
+ ##
31
+ #
32
+ # Finds a link by id, {Capybara.configure test_id} attribute, text or title and clicks it. Also looks at image
33
+ # alt text inside the link.
34
+ #
35
+ # @overload click_link([locator], **options)
36
+ # @macro waiting_behavior
37
+ # @param [String] locator text, id, {Capybara.configure test_id} attribute, title or nested image's alt attribute
38
+ # @param [Hash] options See {Capybara::Node::Finders#find_link}
39
+ #
40
+ # @return [Capybara::Node::Element] The element clicked
41
+ def click_link(locator = nil, **options)
42
+ find(:link, locator, **options).click
43
+ end
44
+
45
+ ##
46
+ #
47
+ # Finds a button on the page and clicks it.
48
+ # This can be any `<input>` element of type submit, reset, image, button or it can be a
49
+ # `<button>` element. All buttons can be found by their id, name, {Capybara.configure test_id} attribute, value, or title. `<button>` elements can also be found
50
+ # by their text content, and image `<input>` elements by their alt attribute.
51
+ #
52
+ # @overload click_button([locator], **options)
53
+ # @macro waiting_behavior
54
+ # @param [String] locator Which button to find
55
+ # @param [Hash] options See {Capybara::Node::Finders#find_button}
56
+ # @return [Capybara::Node::Element] The element clicked
57
+ def click_button(locator = nil, **options)
58
+ find(:button, locator, **options).click
59
+ end
60
+
61
+ ##
62
+ #
63
+ # Locate a text field or text area and fill it in with the given text.
64
+ # The field can be found via its name, id, {Capybara.configure test_id} attribute, placeholder, or label text.
65
+ # If no locator is provided this will operate on self or a descendant.
66
+ #
67
+ # # will fill in a descendant fillable field with name, id, or label text matching 'Name'
68
+ # page.fill_in 'Name', with: 'Bob'
69
+ #
70
+ # # will fill in `el` if it's a fillable field
71
+ # el.fill_in with: 'Tom'
72
+ #
73
+ #
74
+ # @overload fill_in([locator], with:, **options)
75
+ # @param [String] locator Which field to fill in
76
+ # @param [Hash] options
77
+ # @param with: [String] The value to fill in
78
+ # @macro waiting_behavior
79
+ # @option options [String] currently_with The current value property of the field to fill in
80
+ # @option options [Boolean] multiple Match fields that can have multiple values?
81
+ # @option options [String, Regexp] id Match fields that match the id attribute
82
+ # @option options [String] name Match fields that match the name attribute
83
+ # @option options [String] placeholder Match fields that match the placeholder attribute
84
+ # @option options [String, Array<String>, Regexp] class Match fields that match the class(es) provided
85
+ # @option options [Hash] fill_options Driver specific options regarding how to fill fields (Defaults come from {Capybara.configure default_set_options})
86
+ #
87
+ # @return [Capybara::Node::Element] The element filled in
88
+ def fill_in(locator = nil, with:, currently_with: nil, fill_options: {}, **find_options)
89
+ find_options[:with] = currently_with if currently_with
90
+ find_options[:allow_self] = true if locator.nil?
91
+ find(:fillable_field, locator, **find_options).set(with, **fill_options)
92
+ end
93
+
94
+ # @!macro label_click
95
+ # @option options [Boolean, Hash] allow_label_click
96
+ # Attempt to click the label to toggle state if element is non-visible. Defaults to {Capybara.configure automatic_label_click}.
97
+ # If set to a Hash it is passed as options to the `click` on the label
98
+
99
+ ##
100
+ #
101
+ # Find a descendant radio button and mark it as checked. The radio button can be found
102
+ # via name, id, {Capybara.configure test_id} attribute or label text. If no locator is
103
+ # provided this will match against self or a descendant.
104
+ #
105
+ # # will choose a descendant radio button with a name, id, or label text matching 'Male'
106
+ # page.choose('Male')
107
+ #
108
+ # # will choose `el` if it's a radio button element
109
+ # el.choose()
110
+ #
111
+ # @overload choose([locator], **options)
112
+ # @param [String] locator Which radio button to choose
113
+ #
114
+ # @option options [String] option Value of the radio_button to choose
115
+ # @option options [String, Regexp] id Match fields that match the id attribute
116
+ # @option options [String] name Match fields that match the name attribute
117
+ # @option options [String, Array<String>, Regexp] class Match fields that match the class(es) provided
118
+ # @macro waiting_behavior
119
+ # @macro label_click
120
+ #
121
+ # @return [Capybara::Node::Element] The element chosen or the label clicked
122
+ def choose(locator = nil, **options)
123
+ _check_with_label(:radio_button, true, locator, **options)
124
+ end
125
+
126
+ ##
127
+ #
128
+ # Find a descendant check box and mark it as checked. The check box can be found
129
+ # via name, id, {Capybara.configure test_id} attribute, or label text. If no locator
130
+ # is provided this will match against self or a descendant.
131
+ #
132
+ # # will check a descendant checkbox with a name, id, or label text matching 'German'
133
+ # page.check('German')
134
+ #
135
+ # # will check `el` if it's a checkbox element
136
+ # el.check()
137
+ #
138
+ #
139
+ # @overload check([locator], **options)
140
+ # @param [String] locator Which check box to check
141
+ #
142
+ # @option options [String] option Value of the checkbox to select
143
+ # @option options [String, Regexp] id Match fields that match the id attribute
144
+ # @option options [String] name Match fields that match the name attribute
145
+ # @option options [String, Array<String>, Regexp] class Match fields that match the class(es) provided
146
+ # @macro label_click
147
+ # @macro waiting_behavior
148
+ #
149
+ # @return [Capybara::Node::Element] The element checked or the label clicked
150
+ def check(locator = nil, **options)
151
+ _check_with_label(:checkbox, true, locator, **options)
152
+ end
153
+
154
+ ##
155
+ #
156
+ # Find a descendant check box and uncheck it. The check box can be found
157
+ # via name, id, {Capybara.configure test_id} attribute, or label text. If
158
+ # no locator is provided this will match against self or a descendant.
159
+ #
160
+ # # will uncheck a descendant checkbox with a name, id, or label text matching 'German'
161
+ # page.uncheck('German')
162
+ #
163
+ # # will uncheck `el` if it's a checkbox element
164
+ # el.uncheck()
165
+ #
166
+ #
167
+ # @overload uncheck([locator], **options)
168
+ # @param [String] locator Which check box to uncheck
169
+ #
170
+ # @option options [String] option Value of the checkbox to deselect
171
+ # @option options [String, Regexp] id Match fields that match the id attribute
172
+ # @option options [String] name Match fields that match the name attribute
173
+ # @option options [String, Array<String>, Regexp] class Match fields that match the class(es) provided
174
+ # @macro label_click
175
+ # @macro waiting_behavior
176
+ #
177
+ # @return [Capybara::Node::Element] The element unchecked or the label clicked
178
+ def uncheck(locator = nil, **options)
179
+ _check_with_label(:checkbox, false, locator, **options)
180
+ end
181
+
182
+ ##
183
+ #
184
+ # If `from` option is present, {#select} finds a select box, or text input with associated datalist,
185
+ # on the page and selects a particular option from it.
186
+ # Otherwise it finds an option inside current scope and selects it.
187
+ # If the select box is a multiple select, {#select} can be called multiple times to select more than
188
+ # one option.
189
+ # The select box can be found via its name, id, {Capybara.configure test_id} attribute, or label text.
190
+ # The option can be found by its text.
191
+ #
192
+ # page.select 'March', from: 'Month'
193
+ #
194
+ # @overload select(value = nil, from: nil, **options)
195
+ # @macro waiting_behavior
196
+ #
197
+ # @param value [String] Which option to select
198
+ # @param from [String] The id, {Capybara.configure test_id} attribute, name or label of the select box
199
+ #
200
+ # @return [Capybara::Node::Element] The option element selected
201
+ def select(value = nil, from: nil, **options)
202
+ raise ArgumentError, 'The :from option does not take an element' if from.is_a? Capybara::Node::Element
203
+
204
+ el = from ? find_select_or_datalist_input(from, options) : self
205
+
206
+ if el.respond_to?(:tag_name) && (el.tag_name == 'input')
207
+ select_datalist_option(el, value)
208
+ else
209
+ el.find(:option, value, **options).select_option
210
+ end
211
+ end
212
+
213
+ ##
214
+ #
215
+ # Find a select box on the page and unselect a particular option from it. If the select
216
+ # box is a multiple select, {#unselect} can be called multiple times to unselect more than
217
+ # one option. The select box can be found via its name, id, {Capybara.configure test_id} attribute,
218
+ # or label text.
219
+ #
220
+ # page.unselect 'March', from: 'Month'
221
+ #
222
+ # @overload unselect(value = nil, from: nil, **options)
223
+ # @macro waiting_behavior
224
+ #
225
+ # @param value [String] Which option to unselect
226
+ # @param from [String] The id, {Capybara.configure test_id} attribute, name or label of the select box
227
+ #
228
+ #
229
+ # @return [Capybara::Node::Element] The option element unselected
230
+ def unselect(value = nil, from: nil, **options)
231
+ raise ArgumentError, 'The :from option does not take an element' if from.is_a? Capybara::Node::Element
232
+
233
+ scope = from ? find(:select, from, **options) : self
234
+ scope.find(:option, value, **options).unselect_option
235
+ end
236
+
237
+ ##
238
+ #
239
+ # Find a descendant file field on the page and attach a file given its path. There are two ways to use
240
+ # {#attach_file}, in the first method the file field can be found via its name, id,
241
+ # {Capybara.configure test_id} attribute, or label text. In the case of the file field being hidden for
242
+ # styling reasons the `make_visible` option can be used to temporarily change the CSS of
243
+ # the file field, attach the file, and then revert the CSS back to original. If no locator is
244
+ # passed this will match self or a descendant.
245
+ # The second method, which is currently in beta and may be changed/removed, involves passing a block
246
+ # which performs whatever actions would trigger the file chooser to appear.
247
+ #
248
+ # # will attach file to a descendant file input element that has a name, id, or label_text matching 'My File'
249
+ # page.attach_file('My File', '/path/to/file.png')
250
+ #
251
+ # # will attach file to el if it's a file input element
252
+ # el.attach_file('/path/to/file.png')
253
+ #
254
+ # # will attach file to whatever file input is triggered by the block
255
+ # page.attach_file('/path/to/file.png') do
256
+ # page.find('#upload_button').click
257
+ # end
258
+ #
259
+ # @overload attach_file([locator], paths, **options)
260
+ # @macro waiting_behavior
261
+ #
262
+ # @param [String] locator Which field to attach the file to
263
+ # @param [String, Array<String>] paths The path(s) of the file(s) that will be attached
264
+ #
265
+ # @option options [Symbol] match
266
+ # The matching strategy to use (:one, :first, :prefer_exact, :smart). Defaults to {Capybara.configure match}.
267
+ # @option options [Boolean] exact
268
+ # Match the exact label name/contents or accept a partial match. Defaults to {Capybara.configure exact}.
269
+ # @option options [Boolean] multiple Match field which allows multiple file selection
270
+ # @option options [String, Regexp] id Match fields that match the id attribute
271
+ # @option options [String] name Match fields that match the name attribute
272
+ # @option options [String, Array<String>, Regexp] class Match fields that match the class(es) provided
273
+ # @option options [true, Hash] make_visible
274
+ # A Hash of CSS styles to change before attempting to attach the file, if `true`, `{ opacity: 1, display: 'block', visibility: 'visible' }` is used (may not be supported by all drivers).
275
+ # @overload attach_file(paths, &blk)
276
+ # @param [String, Array<String>] paths The path(s) of the file(s) that will be attached
277
+ # @yield Block whose actions will trigger the system file chooser to be shown
278
+ # @return [Capybara::Node::Element] The file field element
279
+ def attach_file(locator = nil, paths, make_visible: nil, **options) # rubocop:disable Style/OptionalArguments
280
+ if locator && block_given?
281
+ raise ArgumentError, '`#attach_file` does not support passing both a locator and a block'
282
+ end
283
+
284
+ Array(paths).each do |path|
285
+ raise Capybara::FileNotFound, "cannot attach file, #{path} does not exist" unless File.exist?(path.to_s)
286
+ end
287
+ options[:allow_self] = true if locator.nil?
288
+
289
+ if block_given?
290
+ begin
291
+ execute_script CAPTURE_FILE_ELEMENT_SCRIPT
292
+ yield
293
+ file_field = evaluate_script 'window._capybara_clicked_file_input'
294
+ raise ArgumentError, "Capybara was unable to determine the file input you're attaching to" unless file_field
295
+ rescue ::Capybara::NotSupportedByDriverError
296
+ warn 'Block mode of `#attach_file` is not supported by the current driver - ignoring.'
297
+ end
298
+ end
299
+ # Allow user to update the CSS style of the file input since they are so often hidden on a page
300
+ if make_visible
301
+ ff = file_field || find(:file_field, locator, **options.merge(visible: :all))
302
+ while_visible(ff, make_visible) { |el| el.set(paths) }
303
+ else
304
+ (file_field || find(:file_field, locator, **options)).set(paths)
305
+ end
306
+ end
307
+
308
+ private
309
+
310
+ def find_select_or_datalist_input(from, options)
311
+ synchronize(Capybara::Queries::BaseQuery.wait(options, session_options.default_max_wait_time)) do
312
+ find(:select, from, **options)
313
+ rescue Capybara::ElementNotFound => select_error # rubocop:disable Naming/RescuedExceptionsVariableName
314
+ raise if %i[selected with_selected multiple].any? { |option| options.key?(option) }
315
+
316
+ begin
317
+ find(:datalist_input, from, **options)
318
+ rescue Capybara::ElementNotFound => dlinput_error
319
+ raise Capybara::ElementNotFound, "#{select_error.message} and #{dlinput_error.message}"
320
+ end
321
+ end
322
+ end
323
+
324
+ def select_datalist_option(input, value)
325
+ datalist_options = input.evaluate_script(DATALIST_OPTIONS_SCRIPT)
326
+ option = datalist_options.find { |opt| opt.values_at('value', 'label').include?(value) }
327
+ raise ::Capybara::ElementNotFound, %(Unable to find datalist option "#{value}") unless option
328
+
329
+ input.set(option['value'])
330
+ rescue ::Capybara::NotSupportedByDriverError
331
+ # Implement for drivers that don't support JS
332
+ datalist = find(:xpath, XPath.descendant(:datalist)[XPath.attr(:id) == input[:list]], visible: false)
333
+ option = datalist.find(:datalist_option, value, disabled: false)
334
+ input.set(option.value)
335
+ end
336
+
337
+ def while_visible(element, visible_css)
338
+ if visible_css == true
339
+ visible_css = { opacity: 1, display: 'block', visibility: 'visible', width: 'auto', height: 'auto' }
340
+ end
341
+ _update_style(element, visible_css)
342
+ unless element.visible?
343
+ raise ExpectationNotMet, 'The style changes in :make_visible did not make the file input visible'
344
+ end
345
+
346
+ begin
347
+ yield element
348
+ ensure
349
+ _reset_style(element)
350
+ end
351
+ end
352
+
353
+ def _update_style(element, style)
354
+ element.execute_script(UPDATE_STYLE_SCRIPT, style)
355
+ rescue Capybara::NotSupportedByDriverError
356
+ warn 'The :make_visible option is not supported by the current driver - ignoring'
357
+ end
358
+
359
+ def _reset_style(element)
360
+ element.execute_script(RESET_STYLE_SCRIPT)
361
+ rescue StandardError # rubocop:disable Lint/SuppressedException swallow extra errors
362
+ end
363
+
364
+ def _check_with_label(selector, checked, locator,
365
+ allow_label_click: session_options.automatic_label_click, **options)
366
+ options[:allow_self] = true if locator.nil?
367
+ synchronize(Capybara::Queries::BaseQuery.wait(options, session_options.default_max_wait_time)) do
368
+ el = find(selector, locator, **options)
369
+ el.set(checked)
370
+ rescue StandardError => e
371
+ raise unless allow_label_click && catch_error?(e)
372
+
373
+ begin
374
+ el ||= find(selector, locator, **options.merge(visible: :all))
375
+ unless el.checked? == checked
376
+ el.session
377
+ .find(:label, for: el, visible: true, match: :first)
378
+ .click(**(Hash.try_convert(allow_label_click) || {}))
379
+ end
380
+ rescue StandardError # swallow extra errors - raise original
381
+ raise e
382
+ end
383
+ end
384
+ end
385
+
386
+ UPDATE_STYLE_SCRIPT = <<~JS
387
+ this.capybara_style_cache = this.style.cssText;
388
+ var css = arguments[0];
389
+ for (var prop in css){
390
+ if (css.hasOwnProperty(prop)) {
391
+ this.style.setProperty(prop, css[prop], "important");
392
+ }
393
+ }
394
+ JS
395
+
396
+ RESET_STYLE_SCRIPT = <<~JS
397
+ if (this.hasOwnProperty('capybara_style_cache')) {
398
+ this.style.cssText = this.capybara_style_cache;
399
+ delete this.capybara_style_cache;
400
+ }
401
+ JS
402
+
403
+ DATALIST_OPTIONS_SCRIPT = <<~JS
404
+ Array.prototype.slice.call((this.list||{}).options || []).
405
+ filter(function(el){ return !el.disabled }).
406
+ map(function(el){ return { "value": el.value, "label": el.label} })
407
+ JS
408
+
409
+ CAPTURE_FILE_ELEMENT_SCRIPT = <<~JS
410
+ document.addEventListener('click', function file_catcher(e){
411
+ if (e.target.matches("input[type='file']")) {
412
+ window._capybara_clicked_file_input = e.target;
413
+ this.removeEventListener('click', file_catcher);
414
+ e.preventDefault();
415
+ }
416
+ }, {capture: true})
417
+ JS
418
+ end
419
+ end
420
+ end
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capybara
4
+ module Node
5
+ ##
6
+ #
7
+ # A {Capybara::Node::Base} represents either an element on a page through the subclass
8
+ # {Capybara::Node::Element} or a document through {Capybara::Node::Document}.
9
+ #
10
+ # Both types of Node share the same methods, used for interacting with the
11
+ # elements on the page. These methods are divided into three categories,
12
+ # finders, actions and matchers. These are found in the modules
13
+ # {Capybara::Node::Finders}, {Capybara::Node::Actions} and {Capybara::Node::Matchers}
14
+ # respectively.
15
+ #
16
+ # A {Capybara::Session} exposes all methods from {Capybara::Node::Document} directly:
17
+ #
18
+ # session = Capybara::Session.new(:rack_test, my_app)
19
+ # session.visit('/')
20
+ # session.fill_in('Foo', with: 'Bar') # from Capybara::Node::Actions
21
+ # bar = session.find('#bar') # from Capybara::Node::Finders
22
+ # bar.select('Baz', from: 'Quox') # from Capybara::Node::Actions
23
+ # session.has_css?('#foobar') # from Capybara::Node::Matchers
24
+ #
25
+ class Base
26
+ attr_reader :session, :base, :query_scope
27
+
28
+ include Capybara::Node::Finders
29
+ include Capybara::Node::Actions
30
+ include Capybara::Node::Matchers
31
+
32
+ def initialize(session, base)
33
+ @session = session
34
+ @base = base
35
+ end
36
+
37
+ # overridden in subclasses, e.g. Capybara::Node::Element
38
+ def reload
39
+ self
40
+ end
41
+
42
+ ##
43
+ #
44
+ # This method is Capybara's primary defence against asynchronicity
45
+ # problems. It works by attempting to run a given block of code until it
46
+ # succeeds. The exact behaviour of this method depends on a number of
47
+ # factors. Basically there are certain exceptions which, when raised
48
+ # from the block, instead of bubbling up, are caught, and the block is
49
+ # re-run.
50
+ #
51
+ # Certain drivers, such as RackTest, have no support for asynchronous
52
+ # processes, these drivers run the block, and any error raised bubbles up
53
+ # immediately. This allows faster turn around in the case where an
54
+ # expectation fails.
55
+ #
56
+ # Only exceptions that are {Capybara::ElementNotFound} or any subclass
57
+ # thereof cause the block to be rerun. Drivers may specify additional
58
+ # exceptions which also cause reruns. This usually occurs when a node is
59
+ # manipulated which no longer exists on the page. For example, the
60
+ # Selenium driver specifies
61
+ # `Selenium::WebDriver::Error::ObsoleteElementError`.
62
+ #
63
+ # As long as any of these exceptions are thrown, the block is re-run,
64
+ # until a certain amount of time passes. The amount of time defaults to
65
+ # {Capybara.default_max_wait_time} and can be overridden through the `seconds`
66
+ # argument. This time is compared with the system time to see how much
67
+ # time has passed. On rubies/platforms which don't support access to a monotonic process clock
68
+ # if the return value of `Time.now` is stubbed out, Capybara will raise `Capybara::FrozenInTime`.
69
+ #
70
+ # @param [Integer] seconds (current sessions default_max_wait_time) Maximum number of seconds to retry this block
71
+ # @param [Array<Exception>] errors (driver.invalid_element_errors +
72
+ # [Capybara::ElementNotFound]) exception types that cause the block to be rerun
73
+ # @return [Object] The result of the given block
74
+ # @raise [Capybara::FrozenInTime] If the return value of `Time.now` appears stuck
75
+ #
76
+ def synchronize(seconds = nil, errors: nil)
77
+ return yield if session.synchronized
78
+
79
+ seconds = session_options.default_max_wait_time if [nil, true].include? seconds
80
+ interval = session_options.default_retry_interval
81
+ session.synchronized = true
82
+ timer = Capybara::Helpers.timer(expire_in: seconds)
83
+ begin
84
+ yield
85
+ rescue StandardError => e
86
+ session.raise_server_error!
87
+ raise e unless catch_error?(e, errors)
88
+
89
+ if driver.wait?
90
+ raise e if timer.expired?
91
+
92
+ sleep interval
93
+ reload if session_options.automatic_reload
94
+ else
95
+ old_base = @base
96
+ reload if session_options.automatic_reload
97
+ raise e if old_base == @base
98
+ end
99
+ retry
100
+ ensure
101
+ session.synchronized = false
102
+ end
103
+ end
104
+
105
+ # @api private
106
+ def find_css(css, **options)
107
+ if base.method(:find_css).arity == 1
108
+ base.find_css(css)
109
+ else
110
+ base.find_css(css, **options)
111
+ end
112
+ end
113
+
114
+ # @api private
115
+ def find_xpath(xpath, **options)
116
+ if base.method(:find_xpath).arity == 1
117
+ base.find_xpath(xpath)
118
+ else
119
+ base.find_xpath(xpath, **options)
120
+ end
121
+ end
122
+
123
+ # @api private
124
+ def session_options
125
+ session.config
126
+ end
127
+
128
+ def to_capybara_node
129
+ self
130
+ end
131
+
132
+ protected
133
+
134
+ def catch_error?(error, errors = nil)
135
+ errors ||= (driver.invalid_element_errors + [Capybara::ElementNotFound])
136
+ errors.any? { |type| error.is_a?(type) }
137
+ end
138
+
139
+ def driver
140
+ session.driver
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capybara
4
+ module Node
5
+ ##
6
+ #
7
+ # A {Capybara::Document} represents an HTML document. Any operation
8
+ # performed on it will be performed on the entire document.
9
+ #
10
+ # @see Capybara::Node
11
+ #
12
+ class Document < Base
13
+ include Capybara::Node::DocumentMatchers
14
+
15
+ def inspect
16
+ %(#<Capybara::Document>)
17
+ end
18
+
19
+ ##
20
+ #
21
+ # @return [String] The text of the document
22
+ #
23
+ def text(type = nil, normalize_ws: false)
24
+ find(:xpath, '/html').text(type, normalize_ws: normalize_ws)
25
+ end
26
+
27
+ ##
28
+ #
29
+ # @return [String] The title of the document
30
+ #
31
+ def title
32
+ session.driver.title
33
+ end
34
+
35
+ def execute_script(*args)
36
+ find(:xpath, '/html').execute_script(*args)
37
+ end
38
+
39
+ def evaluate_script(*args)
40
+ find(:xpath, '/html').evaluate_script(*args)
41
+ end
42
+
43
+ def scroll_to(*args, quirks: false, **options)
44
+ find(:xpath, quirks ? '//body' : '/html').scroll_to(*args, **options)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capybara
4
+ module Node
5
+ module DocumentMatchers
6
+ ##
7
+ # Asserts that the page has the given title.
8
+ #
9
+ # @!macro title_query_params
10
+ # @overload $0(string, **options)
11
+ # @param string [String] The string that title should include
12
+ # @overload $0(regexp, **options)
13
+ # @param regexp [Regexp] The regexp that title should match to
14
+ # @option options [Numeric] :wait (Capybara.default_max_wait_time) Maximum time that Capybara will wait for title to eq/match given string/regexp argument
15
+ # @option options [Boolean] :exact (false) When passed a string should the match be exact or just substring
16
+ # @raise [Capybara::ExpectationNotMet] if the assertion hasn't succeeded during wait time
17
+ # @return [true]
18
+ #
19
+ def assert_title(title, **options)
20
+ _verify_title(title, options) do |query|
21
+ raise Capybara::ExpectationNotMet, query.failure_message unless query.resolves_for?(self)
22
+ end
23
+ end
24
+
25
+ ##
26
+ # Asserts that the page doesn't have the given title.
27
+ #
28
+ # @macro title_query_params
29
+ # @raise [Capybara::ExpectationNotMet] if the assertion hasn't succeeded during wait time
30
+ # @return [true]
31
+ #
32
+ def assert_no_title(title, **options)
33
+ _verify_title(title, options) do |query|
34
+ raise Capybara::ExpectationNotMet, query.negative_failure_message if query.resolves_for?(self)
35
+ end
36
+ end
37
+
38
+ ##
39
+ # Checks if the page has the given title.
40
+ #
41
+ # @macro title_query_params
42
+ # @return [Boolean]
43
+ #
44
+ def has_title?(title, **options)
45
+ make_predicate(options) { assert_title(title, **options) }
46
+ end
47
+
48
+ ##
49
+ # Checks if the page doesn't have the given title.
50
+ #
51
+ # @macro title_query_params
52
+ # @return [Boolean]
53
+ #
54
+ def has_no_title?(title, **options)
55
+ make_predicate(options) { assert_no_title(title, **options) }
56
+ end
57
+
58
+ private
59
+
60
+ def _verify_title(title, options)
61
+ query = Capybara::Queries::TitleQuery.new(title, **options)
62
+ synchronize(query.wait) { yield(query) }
63
+ true
64
+ end
65
+ end
66
+ end
67
+ end