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,130 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+
5
+ module Watir
6
+ class Cookies
7
+ def initialize(control)
8
+ @control = control
9
+ end
10
+
11
+ #
12
+ # Returns array of cookies.
13
+ #
14
+ # @example
15
+ # browser.cookies.to_a
16
+ # #=> {:name=>"my_session", :value=>"BAh7B0kiD3Nlc3Npb25faWQGOgZFRkk", :domain=>"mysite.com"}
17
+ #
18
+ # @return [Array<Hash>]
19
+ #
20
+
21
+ def to_a
22
+ @control.all_cookies.map do |e|
23
+ e.merge(expires: e[:expires]&.to_time)
24
+ end
25
+ end
26
+
27
+ #
28
+ # Returns a cookie by name.
29
+ #
30
+ # @example
31
+ # browser.cookies[:my_session]
32
+ # #=> {:name=>"my_session", :value=>"BAh7B0kiD3Nlc3Npb25faWQGOgZFRkk", :domain=>"mysite.com"}
33
+ #
34
+ # @param [Symbol] name
35
+ # @return <Hash> or nil if not found
36
+ #
37
+
38
+ def [](name)
39
+ to_a.find { |c| c[:name] == name.to_s }
40
+ end
41
+
42
+ #
43
+ # Adds new cookie.
44
+ #
45
+ # @example
46
+ # browser.cookies.add 'my_session', 'BAh7B0kiD3Nlc3Npb25faWQGOgZFRkk', secure: true, http_only: true
47
+ #
48
+ # @param [String] name
49
+ # @param [String] value
50
+ # @param [Hash] opts
51
+ # @option opts [Boolean] :secure
52
+ # @option opts [Boolean] :http_only
53
+ # @option opts [String] :path
54
+ # @option opts [String] :same_site
55
+ # @option opts [Time, DateTime, NilClass] :expires
56
+ # @option opts [String] :domain
57
+ #
58
+ # @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie
59
+
60
+ def add(name, value, opts = {})
61
+ cookie = {
62
+ name: name,
63
+ value: value
64
+ }
65
+ cookie[:secure] = opts[:secure] if opts.key?(:secure)
66
+ cookie[:http_only] = opts[:http_only] if opts.key?(:http_only)
67
+ cookie[:path] = opts[:path] if opts.key?(:path)
68
+ cookie[:same_site] = opts[:same_site] if opts.key?(:same_site)
69
+ expires = opts[:expires]
70
+ if expires
71
+ cookie[:expires] = expires.is_a?(String) ? ::Time.parse(expires) : expires
72
+ end
73
+ cookie[:domain] = opts[:domain] if opts.key?(:domain)
74
+
75
+ @control.add_cookie cookie
76
+ end
77
+
78
+ #
79
+ # Deletes cookie by given name.
80
+ #
81
+ # @example
82
+ # browser.cookies.delete 'my_session'
83
+ #
84
+ # @param [String] name
85
+ #
86
+
87
+ def delete(name)
88
+ @control.delete_cookie(name)
89
+ end
90
+
91
+ #
92
+ # Deletes all cookies.
93
+ #
94
+ # @example
95
+ # browser.cookies.clear
96
+ #
97
+
98
+ def clear
99
+ @control.delete_all_cookies
100
+ end
101
+
102
+ #
103
+ # Save cookies to file
104
+ #
105
+ # @example
106
+ # browser.cookies.save '.cookies'
107
+ #
108
+ # @param [String] file
109
+ #
110
+
111
+ def save(file = '.cookies')
112
+ File.write(file, to_a.to_yaml)
113
+ end
114
+
115
+ #
116
+ # Load cookies from file
117
+ #
118
+ # @example
119
+ # browser.cookies.load '.cookies'
120
+ #
121
+ # @param [String] file
122
+ #
123
+
124
+ def load(file = '.cookies')
125
+ YAML.safe_load_file(file, permitted_classes: [::Symbol, ::Time]).each do |c|
126
+ add(c.delete(:name), c.delete(:value), c)
127
+ end
128
+ end
129
+ end # Cookies
130
+ end # Watir
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ #
5
+ # Base class for element collections.
6
+ #
7
+
8
+ class ElementCollection
9
+ include Enumerable
10
+ include Exception
11
+ include JSSnippets
12
+ include Waitable
13
+ include Locators::ClassHelpers
14
+
15
+ def initialize(query_scope, selector)
16
+ @query_scope = query_scope
17
+ @selector = selector
18
+ @to_a = nil
19
+
20
+ build unless @selector.key?(:element)
21
+ end
22
+
23
+ #
24
+ # Relocates elements then yields each element in resulting collection.
25
+ #
26
+ # @example
27
+ # divs = browser.divs(class: 'kls')
28
+ # divs.each do |div|
29
+ # puts div.text
30
+ # end
31
+ #
32
+ # @yieldparam [Watir::Element] element Iterate through the elements in this collection.
33
+ #
34
+
35
+ def each(&blk)
36
+ reset!
37
+ to_a.each(&blk)
38
+ end
39
+
40
+ alias length count
41
+ alias size count
42
+
43
+ alias empty? none?
44
+
45
+ alias exist? any?
46
+ alias exists? any?
47
+
48
+ def build
49
+ selector_builder.build(@selector.dup)
50
+ end
51
+
52
+ #
53
+ # Get the element at the given index or range.
54
+ #
55
+ # Any call to an ElementCollection that includes an adjacent selector
56
+ # can not be lazy loaded because it must store the correct type
57
+ #
58
+ # Ranges can not be lazy loaded
59
+ #
60
+ # @param [Integer, Range] value Index (0-based) or Range of desired element(s)
61
+ # @return [Watir::Element, Watir::ElementCollection] Returns an instance of a Watir::Element subclass
62
+ #
63
+
64
+ def [](value)
65
+ if value.is_a?(Range)
66
+ to_a[value]
67
+ elsif @selector.key? :adjacent
68
+ to_a[value] || element_class.new(@query_scope, invalid_locator: true)
69
+ elsif @to_a && @to_a[value]
70
+ @to_a[value]
71
+ else
72
+ element_class.new(@query_scope, @selector.merge(index: value))
73
+ end
74
+ end
75
+
76
+ #
77
+ # First element of the collection
78
+ #
79
+ # @return [Watir::Element] Returns an instance of a Watir::Element subclass
80
+ #
81
+
82
+ def first
83
+ self[0]
84
+ end
85
+
86
+ #
87
+ # Last element of the collection
88
+ #
89
+ # @return [Watir::Element] Returns an instance of a Watir::Element subclass
90
+ #
91
+
92
+ def last
93
+ self[-1]
94
+ end
95
+
96
+ #
97
+ # This collection as an Array.
98
+ #
99
+ # @return [Array<Watir::Element>]
100
+ #
101
+
102
+ def to_a
103
+ hash = {}
104
+ @to_a ||=
105
+ elements_with_tags.map.with_index do |(el, tag_name), idx|
106
+ selector = @selector.dup
107
+ selector[:index] = idx unless idx.zero?
108
+ element = element_class.new(@query_scope, selector)
109
+ if [HTMLElement, Input].include? element.class
110
+ construct_subtype(element, hash, tag_name).tap { |e| e.cache = el }
111
+ else
112
+ element.tap { |e| e.cache = el }
113
+ end
114
+ end
115
+ end
116
+
117
+ #
118
+ # Locate all elements and return self.
119
+ #
120
+ # @return ElementCollection
121
+ #
122
+
123
+ def locate
124
+ to_a
125
+ self
126
+ end
127
+
128
+ #
129
+ # Returns browser.
130
+ #
131
+ # @return [Watir::Browser]
132
+ #
133
+
134
+ def browser
135
+ @query_scope.browser
136
+ end
137
+
138
+ #
139
+ # Returns true if two element collections are equal.
140
+ #
141
+ # @example
142
+ # browser.select_list(name: "new_user_languages").options == browser.select_list(id: "new_user_languages").options
143
+ # #=> true
144
+ #
145
+ # @example
146
+ # browser.select_list(name: "new_user_role").options == browser.select_list(id: "new_user_languages").options
147
+ # #=> false
148
+ #
149
+
150
+ def ==(other)
151
+ to_a == other.to_a
152
+ end
153
+ alias eql? ==
154
+
155
+ #
156
+ # Removes cache of previously located elements in the collection.
157
+ #
158
+ # @example
159
+ # options = browser.select_list(name: "new_user_languages").options
160
+ # options.reset!
161
+ # options[0]
162
+ # #=> nil
163
+ #
164
+
165
+ def reset!
166
+ @to_a = nil
167
+ end
168
+
169
+ private
170
+
171
+ def elements
172
+ ensure_context
173
+ if selector_builder.built.key?(:scope)
174
+ @query_scope.send(:element_call) { locate_all }
175
+ else
176
+ locate_all
177
+ end
178
+ end
179
+
180
+ def elements_with_tags
181
+ els = elements
182
+ if @selector[:tag_name]
183
+ els.map { |e| [e, @selector[:tag_name]] }
184
+ else
185
+ retries = 0
186
+ begin
187
+ els.zip(execute_js(:getElementTags, els))
188
+ rescue Selenium::WebDriver::Error::StaleElementReferenceError
189
+ retries += 1
190
+ sleep 0.5
191
+ retry unless retries > 2
192
+ raise LocatorException, "Unable to locate element collection from #{@selector} due to changing page"
193
+ end
194
+ end
195
+ end
196
+
197
+ def ensure_context
198
+ if @query_scope.is_a?(Browser) || (!@query_scope.located? && @query_scope.is_a?(IFrame))
199
+ @query_scope.browser.locate
200
+ elsif @query_scope.located? && @query_scope.stale?
201
+ @query_scope.locate
202
+ end
203
+ @query_scope.switch_to! if @query_scope.is_a?(IFrame)
204
+ end
205
+
206
+ def locate_all
207
+ locator.locate_all(selector_builder.built)
208
+ end
209
+
210
+ def element_class
211
+ Watir.const_get(self.class.name.sub(/Collection$/, ''))
212
+ end
213
+
214
+ def construct_subtype(element, hash, tag_name)
215
+ selector = element.selector
216
+ hash[tag_name] ||= 0
217
+ hash[tag_name] += 1
218
+ selector[:index] = hash[tag_name] - 1
219
+ selector[:tag_name] = tag_name
220
+ Watir.element_class_for(tag_name).new(@query_scope, selector)
221
+ end
222
+ end # ElementCollection
223
+ end # Watir
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ #
5
+ # Class representing button elements.
6
+ #
7
+ # This class covers both <button> and <input type="submit|reset|image|button" /> elements.
8
+ #
9
+
10
+ class Button < HTMLElement
11
+ inherit_attributes_from Input
12
+
13
+ VALID_TYPES = %w[button reset submit image].freeze
14
+
15
+ #
16
+ # Returns the text of the button.
17
+ #
18
+ # For input elements, returns the "value" attribute.
19
+ # For button elements, returns the inner text.
20
+ #
21
+ # @return [String]
22
+ #
23
+
24
+ def text
25
+ tag_name == 'input' ? value : super
26
+ end
27
+ end # Button
28
+ end # Watir
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ #
5
+ # Custom class representing table cell (th or td).
6
+ #
7
+
8
+ class Cell < TableCell
9
+ end # Cell
10
+
11
+ class CellCollection < TableCellCollection
12
+ def elements
13
+ # we do this craziness since the xpath used will find direct child rows
14
+ # before any rows inside thead/tbody/tfoot...
15
+ super.sort_by { |e| e.attribute(:cellIndex).to_i }
16
+ end
17
+ end
18
+ end # Watir
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class CheckBox < Input
5
+ #
6
+ # Sets checkbox to the given value.
7
+ #
8
+ # @example
9
+ # checkbox = browser.checkbox(id: 'new_user_interests_cars')
10
+ # checkbox.set? #=> false
11
+ # checkbox.set
12
+ # checkbox.set? #=> true
13
+ # checkbox.set(false)
14
+ # checkbox.set? #=> false
15
+ #
16
+ # @param [Boolean] bool
17
+ #
18
+
19
+ def set(bool = true)
20
+ set? == bool ? assert_enabled : click
21
+ end
22
+ alias check set
23
+
24
+ #
25
+ # Returns true if the element is checked
26
+ # @return [Boolean]
27
+ #
28
+
29
+ def set?
30
+ element_call { @element.selected? }
31
+ end
32
+ alias checked? set?
33
+
34
+ #
35
+ # Unsets checkbox.
36
+ #
37
+
38
+ def clear
39
+ set false
40
+ end
41
+ alias uncheck clear
42
+ end # CheckBox
43
+
44
+ module Container
45
+ def checkbox(opts = {})
46
+ CheckBox.new(self, opts.merge(tag_name: 'input', type: 'checkbox'))
47
+ end
48
+
49
+ def checkboxes(opts = {})
50
+ CheckBoxCollection.new(self, opts.merge(tag_name: 'input', type: 'checkbox'))
51
+ end
52
+ end # Container
53
+
54
+ class CheckBoxCollection < InputCollection
55
+ end # CheckBoxCollection
56
+ end # Watir
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class DateField < Input
5
+ #
6
+ # Enter the provided value.
7
+ #
8
+
9
+ def set!(date)
10
+ date = Date.parse date if date.is_a?(String)
11
+
12
+ message = "DateField##{__callee__} only accepts instances that respond to #strftime"
13
+ raise ArgumentError, message unless date.respond_to?(:strftime)
14
+
15
+ date_string = date.strftime('%Y-%m-%d')
16
+ element_call(:wait_for_writable) do
17
+ execute_js(:setValue, @element, date_string)
18
+ execute_js(:fireEvent, @element, :change)
19
+ end
20
+ end
21
+ alias set set!
22
+ alias value= set
23
+ end # DateField
24
+
25
+ module Container
26
+ def date_field(opts = {})
27
+ DateField.new(self, opts.merge(tag_name: 'input', type: 'date'))
28
+ end
29
+
30
+ def date_fields(opts = {})
31
+ DateFieldCollection.new(self, opts.merge(tag_name: 'input', type: 'date'))
32
+ end
33
+ end # Container
34
+
35
+ class DateFieldCollection < InputCollection
36
+ private
37
+
38
+ def element_class
39
+ DateField
40
+ end
41
+ end # DateFieldCollection
42
+ end # Watir
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class DateTimeField < Input
5
+ #
6
+ # Enter the provided value.
7
+ #
8
+
9
+ def set!(date)
10
+ date = ::Time.parse date if date.is_a?(String)
11
+
12
+ message = "DateTimeField##{__callee__} only accepts instances that respond to #strftime"
13
+ raise ArgumentError, message unless date.respond_to?(:strftime)
14
+
15
+ date_time_string = date.strftime('%Y-%m-%dT%H:%M')
16
+ element_call(:wait_for_writable) do
17
+ execute_js(:setValue, @element, date_time_string)
18
+ execute_js(:fireEvent, @element, :change)
19
+ end
20
+ end
21
+ alias set set!
22
+ alias value= set
23
+ end # DateTimeField
24
+
25
+ module Container
26
+ def date_time_field(opts = {})
27
+ DateTimeField.new(self, opts.merge(tag_name: 'input', type: 'datetime-local'))
28
+ end
29
+
30
+ def date_time_fields(opts = {})
31
+ DateTimeFieldCollection.new(self, opts.merge(tag_name: 'input', type: 'datetime-local'))
32
+ end
33
+ end # Container
34
+
35
+ class DateTimeFieldCollection < InputCollection
36
+ private
37
+
38
+ def element_class
39
+ DateTimeField
40
+ end
41
+ end # DateTimeFieldCollection
42
+ end # Watir
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class DList < HTMLElement
5
+ def to_hash
6
+ keys = dts.map(&:text)
7
+ values = dds.map(&:text)
8
+
9
+ keys.zip(values).to_h
10
+ end
11
+ end # DList
12
+ end # Watir