watir 1.4.1 → 7.3.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 (422) hide show
  1. checksums.yaml +7 -0
  2. data/.document +4 -0
  3. data/.github/ISSUE_TEMPLATE.md +16 -0
  4. data/.github/workflows/chrome.yml +55 -0
  5. data/.github/workflows/edge.yml +44 -0
  6. data/.github/workflows/firefox.yml +55 -0
  7. data/.github/workflows/ie.yml +30 -0
  8. data/.github/workflows/safari.yml +38 -0
  9. data/.github/workflows/unit.yml +60 -0
  10. data/.gitignore +21 -0
  11. data/.rubocop.yml +114 -0
  12. data/.rubocop_todo.yml +17 -0
  13. data/CHANGES.md +2212 -0
  14. data/Gemfile +15 -0
  15. data/LICENSE +24 -0
  16. data/README.md +113 -0
  17. data/Rakefile +173 -0
  18. data/lib/watir/adjacent.rb +128 -0
  19. data/lib/watir/after_hooks.rb +135 -0
  20. data/lib/watir/alert.rb +113 -0
  21. data/lib/watir/aliases.rb +8 -0
  22. data/lib/watir/attribute_helper.rb +97 -0
  23. data/lib/watir/browser.rb +323 -0
  24. data/lib/watir/capabilities.rb +179 -0
  25. data/lib/watir/cell_container.rb +25 -0
  26. data/lib/watir/container.rb +33 -0
  27. data/lib/watir/cookies.rb +130 -0
  28. data/lib/watir/element_collection.rb +223 -0
  29. data/lib/watir/elements/button.rb +28 -0
  30. data/lib/watir/elements/cell.rb +18 -0
  31. data/lib/watir/elements/checkbox.rb +56 -0
  32. data/lib/watir/elements/date_field.rb +42 -0
  33. data/lib/watir/elements/date_time_field.rb +42 -0
  34. data/lib/watir/elements/dlist.rb +12 -0
  35. data/lib/watir/elements/element.rb +807 -0
  36. data/lib/watir/elements/file_field.rb +43 -0
  37. data/lib/watir/elements/font.rb +26 -0
  38. data/lib/watir/elements/form.rb +16 -0
  39. data/lib/watir/elements/hidden.rb +26 -0
  40. data/lib/watir/elements/html_elements.rb +1981 -0
  41. data/lib/watir/elements/iframe.rb +156 -0
  42. data/lib/watir/elements/image.rb +22 -0
  43. data/lib/watir/elements/input.rb +15 -0
  44. data/lib/watir/elements/link.rb +8 -0
  45. data/lib/watir/elements/list.rb +51 -0
  46. data/lib/watir/elements/option.rb +60 -0
  47. data/lib/watir/elements/radio.rb +65 -0
  48. data/lib/watir/elements/row.rb +18 -0
  49. data/lib/watir/elements/select.rb +214 -0
  50. data/lib/watir/elements/svg_elements.rb +497 -0
  51. data/lib/watir/elements/table.rb +77 -0
  52. data/lib/watir/elements/table_cell.rb +32 -0
  53. data/lib/watir/elements/table_row.rb +34 -0
  54. data/lib/watir/elements/table_section.rb +17 -0
  55. data/lib/watir/elements/text_area.rb +7 -0
  56. data/lib/watir/elements/text_field.rb +39 -0
  57. data/lib/watir/exception.rb +16 -0
  58. data/lib/watir/extensions/nokogiri.rb +14 -0
  59. data/lib/watir/generator/base/generator.rb +114 -0
  60. data/lib/watir/generator/base/idl_sorter.rb +51 -0
  61. data/lib/watir/generator/base/spec_extractor.rb +158 -0
  62. data/lib/watir/generator/base/util.rb +21 -0
  63. data/lib/watir/generator/base/visitor.rb +133 -0
  64. data/lib/watir/generator/base.rb +12 -0
  65. data/lib/watir/generator/html/generator.rb +36 -0
  66. data/lib/watir/generator/html/spec_extractor.rb +52 -0
  67. data/lib/watir/generator/html/visitor.rb +23 -0
  68. data/lib/watir/generator/html.rb +17 -0
  69. data/lib/watir/generator/svg/generator.rb +38 -0
  70. data/lib/watir/generator/svg/spec_extractor.rb +55 -0
  71. data/lib/watir/generator/svg/visitor.rb +23 -0
  72. data/lib/watir/generator/svg.rb +9 -0
  73. data/lib/watir/generator.rb +5 -0
  74. data/lib/watir/has_window.rb +72 -0
  75. data/lib/watir/http_client.rb +11 -0
  76. data/lib/watir/js_execution.rb +165 -0
  77. data/lib/watir/js_snippets/attributeValues.js +11 -0
  78. data/lib/watir/js_snippets/backgroundColor.js +7 -0
  79. data/lib/watir/js_snippets/elementObscured.js +14 -0
  80. data/lib/watir/js_snippets/fireEvent.js +31 -0
  81. data/lib/watir/js_snippets/focus.js +3 -0
  82. data/lib/watir/js_snippets/getElementTags.js +3 -0
  83. data/lib/watir/js_snippets/getInnerHtml.js +19 -0
  84. data/lib/watir/js_snippets/getInnerText.js +19 -0
  85. data/lib/watir/js_snippets/getOuterHtml.js +20 -0
  86. data/lib/watir/js_snippets/getTextContent.js +19 -0
  87. data/lib/watir/js_snippets/isElementInViewport.js +20 -0
  88. data/lib/watir/js_snippets/isImageLoaded.js +3 -0
  89. data/lib/watir/js_snippets/selectOptionsLabel.js +10 -0
  90. data/lib/watir/js_snippets/selectOptionsText.js +10 -0
  91. data/lib/watir/js_snippets/selectOptionsValue.js +10 -0
  92. data/lib/watir/js_snippets/selectText.js +64 -0
  93. data/lib/watir/js_snippets/selectedOptions.js +11 -0
  94. data/lib/watir/js_snippets/selectedText.js +17 -0
  95. data/lib/watir/js_snippets/setText.js +3 -0
  96. data/lib/watir/js_snippets/setValue.js +3 -0
  97. data/lib/watir/js_snippets.rb +18 -0
  98. data/lib/watir/locators/anchor/selector_builder.rb +43 -0
  99. data/lib/watir/locators/button/matcher.rb +19 -0
  100. data/lib/watir/locators/button/selector_builder/xpath.rb +69 -0
  101. data/lib/watir/locators/button/selector_builder.rb +10 -0
  102. data/lib/watir/locators/cell/selector_builder/xpath.rb +23 -0
  103. data/lib/watir/locators/cell/selector_builder.rb +13 -0
  104. data/lib/watir/locators/element/locator.rb +81 -0
  105. data/lib/watir/locators/element/matcher.rb +118 -0
  106. data/lib/watir/locators/element/selector_builder/regexp_disassembler.rb +69 -0
  107. data/lib/watir/locators/element/selector_builder/xpath.rb +268 -0
  108. data/lib/watir/locators/element/selector_builder/xpath_support.rb +29 -0
  109. data/lib/watir/locators/element/selector_builder.rb +164 -0
  110. data/lib/watir/locators/option/matcher.rb +26 -0
  111. data/lib/watir/locators/option/selector_builder/xpath.rb +39 -0
  112. data/lib/watir/locators/option/selector_builder.rb +10 -0
  113. data/lib/watir/locators/row/selector_builder/xpath.rb +53 -0
  114. data/lib/watir/locators/row/selector_builder.rb +18 -0
  115. data/lib/watir/locators/text_area/selector_builder/xpath.rb +21 -0
  116. data/lib/watir/locators/text_area/selector_builder.rb +10 -0
  117. data/lib/watir/locators/text_field/matcher.rb +37 -0
  118. data/lib/watir/locators/text_field/selector_builder/xpath.rb +50 -0
  119. data/lib/watir/locators/text_field/selector_builder.rb +10 -0
  120. data/lib/watir/locators.rb +77 -0
  121. data/lib/watir/logger.rb +30 -0
  122. data/lib/watir/navigation.rb +51 -0
  123. data/lib/watir/radio_set.rb +230 -0
  124. data/lib/watir/row_container.rb +36 -0
  125. data/lib/watir/screenshot.rb +51 -0
  126. data/lib/watir/scroll.rb +95 -0
  127. data/lib/watir/search_context.rb +96 -0
  128. data/lib/watir/shadow_root.rb +60 -0
  129. data/lib/watir/user_editable.rb +85 -0
  130. data/lib/watir/version.rb +5 -0
  131. data/lib/watir/wait/timer.rb +52 -0
  132. data/lib/watir/wait.rb +171 -0
  133. data/lib/watir/window.rb +276 -0
  134. data/lib/watir/window_collection.rb +82 -0
  135. data/lib/watir.rb +108 -0
  136. data/lib/watirspec/guards.rb +65 -0
  137. data/lib/watirspec/implementation.rb +56 -0
  138. data/lib/watirspec/rake_tasks.rb +118 -0
  139. data/lib/watirspec/remote_server.rb +39 -0
  140. data/lib/watirspec/runner.rb +64 -0
  141. data/lib/watirspec/server/app.rb +86 -0
  142. data/lib/watirspec/server.rb +104 -0
  143. data/lib/watirspec.rb +93 -0
  144. data/spec/locator_spec_helper.rb +88 -0
  145. data/spec/spec_helper.rb +24 -0
  146. data/spec/unit/capabilities_spec.rb +670 -0
  147. data/spec/unit/element_locator_spec.rb +97 -0
  148. data/spec/unit/match_elements/button_spec.rb +76 -0
  149. data/spec/unit/match_elements/element_spec.rb +424 -0
  150. data/spec/unit/match_elements/text_field_spec.rb +84 -0
  151. data/spec/unit/selector_builder/anchor_spec.rb +59 -0
  152. data/spec/unit/selector_builder/button_spec.rb +217 -0
  153. data/spec/unit/selector_builder/cell_spec.rb +71 -0
  154. data/spec/unit/selector_builder/element_spec.rb +804 -0
  155. data/spec/unit/selector_builder/row_spec.rb +128 -0
  156. data/spec/unit/selector_builder/text_field_spec.rb +203 -0
  157. data/spec/unit/selector_builder/textarea_spec.rb +35 -0
  158. data/spec/unit/unit_helper.rb +4 -0
  159. data/spec/unit/wait_spec.rb +99 -0
  160. data/spec/watirspec/adjacent_spec.rb +256 -0
  161. data/spec/watirspec/after_hooks_spec.rb +204 -0
  162. data/spec/watirspec/alert_spec.rb +89 -0
  163. data/spec/watirspec/browser_spec.rb +536 -0
  164. data/spec/watirspec/capabilities_spec.rb +556 -0
  165. data/spec/watirspec/cookies_spec.rb +196 -0
  166. data/spec/watirspec/drag_and_drop_spec.rb +38 -0
  167. data/spec/watirspec/element_hidden_spec.rb +86 -0
  168. data/spec/watirspec/elements/area_spec.rb +69 -0
  169. data/spec/watirspec/elements/areas_spec.rb +44 -0
  170. data/spec/watirspec/elements/button_spec.rb +265 -0
  171. data/spec/watirspec/elements/buttons_spec.rb +57 -0
  172. data/spec/watirspec/elements/checkbox_spec.rb +290 -0
  173. data/spec/watirspec/elements/checkboxes_spec.rb +46 -0
  174. data/spec/watirspec/elements/collections_spec.rb +132 -0
  175. data/spec/watirspec/elements/date_field_spec.rb +209 -0
  176. data/spec/watirspec/elements/date_fields_spec.rb +46 -0
  177. data/spec/watirspec/elements/date_time_field_spec.rb +223 -0
  178. data/spec/watirspec/elements/date_time_fields_spec.rb +47 -0
  179. data/spec/watirspec/elements/dd_spec.rb +108 -0
  180. data/spec/watirspec/elements/dds_spec.rb +44 -0
  181. data/spec/watirspec/elements/del_spec.rb +113 -0
  182. data/spec/watirspec/elements/dels_spec.rb +42 -0
  183. data/spec/watirspec/elements/div_spec.rb +232 -0
  184. data/spec/watirspec/elements/divs_spec.rb +56 -0
  185. data/spec/watirspec/elements/dl_spec.rb +117 -0
  186. data/spec/watirspec/elements/dls_spec.rb +45 -0
  187. data/spec/watirspec/elements/dt_spec.rb +107 -0
  188. data/spec/watirspec/elements/dts_spec.rb +44 -0
  189. data/spec/watirspec/elements/element_spec.rb +1069 -0
  190. data/spec/watirspec/elements/elements_spec.rb +60 -0
  191. data/spec/watirspec/elements/em_spec.rb +85 -0
  192. data/spec/watirspec/elements/ems_spec.rb +45 -0
  193. data/spec/watirspec/elements/filefield_spec.rb +135 -0
  194. data/spec/watirspec/elements/filefields_spec.rb +45 -0
  195. data/spec/watirspec/elements/font_spec.rb +31 -0
  196. data/spec/watirspec/elements/form_spec.rb +70 -0
  197. data/spec/watirspec/elements/forms_spec.rb +46 -0
  198. data/spec/watirspec/elements/frame_spec.rb +117 -0
  199. data/spec/watirspec/elements/frames_spec.rb +43 -0
  200. data/spec/watirspec/elements/hidden_spec.rb +106 -0
  201. data/spec/watirspec/elements/hiddens_spec.rb +45 -0
  202. data/spec/watirspec/elements/hn_spec.rb +80 -0
  203. data/spec/watirspec/elements/hns_spec.rb +42 -0
  204. data/spec/watirspec/elements/iframe_spec.rb +244 -0
  205. data/spec/watirspec/elements/iframes_spec.rb +49 -0
  206. data/spec/watirspec/elements/image_spec.rb +160 -0
  207. data/spec/watirspec/elements/images_spec.rb +42 -0
  208. data/spec/watirspec/elements/input_spec.rb +17 -0
  209. data/spec/watirspec/elements/ins_spec.rb +113 -0
  210. data/spec/watirspec/elements/inses_spec.rb +42 -0
  211. data/spec/watirspec/elements/label_spec.rb +77 -0
  212. data/spec/watirspec/elements/labels_spec.rb +42 -0
  213. data/spec/watirspec/elements/li_spec.rb +99 -0
  214. data/spec/watirspec/elements/link_spec.rb +180 -0
  215. data/spec/watirspec/elements/links_spec.rb +66 -0
  216. data/spec/watirspec/elements/lis_spec.rb +44 -0
  217. data/spec/watirspec/elements/list_spec.rb +50 -0
  218. data/spec/watirspec/elements/map_spec.rb +78 -0
  219. data/spec/watirspec/elements/maps_spec.rb +43 -0
  220. data/spec/watirspec/elements/meta_spec.rb +27 -0
  221. data/spec/watirspec/elements/metas_spec.rb +42 -0
  222. data/spec/watirspec/elements/ol_spec.rb +63 -0
  223. data/spec/watirspec/elements/ols_spec.rb +42 -0
  224. data/spec/watirspec/elements/option_spec.rb +113 -0
  225. data/spec/watirspec/elements/p_spec.rb +102 -0
  226. data/spec/watirspec/elements/pre_spec.rb +100 -0
  227. data/spec/watirspec/elements/pres_spec.rb +42 -0
  228. data/spec/watirspec/elements/ps_spec.rb +42 -0
  229. data/spec/watirspec/elements/radio_spec.rb +259 -0
  230. data/spec/watirspec/elements/radios_spec.rb +45 -0
  231. data/spec/watirspec/elements/select_list_spec.rb +701 -0
  232. data/spec/watirspec/elements/select_lists_spec.rb +49 -0
  233. data/spec/watirspec/elements/span_spec.rb +119 -0
  234. data/spec/watirspec/elements/spans_spec.rb +42 -0
  235. data/spec/watirspec/elements/strong_spec.rb +78 -0
  236. data/spec/watirspec/elements/strongs_spec.rb +45 -0
  237. data/spec/watirspec/elements/table_spec.rb +210 -0
  238. data/spec/watirspec/elements/tables_spec.rb +44 -0
  239. data/spec/watirspec/elements/tbody_spec.rb +94 -0
  240. data/spec/watirspec/elements/tbodys_spec.rb +64 -0
  241. data/spec/watirspec/elements/td_spec.rb +92 -0
  242. data/spec/watirspec/elements/tds_spec.rb +55 -0
  243. data/spec/watirspec/elements/text_field_spec.rb +223 -0
  244. data/spec/watirspec/elements/text_fields_spec.rb +47 -0
  245. data/spec/watirspec/elements/textarea_spec.rb +30 -0
  246. data/spec/watirspec/elements/textareas_spec.rb +28 -0
  247. data/spec/watirspec/elements/tfoot_spec.rb +89 -0
  248. data/spec/watirspec/elements/tfoots_spec.rb +72 -0
  249. data/spec/watirspec/elements/thead_spec.rb +88 -0
  250. data/spec/watirspec/elements/theads_spec.rb +72 -0
  251. data/spec/watirspec/elements/tr_spec.rb +69 -0
  252. data/spec/watirspec/elements/trs_spec.rb +63 -0
  253. data/spec/watirspec/elements/ul_spec.rb +63 -0
  254. data/spec/watirspec/elements/uls_spec.rb +42 -0
  255. data/spec/watirspec/html/alerts.html +12 -0
  256. data/spec/watirspec/html/aria_attributes.html +9 -0
  257. data/spec/watirspec/html/child_frame.html +29 -0
  258. data/spec/watirspec/html/class_locator.html +11 -0
  259. data/spec/watirspec/html/clicks.html +19 -0
  260. data/spec/watirspec/html/closeable.html +21 -0
  261. data/spec/watirspec/html/collections.html +15 -0
  262. data/spec/watirspec/html/css/jquery-ui-1.8.17.custom.css +287 -0
  263. data/spec/watirspec/html/data_attributes.html +10 -0
  264. data/spec/watirspec/html/definition_lists.html +48 -0
  265. data/spec/watirspec/html/drag_and_drop.html +106 -0
  266. data/spec/watirspec/html/font.html +10 -0
  267. data/spec/watirspec/html/forms_with_input_elements.html +194 -0
  268. data/spec/watirspec/html/frame_1.html +22 -0
  269. data/spec/watirspec/html/frame_2.html +16 -0
  270. data/spec/watirspec/html/frames.html +11 -0
  271. data/spec/watirspec/html/iframe_1.html +22 -0
  272. data/spec/watirspec/html/iframes.html +15 -0
  273. data/spec/watirspec/html/images/button.png +0 -0
  274. data/spec/watirspec/html/images/circle.png +0 -0
  275. data/spec/watirspec/html/images/map.gif +0 -0
  276. data/spec/watirspec/html/images/map2.gif +0 -0
  277. data/spec/watirspec/html/images/originaltriangle.png +0 -0
  278. data/spec/watirspec/html/images/square.png +0 -0
  279. data/spec/watirspec/html/images/triangle.png +0 -0
  280. data/spec/watirspec/html/images.html +28 -0
  281. data/spec/watirspec/html/inner_outer.html +5 -0
  282. data/spec/watirspec/html/javascript/angular.min.js +332 -0
  283. data/spec/watirspec/html/javascript/helpers.js +16 -0
  284. data/spec/watirspec/html/javascript/jquery-1.7.1.min.js +4 -0
  285. data/spec/watirspec/html/javascript/jquery-ui-1.8.17.custom.min.js +68 -0
  286. data/spec/watirspec/html/keylogger.html +15 -0
  287. data/spec/watirspec/html/modal_dialog.html +9 -0
  288. data/spec/watirspec/html/multiple_ids.html +15 -0
  289. data/spec/watirspec/html/nested_elements.html +44 -0
  290. data/spec/watirspec/html/nested_frame_1.html +1 -0
  291. data/spec/watirspec/html/nested_frame_2.html +9 -0
  292. data/spec/watirspec/html/nested_frame_3.html +14 -0
  293. data/spec/watirspec/html/nested_frames.html +10 -0
  294. data/spec/watirspec/html/nested_iframe_2.html +12 -0
  295. data/spec/watirspec/html/nested_iframes.html +13 -0
  296. data/spec/watirspec/html/nested_tables.html +203 -0
  297. data/spec/watirspec/html/non_control_elements.html +145 -0
  298. data/spec/watirspec/html/obscured.html +36 -0
  299. data/spec/watirspec/html/removed_element.html +24 -0
  300. data/spec/watirspec/html/right_click.html +23 -0
  301. data/spec/watirspec/html/scroll.html +15 -0
  302. data/spec/watirspec/html/scroll_nested.html +17 -0
  303. data/spec/watirspec/html/scroll_nested_offscreen.html +18 -0
  304. data/spec/watirspec/html/shadow_dom.html +28 -0
  305. data/spec/watirspec/html/special_chars.html +15 -0
  306. data/spec/watirspec/html/sticky_elements.html +10 -0
  307. data/spec/watirspec/html/tables.html +121 -0
  308. data/spec/watirspec/html/timeout_window_location.html +19 -0
  309. data/spec/watirspec/html/uneven_table.html +20 -0
  310. data/spec/watirspec/html/wait.html +99 -0
  311. data/spec/watirspec/html/watirspec.css +0 -0
  312. data/spec/watirspec/html/window_switching.html +22 -0
  313. data/spec/watirspec/radio_set_spec.rb +346 -0
  314. data/spec/watirspec/screenshot_spec.rb +33 -0
  315. data/spec/watirspec/scroll_spec.rb +208 -0
  316. data/spec/watirspec/shadow_root_spec.rb +108 -0
  317. data/spec/watirspec/support/rspec_matchers.rb +161 -0
  318. data/spec/watirspec/user_editable_spec.rb +207 -0
  319. data/spec/watirspec/wait_spec.rb +345 -0
  320. data/spec/watirspec/window_switching_spec.rb +580 -0
  321. data/spec/watirspec_helper.rb +163 -0
  322. data/support/doctest_helper.rb +101 -0
  323. data/support/version_differ.rb +60 -0
  324. data/watir.gemspec +50 -0
  325. metadata +652 -148
  326. data/readme.rb +0 -211
  327. data/unittests/WindowLogonExample.rb +0 -30
  328. data/unittests/WindowLogonExtra.rb +0 -7
  329. data/unittests/all_tests.rb +0 -10
  330. data/unittests/all_tests_concurrent.rb +0 -57
  331. data/unittests/attachToExistingWindow_test.rb +0 -40
  332. data/unittests/buttons_test.rb +0 -131
  333. data/unittests/checkbox_test.rb +0 -149
  334. data/unittests/core_tests.rb +0 -9
  335. data/unittests/css_test.rb +0 -60
  336. data/unittests/div_test.rb +0 -179
  337. data/unittests/errorchecker_test.rb +0 -29
  338. data/unittests/filefield_test.rb +0 -35
  339. data/unittests/form_test.rb +0 -279
  340. data/unittests/frame_test.rb +0 -141
  341. data/unittests/html/blankpage.html +0 -12
  342. data/unittests/html/buttons1.html +0 -40
  343. data/unittests/html/checkboxes1.html +0 -69
  344. data/unittests/html/complex_table.html +0 -36
  345. data/unittests/html/cssTest.html +0 -42
  346. data/unittests/html/div.html +0 -105
  347. data/unittests/html/fileupload.html +0 -45
  348. data/unittests/html/formTest1.html +0 -39
  349. data/unittests/html/forms2.html +0 -45
  350. data/unittests/html/forms3.html +0 -132
  351. data/unittests/html/forms4.html +0 -27
  352. data/unittests/html/frame_buttons.html +0 -4
  353. data/unittests/html/frame_links.html +0 -4
  354. data/unittests/html/frame_multi.html +0 -5
  355. data/unittests/html/iframeTest.html +0 -13
  356. data/unittests/html/iframeTest1.html +0 -7
  357. data/unittests/html/iframeTest2.html +0 -6
  358. data/unittests/html/images/button.jpg +0 -0
  359. data/unittests/html/images/circle.jpg +0 -0
  360. data/unittests/html/images/originaltriangle.jpg +0 -0
  361. data/unittests/html/images/square.jpg +0 -0
  362. data/unittests/html/images/triangle.jpg +0 -0
  363. data/unittests/html/images1.html +0 -52
  364. data/unittests/html/javascriptevents.html +0 -39
  365. data/unittests/html/link_pass.html +0 -11
  366. data/unittests/html/links1.html +0 -37
  367. data/unittests/html/links2.html +0 -11
  368. data/unittests/html/nestedFrames.html +0 -6
  369. data/unittests/html/pass.html +0 -10
  370. data/unittests/html/popups1.html +0 -60
  371. data/unittests/html/radioButtons1.html +0 -71
  372. data/unittests/html/select_tealeaf.html +0 -54
  373. data/unittests/html/selectboxes1.html +0 -55
  374. data/unittests/html/simple_table.html +0 -26
  375. data/unittests/html/simple_table_buttons.html +0 -104
  376. data/unittests/html/simple_table_columns.html +0 -76
  377. data/unittests/html/table1.html +0 -142
  378. data/unittests/html/textarea.html +0 -30
  379. data/unittests/html/textfields1.html +0 -87
  380. data/unittests/html/textsearch.html +0 -44
  381. data/unittests/ie_mock.rb +0 -93
  382. data/unittests/ie_test.rb +0 -50
  383. data/unittests/images_test.rb +0 -179
  384. data/unittests/iostring.rb +0 -30
  385. data/unittests/iostring_test.rb +0 -48
  386. data/unittests/js_events_test.rb +0 -77
  387. data/unittests/jscriptExtraAlert.rb +0 -6
  388. data/unittests/jscriptExtraConfirmCancel.rb +0 -7
  389. data/unittests/jscriptExtraConfirmOk.rb +0 -7
  390. data/unittests/jscriptPushButton.rb +0 -5
  391. data/unittests/jscript_test.rb +0 -57
  392. data/unittests/links_test.rb +0 -169
  393. data/unittests/minmax_test.rb +0 -31
  394. data/unittests/navigate_test.rb +0 -56
  395. data/unittests/non_core_tests.rb +0 -9
  396. data/unittests/pagecontainstext_test.rb +0 -49
  397. data/unittests/popups_test.rb +0 -44
  398. data/unittests/radios_test.rb +0 -164
  399. data/unittests/screen_capture_test.rb +0 -53
  400. data/unittests/selectbox_test.rb +0 -197
  401. data/unittests/send_keys_test.rb +0 -29
  402. data/unittests/setup.rb +0 -47
  403. data/unittests/table_test.rb +0 -306
  404. data/unittests/textAreafields_test.rb +0 -81
  405. data/unittests/textfields_test.rb +0 -239
  406. data/watir/AutoItX3.dll +0 -0
  407. data/watir/WindowHelper.rb +0 -47
  408. data/watir/camel_case.rb +0 -37
  409. data/watir/clickJSDialog.rb +0 -19
  410. data/watir/cookiemanager.rb +0 -53
  411. data/watir/exceptions.rb +0 -60
  412. data/watir/screen_capture.rb +0 -115
  413. data/watir/setFileDialog.rb +0 -16
  414. data/watir/testUnitAddons.rb +0 -47
  415. data/watir/watir_simple.rb +0 -475
  416. data/watir/winClicker.rb +0 -505
  417. data/watir.rb +0 -3744
  418. /data/{unittests → spec/watirspec}/html/images/1.gif +0 -0
  419. /data/{unittests/html/images/2.GIF → spec/watirspec/html/images/2.gif} +0 -0
  420. /data/{unittests/html/images/3.GIF → spec/watirspec/html/images/3.gif} +0 -0
  421. /data/{unittests/html/images/minus.GIF → spec/watirspec/html/images/minus.gif} +0 -0
  422. /data/{unittests → spec/watirspec}/html/images/plus.gif +0 -0
@@ -0,0 +1,132 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe ElementCollection do
7
+ it 'returns inner elements of parent element having different html tag' do
8
+ browser.goto(WatirSpec.url_for('collections.html'))
9
+ expect(browser.span(id: 'a_span').divs.size).to eq 2
10
+ end
11
+
12
+ it 'returns inner elements of parent element having same html tag' do
13
+ browser.goto(WatirSpec.url_for('collections.html'))
14
+ expect(browser.span(id: 'a_span').spans.size).to eq 2
15
+ end
16
+
17
+ it 'returns correct subtype of elements' do
18
+ browser.goto(WatirSpec.url_for('collections.html'))
19
+ collection = browser.span(id: 'a_span').spans
20
+ expect(collection.all?(Span)).to be true
21
+ end
22
+
23
+ it 'returns correct subtype of elements without tag_name' do
24
+ browser.goto(WatirSpec.url_for('collections.html'))
25
+ collection = browser.span(id: 'a_span').elements
26
+ collection.locate
27
+ expect(collection.first).to be_a Div
28
+ expect(collection.last).to be_a Span
29
+ end
30
+
31
+ it 'can contain more than one type of element' do
32
+ browser.goto(WatirSpec.url_for('nested_elements.html'))
33
+ collection = browser.div(id: 'parent').children
34
+ expect(collection.any?(Span)).to be true
35
+ expect(collection.any?(Div)).to be true
36
+ end
37
+
38
+ it 'relocates the same element' do
39
+ browser.goto(WatirSpec.url_for('nested_elements.html'))
40
+ collection = browser.div(id: 'parent').children
41
+ tag = collection[3].tag_name
42
+ browser.refresh
43
+ expect(collection[3].tag_name).to eq tag
44
+ end
45
+
46
+ it 'returns value for #empty?' do
47
+ browser.goto(WatirSpec.url_for('collections.html'))
48
+ expect(browser.span(id: 'a_span').options.empty?).to be true
49
+ end
50
+
51
+ it 'returns value for #any?' do
52
+ browser.goto(WatirSpec.url_for('collections.html'))
53
+ expect(browser.span(id: 'a_span').spans.any?).to be true
54
+ end
55
+
56
+ it 'locates elements' do
57
+ browser.goto(WatirSpec.url_for('collections.html'))
58
+ spans = browser.span(id: 'a_span').spans
59
+ allow(spans).to receive(:elements).and_return([])
60
+ expect(spans.locate).to be_a SpanCollection
61
+ expect(spans).to have_received(:elements).once
62
+ end
63
+
64
+ it 'lazy loads collections referenced with #[]' do
65
+ browser.goto(WatirSpec.url_for('collections.html'))
66
+ allow(browser.wd).to receive(:find_elements)
67
+ browser.spans[3]
68
+ expect(browser.wd).not_to have_received(:find_elements)
69
+ end
70
+
71
+ it 'does not relocate collections when previously evaluated' do
72
+ browser.goto(WatirSpec.url_for('collections.html'))
73
+ elements = browser.spans.tap(&:to_a)
74
+
75
+ allow(browser.wd).to receive(:find_elements)
76
+ elements[1].id
77
+ expect(browser.wd).not_to have_received(:find_elements)
78
+ end
79
+
80
+ it 'relocates cached elements that go stale' do
81
+ browser.goto(WatirSpec.url_for('collections.html'))
82
+ elements = browser.spans.tap(&:to_a)
83
+
84
+ browser.refresh
85
+ expect(elements[1]).to be_stale
86
+ expect { elements[1] }.not_to raise_unknown_object_exception
87
+ end
88
+
89
+ it 'does not retrieve tag_name on elements when specifying tag_name' do
90
+ browser.goto(WatirSpec.url_for('collections.html'))
91
+ collection = browser.span(id: 'a_span').spans
92
+
93
+ expect_any_instance_of(Selenium::WebDriver::Element).not_to receive(:tag_name)
94
+ collection.locate
95
+ end
96
+
97
+ it 'does not retrieve tag_name on elements without specifying tag_name' do
98
+ browser.goto(WatirSpec.url_for('collections.html'))
99
+ collection = browser.span(id: 'a_span').elements
100
+
101
+ expect_any_instance_of(Selenium::WebDriver::Element).not_to receive(:tag_name)
102
+ collection.locate
103
+ end
104
+
105
+ it 'does not execute_script to retrieve tag_names when specifying tag_name' do
106
+ browser.goto(WatirSpec.url_for('collections.html'))
107
+ collection = browser.span(id: 'a_span').spans
108
+
109
+ allow(browser.wd).to receive(:execute_script)
110
+ collection.locate
111
+ expect(browser.wd).not_to have_received(:execute_script)
112
+ end
113
+
114
+ it 'returns correct containers without specifying tag_name' do
115
+ browser.goto(WatirSpec.url_for('collections.html'))
116
+ elements = browser.span(id: 'a_span').elements.to_a
117
+ expect(elements[0]).to be_a(Div)
118
+ expect(elements[-1]).to be_a(Span)
119
+ end
120
+
121
+ it 'Raises Exception if any element in collection continues to go stale' do
122
+ browser.goto(WatirSpec.url_for('collections.html'))
123
+
124
+ stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
125
+ allow(browser.wd).to receive(:execute_script).and_raise(stale_exception)
126
+
127
+ msg = 'Unable to locate element collection from {:xpath=>".//span"} due to changing page'
128
+ expect { browser.span.elements(xpath: './/span').to_a }.to raise_exception Exception::LocatorException, msg
129
+ expect(browser.wd).to have_received(:execute_script).exactly(3).times
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,209 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe DateField do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
9
+ end
10
+
11
+ # Exists method
12
+ describe '#exists?' do
13
+ it 'returns true if the element exists' do
14
+ expect(browser.date_field(id: 'html5_date')).to exist
15
+ expect(browser.date_field(id: /html5_date/)).to exist
16
+ expect(browser.date_field(name: 'html5_date')).to exist
17
+ expect(browser.date_field(name: /html5_date/)).to exist
18
+ expect(browser.date_field(text: '')).to exist
19
+ expect(browser.date_field(text: //)).to exist
20
+ expect(browser.date_field(index: 0)).to exist
21
+ expect(browser.date_field(label: 'HTML5 Date')).to exist
22
+ expect(browser.date_field(label: /Date$/)).to exist
23
+ end
24
+
25
+ it 'returns true when using xpath',
26
+ except: {browser: :ie, reason: 'Date type not recognized'} do
27
+ expect(browser.date_field(xpath: "//input[@id='html5_date']")).to exist
28
+ end
29
+
30
+ it 'returns the date field if given no args' do
31
+ expect(browser.date_field).to exist
32
+ end
33
+
34
+ it 'respects date fields types',
35
+ except: {browser: :ie, reason: 'Date type not recognized'} do
36
+ expect(browser.date_field.type).to eq('date')
37
+ end
38
+
39
+ it 'returns false if the element does not exist' do
40
+ expect(browser.date_field(id: 'no_such_id')).not_to exist
41
+ expect(browser.date_field(id: /no_such_id/)).not_to exist
42
+ expect(browser.date_field(name: 'no_such_name')).not_to exist
43
+ expect(browser.date_field(name: /no_such_name/)).not_to exist
44
+ expect(browser.date_field(value: 'no_such_value')).not_to exist
45
+ expect(browser.date_field(value: /no_such_value/)).not_to exist
46
+ expect(browser.date_field(text: 'no_such_text')).not_to exist
47
+ expect(browser.date_field(text: /no_such_text/)).not_to exist
48
+ expect(browser.date_field(class: 'no_such_class')).not_to exist
49
+ expect(browser.date_field(class: /no_such_class/)).not_to exist
50
+ expect(browser.date_field(index: 1337)).not_to exist
51
+ expect(browser.date_field(xpath: "//input[@id='no_such_id']")).not_to exist
52
+ expect(browser.date_field(label: 'bad label')).not_to exist
53
+ expect(browser.date_field(label: /bad label/)).not_to exist
54
+ end
55
+
56
+ it "raises TypeError when 'what' argument is invalid" do
57
+ expect { browser.date_field(id: 3.14).exists? }.to raise_error(TypeError)
58
+ end
59
+ end
60
+
61
+ # Attribute methods
62
+ describe '#id' do
63
+ it 'returns the id attribute if the date field exists' do
64
+ expect(browser.date_field(name: 'html5_date').id).to eq 'html5_date'
65
+ end
66
+
67
+ it "raises UnknownObjectException if the date field doesn't exist" do
68
+ expect { browser.date_field(index: 1337).id }.to raise_unknown_object_exception
69
+ end
70
+ end
71
+
72
+ describe '#name' do
73
+ it 'returns the name attribute if the date field exists' do
74
+ expect(browser.date_field(id: 'html5_date').name).to eq 'html5_date'
75
+ end
76
+
77
+ it "raises UnknownObjectException if the date field doesn't exist" do
78
+ expect { browser.date_field(index: 1337).name }.to raise_unknown_object_exception
79
+ end
80
+ end
81
+
82
+ describe '#type' do
83
+ it 'returns the type attribute if the date field exists',
84
+ except: {browser: :ie, reason: 'Date type not recognized'} do
85
+ expect(browser.date_field(id: 'html5_date').type).to eq 'date'
86
+ end
87
+
88
+ it "raises UnknownObjectException if the date field doesn't exist" do
89
+ expect { browser.date_field(index: 1337).type }.to raise_unknown_object_exception
90
+ end
91
+ end
92
+
93
+ describe '#value' do
94
+ it 'returns the value attribute if the date field exists' do
95
+ expect(browser.date_field(id: 'html5_date').value).to eq ''
96
+ end
97
+
98
+ it "raises UnknownObjectException if the date field doesn't exist" do
99
+ expect { browser.date_field(index: 1337).value }.to raise_unknown_object_exception
100
+ end
101
+ end
102
+
103
+ describe '#respond_to?' do
104
+ it 'returns true for all attribute methods' do
105
+ expect(browser.date_field).to respond_to(:class_name)
106
+ expect(browser.date_field).to respond_to(:id)
107
+ expect(browser.date_field).to respond_to(:name)
108
+ expect(browser.date_field).to respond_to(:title)
109
+ expect(browser.date_field).to respond_to(:type)
110
+ expect(browser.date_field).to respond_to(:value)
111
+ end
112
+ end
113
+
114
+ # Access methods
115
+ describe '#enabled?' do
116
+ it 'returns true for enabled date fields' do
117
+ expect(browser.browser.date_field(id: 'html5_date')).to be_enabled
118
+ end
119
+
120
+ it "raises UnknownObjectException if the date field doesn't exist" do
121
+ expect { browser.browser.date_field(id: 'no_such_id').enabled? }.to raise_unknown_object_exception
122
+ end
123
+ end
124
+
125
+ # Manipulation methods
126
+ describe '#value=' do
127
+ it 'sets the value of the element to a Date' do
128
+ date = browser.date_field(id: 'html5_date')
129
+ date.value = Date.today
130
+ expect(Date.parse(date.value)).to eq Date.today
131
+ end
132
+
133
+ it 'sets the value of the element to a Time' do
134
+ date = browser.date_field(id: 'html5_date')
135
+ date.value = ::Time.now
136
+ expect(Date.parse(date.value)).to eq Date.today
137
+ end
138
+
139
+ it 'sets the value of the element to an arbitrary class that responds to #strftime' do
140
+ instance_like_date = ::Object.new
141
+ def instance_like_date.strftime(_)
142
+ '2022-10-11'
143
+ end
144
+
145
+ date = browser.date_field(id: 'html5_date')
146
+ date.value = instance_like_date
147
+ expect(date.value).to eq '2022-10-11'
148
+ end
149
+
150
+ it 'sets the value when accessed through the enclosing Form' do
151
+ date_field = browser.form(id: 'new_user').date_field(id: 'html5_date')
152
+ date_field.value = Date.today
153
+ expect(Date.parse(date_field.value)).to eq Date.today
154
+ end
155
+
156
+ it "raises UnknownObjectException if the date field doesn't exist" do
157
+ expect { browser.date_field(id: 'no_such_id').value = Date.today }.to raise_unknown_object_exception
158
+ end
159
+
160
+ it 'raises ArgumentError if using non-Date parameter' do
161
+ expect { browser.date_field(id: 'no_such_id').value = 'foo' }.to raise_exception ArgumentError
162
+ end
163
+ end
164
+
165
+ describe '#set!' do
166
+ it 'sets the value of the element' do
167
+ date = browser.date_field(id: 'html5_date')
168
+ date.set!(Date.today)
169
+ expect(Date.parse(date.value)).to eq Date.today
170
+ end
171
+
172
+ it 'sets the value when accessed through the enclosing Form' do
173
+ date_field = browser.form(id: 'new_user').date_field(id: 'html5_date')
174
+ date_field.set!(Date.today)
175
+ expect(Date.parse(date_field.value)).to eq Date.today
176
+ end
177
+
178
+ it 'raises ArgumentError when no arguments are provided' do
179
+ expect { browser.date_field(id: 'html5_date').set! }.to raise_exception ArgumentError
180
+ end
181
+
182
+ it "raises UnknownObjectException if the date field doesn't exist" do
183
+ expect { browser.date_field(id: 'no_such_id').set!(Date.today) }.to raise_unknown_object_exception
184
+ end
185
+ end
186
+
187
+ describe '#set' do
188
+ it 'sets the value of the element' do
189
+ date = browser.date_field(id: 'html5_date')
190
+ date.set(Date.today)
191
+ expect(Date.parse(date.value)).to eq Date.today
192
+ end
193
+
194
+ it 'sets the value when accessed through the enclosing Form' do
195
+ date_field = browser.form(id: 'new_user').date_field(id: 'html5_date')
196
+ date_field.set(Date.today)
197
+ expect(Date.parse(date_field.value)).to eq Date.today
198
+ end
199
+
200
+ it 'raises ArgumentError when no arguments are provided' do
201
+ expect { browser.date_field(id: 'html5_date').set }.to raise_exception ArgumentError
202
+ end
203
+
204
+ it "raises UnknownObjectException if the date field doesn't exist" do
205
+ expect { browser.date_field(id: 'no_such_id').set(Date.today) }.to raise_unknown_object_exception
206
+ end
207
+ end
208
+ end
209
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe DateFieldCollection do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
9
+ end
10
+
11
+ describe 'with selectors' do
12
+ it 'returns the matching elements' do
13
+ expect(browser.date_fields(name: 'html5_date').to_a).to eq [browser.date_field(name: 'html5_date')]
14
+ end
15
+ end
16
+
17
+ describe '#length' do
18
+ it 'returns the number of date_fields' do
19
+ expect(browser.date_fields.length).to eq 1
20
+ end
21
+ end
22
+
23
+ describe '#[]' do
24
+ it 'returns the date_field at the given index' do
25
+ expect(browser.date_fields[0].id).to eq 'html5_date'
26
+ end
27
+ end
28
+
29
+ describe '#each' do
30
+ it 'iterates through date_fields correctly' do
31
+ count = 0
32
+
33
+ browser.date_fields.each_with_index do |c, index|
34
+ expect(c).to be_instance_of(DateField)
35
+ expect(c.name).to eq browser.date_field(index: index).name
36
+ expect(c.id).to eq browser.date_field(index: index).id
37
+ expect(c.value).to eq browser.date_field(index: index).value
38
+
39
+ count += 1
40
+ end
41
+
42
+ expect(count).to be > 0
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe DateTimeField do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
9
+ end
10
+
11
+ # Exists method
12
+ describe '#exists?' do
13
+ it 'returns true if the element exists' do
14
+ expect(browser.date_time_field(id: 'html5_datetime-local')).to exist
15
+ expect(browser.date_time_field(id: /html5_datetime-local/)).to exist
16
+ expect(browser.date_time_field(name: 'html5_datetime-local')).to exist
17
+ expect(browser.date_time_field(name: /html5_datetime-local/)).to exist
18
+ expect(browser.date_time_field(text: '')).to exist
19
+ expect(browser.date_time_field(text: //)).to exist
20
+ expect(browser.date_time_field(index: 0)).to exist
21
+ expect(browser.date_time_field(label: 'HTML5 Datetime Local')).to exist
22
+ expect(browser.date_time_field(label: /Local$/)).to exist
23
+ end
24
+
25
+ it 'returns true if the datetime-local element exists',
26
+ except: {browser: :ie, reason: 'Date type not recognized'} do
27
+ expect(browser.date_time_field(xpath: "//input[@id='html5_datetime-local']")).to exist
28
+ end
29
+
30
+ it 'returns the date-time field if given no args' do
31
+ expect(browser.date_time_field).to exist
32
+ end
33
+
34
+ it 'respects date-time fields types',
35
+ except: {browser: :ie, reason: 'Date type not recognized'} do
36
+ expect(browser.date_time_field.type).to eq('datetime-local')
37
+ end
38
+
39
+ it 'returns false if the element does not exist' do
40
+ expect(browser.date_time_field(id: 'no_such_id')).not_to exist
41
+ expect(browser.date_time_field(id: /no_such_id/)).not_to exist
42
+ expect(browser.date_time_field(name: 'no_such_name')).not_to exist
43
+ expect(browser.date_time_field(name: /no_such_name/)).not_to exist
44
+ expect(browser.date_time_field(value: 'no_such_value')).not_to exist
45
+ expect(browser.date_time_field(value: /no_such_value/)).not_to exist
46
+ expect(browser.date_time_field(text: 'no_such_text')).not_to exist
47
+ expect(browser.date_time_field(text: /no_such_text/)).not_to exist
48
+ expect(browser.date_time_field(class: 'no_such_class')).not_to exist
49
+ expect(browser.date_time_field(class: /no_such_class/)).not_to exist
50
+ expect(browser.date_time_field(index: 1337)).not_to exist
51
+ expect(browser.date_time_field(xpath: "//input[@id='no_such_id']")).not_to exist
52
+ expect(browser.date_time_field(label: 'bad label')).not_to exist
53
+ expect(browser.date_time_field(label: /bad label/)).not_to exist
54
+ end
55
+
56
+ it "raises TypeError when 'what' argument is invalid" do
57
+ expect { browser.date_time_field(id: 3.14).exists? }.to raise_error(TypeError)
58
+ end
59
+ end
60
+
61
+ # Attribute methods
62
+ describe '#id' do
63
+ it 'returns the id attribute if the date-time field exists' do
64
+ expect(browser.date_time_field(name: 'html5_datetime-local').id).to eq 'html5_datetime-local'
65
+ end
66
+
67
+ it "raises UnknownObjectException if the date-time field doesn't exist" do
68
+ expect { browser.date_time_field(index: 1337).id }.to raise_unknown_object_exception
69
+ end
70
+ end
71
+
72
+ describe '#name' do
73
+ it 'returns the name attribute if the date-time field exists' do
74
+ expect(browser.date_time_field(id: 'html5_datetime-local').name).to eq 'html5_datetime-local'
75
+ end
76
+
77
+ it "raises UnknownObjectException if the date-time field doesn't exist" do
78
+ expect { browser.date_time_field(index: 1337).name }.to raise_unknown_object_exception
79
+ end
80
+ end
81
+
82
+ describe '#type' do
83
+ it 'returns the type attribute if the date-time field exists',
84
+ except: {browser: :ie, reason: 'Date type not recognized'} do
85
+ expect(browser.date_time_field(id: 'html5_datetime-local').type).to eq 'datetime-local'
86
+ end
87
+
88
+ it "raises UnknownObjectException if the date-time field doesn't exist" do
89
+ expect { browser.date_time_field(index: 1337).type }.to raise_unknown_object_exception
90
+ end
91
+ end
92
+
93
+ describe '#value' do
94
+ it 'returns the value attribute if the date-time field exists' do
95
+ expect(browser.date_time_field(id: 'html5_datetime-local').value).to eq ''
96
+ end
97
+
98
+ it "raises UnknownObjectException if the date-time field doesn't exist" do
99
+ expect { browser.date_time_field(index: 1337).value }.to raise_unknown_object_exception
100
+ end
101
+ end
102
+
103
+ describe '#respond_to?' do
104
+ it 'returns true for all attribute methods' do
105
+ expect(browser.date_time_field).to respond_to(:class_name)
106
+ expect(browser.date_time_field).to respond_to(:id)
107
+ expect(browser.date_time_field).to respond_to(:name)
108
+ expect(browser.date_time_field).to respond_to(:title)
109
+ expect(browser.date_time_field).to respond_to(:type)
110
+ expect(browser.date_time_field).to respond_to(:value)
111
+ end
112
+ end
113
+
114
+ # Access methods
115
+ describe '#enabled?' do
116
+ it 'returns true for enabled date-time fields' do
117
+ expect(browser.browser.date_time_field(id: 'html5_datetime-local')).to be_enabled
118
+ end
119
+
120
+ it "raises UnknownObjectException if the date-time field doesn't exist" do
121
+ expect { browser.browser.date_time_field(id: 'no_such_id').enabled? }.to raise_unknown_object_exception
122
+ end
123
+ end
124
+
125
+ # Manipulation methods
126
+ describe '#value=' do
127
+ it 'sets the value of the element to a Time' do
128
+ date_time = ::Time.now
129
+ date_time_field = browser.date_time_field(id: 'html5_datetime-local')
130
+ date_time_field.value = date_time
131
+ expect(::Time.parse(date_time_field.value).strftime('%Y-%m-%dT%H:%M'))
132
+ .to eq date_time.strftime('%Y-%m-%dT%H:%M')
133
+ end
134
+
135
+ it 'sets the value of the element to a DateTime' do
136
+ date_time = DateTime.now
137
+ date_time_field = browser.date_time_field(id: 'html5_datetime-local')
138
+ date_time_field.value = date_time
139
+ expect(::Time.parse(date_time_field.value).strftime('%Y-%m-%dT%H:%M'))
140
+ .to eq date_time.strftime('%Y-%m-%dT%H:%M')
141
+ end
142
+
143
+ it 'sets the value of the element to an arbitrary class that responds to #strftime' do
144
+ date_time = ::Object.new
145
+ def date_time.strftime(_)
146
+ '2022-10-11T12:13'
147
+ end
148
+
149
+ date_time_field = browser.date_time_field(id: 'html5_datetime-local')
150
+ date_time_field.value = date_time
151
+ expect(date_time_field.value).to eq '2022-10-11T12:13'
152
+ end
153
+
154
+ it 'sets the value when accessed through the enclosing Form' do
155
+ date_time = ::Time.now
156
+ date_time_field = browser.form(id: 'new_user').date_time_field(id: 'html5_datetime-local')
157
+ date_time_field.value = date_time
158
+ expect(::Time.parse(date_time_field.value).strftime('%Y-%m-%dT%H:%M'))
159
+ .to eq date_time.strftime('%Y-%m-%dT%H:%M')
160
+ end
161
+
162
+ it "raises UnknownObjectException if the date-time field doesn't exist" do
163
+ expect { browser.date_time_field(id: 'no_such_id').value = ::Time.now }.to raise_unknown_object_exception
164
+ end
165
+
166
+ it 'raises ArgumentError if using non-Date parameter' do
167
+ expect { browser.date_time_field(id: 'no_such_id').value = 'foo' }.to raise_exception ArgumentError
168
+ end
169
+ end
170
+
171
+ describe '#set!' do
172
+ it 'sets the value of the element' do
173
+ date_time = ::Time.now
174
+ date_time_field = browser.date_time_field(id: 'html5_datetime-local')
175
+ date_time_field.set! date_time
176
+ expect(::Time.parse(date_time_field.value).strftime('%Y-%m-%dT%H:%M'))
177
+ .to eq date_time.strftime('%Y-%m-%dT%H:%M')
178
+ end
179
+
180
+ it 'sets the value when accessed through the enclosing Form' do
181
+ date_time = ::Time.now
182
+ date_time_field = browser.form(id: 'new_user').date_time_field(id: 'html5_datetime-local')
183
+ date_time_field.set! date_time
184
+ expect(::Time.parse(date_time_field.value).strftime('%Y-%m-%dT%H:%M'))
185
+ .to eq date_time.strftime('%Y-%m-%dT%H:%M')
186
+ end
187
+
188
+ it 'raises ArgumentError when no arguments are provided' do
189
+ expect { browser.date_time_field(id: 'html5_datetime-local').set! }.to raise_exception ArgumentError
190
+ end
191
+
192
+ it "raises UnknownObjectException if the date-time field doesn't exist" do
193
+ expect { browser.date_time_field(id: 'no_such_id').set!(::Time.now) }.to raise_unknown_object_exception
194
+ end
195
+ end
196
+
197
+ describe '#set' do
198
+ it 'sets the value of the element' do
199
+ date_time = ::Time.now
200
+ date_time_field = browser.date_time_field(id: 'html5_datetime-local')
201
+ date_time_field.set(date_time)
202
+ expect(::Time.parse(date_time_field.value).strftime('%Y-%m-%dT%H:%M'))
203
+ .to eq date_time.strftime('%Y-%m-%dT%H:%M')
204
+ end
205
+
206
+ it 'sets the value when accessed through the enclosing Form' do
207
+ date_time = ::Time.now
208
+ date_time_field = browser.form(id: 'new_user').date_time_field(id: 'html5_datetime-local')
209
+ date_time_field.set date_time
210
+ expect(::Time.parse(date_time_field.value).strftime('%Y-%m-%dT%H:%M'))
211
+ .to eq date_time.strftime('%Y-%m-%dT%H:%M')
212
+ end
213
+
214
+ it 'raises ArgumentError when no arguments are provided' do
215
+ expect { browser.date_time_field(id: 'html5_datetime-local').set }.to raise_exception ArgumentError
216
+ end
217
+
218
+ it "raises UnknownObjectException if the date-time field doesn't exist" do
219
+ expect { browser.date_time_field(id: 'no_such_id').set(::Time.now) }.to raise_unknown_object_exception
220
+ end
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe DateTimeFieldCollection do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
9
+ end
10
+
11
+ describe 'with selectors' do
12
+ it 'returns the matching elements' do
13
+ list = [browser.date_time_field(name: 'html5_datetime-local')]
14
+ expect(browser.date_time_fields(name: 'html5_datetime-local').to_a).to eq list
15
+ end
16
+ end
17
+
18
+ describe '#length' do
19
+ it 'returns the number of date_time_fields' do
20
+ expect(browser.date_time_fields.length).to eq 1
21
+ end
22
+ end
23
+
24
+ describe '#[]' do
25
+ it 'returns the date_time_field at the given index' do
26
+ expect(browser.date_time_fields[0].id).to eq 'html5_datetime-local'
27
+ end
28
+ end
29
+
30
+ describe '#each' do
31
+ it 'iterates through date_time_fields correctly' do
32
+ count = 0
33
+
34
+ browser.date_time_fields.each_with_index do |c, index|
35
+ expect(c).to be_instance_of(DateTimeField)
36
+ expect(c.name).to eq browser.date_time_field(index: index).name
37
+ expect(c.id).to eq browser.date_time_field(index: index).id
38
+ expect(c.value).to eq browser.date_time_field(index: index).value
39
+
40
+ count += 1
41
+ end
42
+
43
+ expect(count).to be > 0
44
+ end
45
+ end
46
+ end
47
+ end