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,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Exception
5
+ class Error < StandardError; end
6
+
7
+ # TODO: rename Object -> Element?
8
+ class UnknownObjectException < Error; end
9
+ class ObjectDisabledException < Error; end
10
+ class ObjectReadOnlyException < Error; end
11
+ class NoValueFoundException < Error; end
12
+ class NoMatchingWindowFoundException < Error; end
13
+ class UnknownFrameException < Error; end
14
+ class LocatorException < Error; end
15
+ end # Exception
16
+ end # Watir
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+
5
+ module Watir
6
+ class Browser
7
+ def text
8
+ doc = Nokogiri::HTML(body(index: 0).html)
9
+ doc.css('script').remove # encoding bug in older libxml?
10
+
11
+ doc.inner_text
12
+ end
13
+ end # Browser
14
+ end # Watir
@@ -0,0 +1,114 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Generator
5
+ class Base
6
+ def generate(spec_url, io = StringIO.new)
7
+ @spec_url = spec_url
8
+ @io = io
9
+
10
+ extract_spec
11
+ cleanup_spec
12
+
13
+ write_header
14
+ write_class_defs
15
+ write_container_methods
16
+ write_footer
17
+
18
+ io
19
+ end
20
+
21
+ private
22
+
23
+ def generator
24
+ @generator ||= WebIDL::Generator.new(visitor)
25
+ end
26
+
27
+ def visitor
28
+ @visitor ||= visitor_class.new
29
+ end
30
+
31
+ def extractor
32
+ @extractor ||= extractor_class.new(@spec_url)
33
+ end
34
+
35
+ def extract_spec
36
+ @tag2interfaces = extractor.process
37
+ @sorted_interfaces = extractor.sorted_interfaces
38
+
39
+ raise "error extracting spec: #{extractor.errors.join("\n")}" if extractor.errors.any?
40
+ end
41
+
42
+ def cleanup_spec
43
+ ignored_tags.each do |tag|
44
+ @tag2interfaces.delete(tag)
45
+ end
46
+
47
+ ignored_interfaces.each do |interface|
48
+ @sorted_interfaces.reject! { |intf| intf.name == interface }
49
+ end
50
+
51
+ @sorted_interfaces.each do |intf|
52
+ intf.members.delete_if { |member| ignored_attributes.include?(member.name) }
53
+ end
54
+ end
55
+
56
+ def write_header
57
+ @io.puts "# Autogenerated from #{generator_implementation} specification. Edits may be lost."
58
+ @io.puts 'module Watir'
59
+ end
60
+
61
+ def write_class_defs
62
+ @sorted_interfaces.each do |interface|
63
+ interface = generator.generate(interface)
64
+ next if interface.empty?
65
+
66
+ interface.gsub!(/^\s+\n/, '') # remove empty lines
67
+ @io.puts indent(interface)
68
+ @io.puts "\n"
69
+ end
70
+ end
71
+
72
+ def write_container_methods
73
+ @io.puts "\n"
74
+ @io.puts indent('module Container')
75
+
76
+ @tag2interfaces.sort.each do |tag, interfaces|
77
+ raise "multiple interfaces for tag #{tag.inspect}" if interfaces.map(&:name).uniq.size != 1
78
+
79
+ tag_string = tag.inspect
80
+ singular = Util.paramify(visitor.classify_regexp, tag)
81
+ plural = singular.pluralize
82
+ element_class = Util.classify(visitor.classify_regexp, interfaces.first.name)
83
+ collection_class = "#{element_class}Collection"
84
+
85
+ # visitor.visit_tag(tag, interfaces.first.name) !?
86
+ @io.puts indent(<<~CODE, 2)
87
+
88
+ # @return [#{element_class}]
89
+ def #{singular}(opts = {})
90
+ #{element_class}.new(self, opts.merge(tag_name: #{tag_string}))
91
+ end
92
+ # @return [#{collection_class}]
93
+ def #{plural}(opts = {})
94
+ #{collection_class}.new(self, opts.merge(tag_name: #{tag_string}))
95
+ end
96
+ Watir.tag_to_class[#{tag.to_sym.inspect}] = #{element_class}
97
+
98
+ CODE
99
+ end
100
+
101
+ @io.puts indent('end # Container')
102
+ end
103
+
104
+ def write_footer
105
+ @io.puts 'end # Watir'
106
+ end
107
+
108
+ def indent(code, indent = 1)
109
+ indent_string = ' ' * indent
110
+ code.split("\n").map { |line| line.empty? ? line : indent_string + line }.join("\n")
111
+ end
112
+ end # Base
113
+ end # Generator
114
+ end # Watir
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'tsort'
4
+
5
+ module Watir
6
+ module Generator
7
+ class Base
8
+ class IDLSorter
9
+ include TSort
10
+
11
+ def initialize(interfaces)
12
+ @interfaces = {}
13
+
14
+ interfaces.each do |interface|
15
+ @interfaces[interface.name] ||= []
16
+ interface.inherits.each do |inherit|
17
+ (@interfaces[inherit.name] ||= []) << interface.name
18
+ end
19
+ end
20
+ end
21
+
22
+ def print
23
+ @visited = []
24
+ sort.each { |node| print_node(node) }
25
+ end
26
+
27
+ def sort
28
+ tsort.reverse
29
+ end
30
+
31
+ def tsort_each_node(&blk)
32
+ @interfaces.each_key(&blk)
33
+ end
34
+
35
+ def tsort_each_child(node, &blk)
36
+ @interfaces[node].each(&blk)
37
+ end
38
+
39
+ private
40
+
41
+ def print_node(node, indent = 0)
42
+ return if @visited.include?(node)
43
+
44
+ @visited << node
45
+ puts (' ' * indent) + node
46
+ tsort_each_child(node) { |child| print_node(child, indent + 2) }
47
+ end
48
+ end # IDLSorter
49
+ end # Base
50
+ end # Generator
51
+ end # Watir
@@ -0,0 +1,158 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Generator
5
+ class Base
6
+ class SpecExtractor
7
+ IDL_SELECTOR = "//pre[contains(@class, 'idl')]"
8
+
9
+ class InterfaceNotFound < StandardError; end
10
+
11
+ def initialize(uri)
12
+ @uri = uri
13
+ end
14
+
15
+ def process
16
+ download_and_parse
17
+ extract_idl_parts
18
+ extract_interface_map
19
+ drop_issued_interfaces
20
+ build_result
21
+ rescue StandardError
22
+ p errors
23
+ raise
24
+ end
25
+
26
+ def errors
27
+ @errors ||= []
28
+ end
29
+
30
+ #
31
+ # returns a topoligically sorted array of WebIDL::Ast::Interface objects
32
+ #
33
+
34
+ def sorted_interfaces
35
+ process if @interfaces.nil?
36
+
37
+ idl_sorter.sort.filter_map do |name|
38
+ @interfaces.find { |i| i.name == name } || puts("ignoring interface: #{name}")
39
+ end
40
+ end
41
+
42
+ def print_hierarchy
43
+ process if @interfaces.nil?
44
+ idl_sorter.print
45
+ end
46
+
47
+ def fetch_interface(interface)
48
+ @interfaces_by_name[interface] || raise(InterfaceNotFound, "#{interface} not found in IDL")
49
+ end
50
+
51
+ private
52
+
53
+ def download_and_parse
54
+ File.open(@uri) { |io| @doc = Nokogiri.HTML(io) }
55
+ end
56
+
57
+ def extract_idl_parts
58
+ parsed = @doc.search(IDL_SELECTOR).filter_map { |e| parse_idl(e.inner_text) }
59
+
60
+ implements = []
61
+ includes = []
62
+ @interfaces = []
63
+
64
+ parsed.flatten.each do |element|
65
+ case element
66
+ when WebIDL::Ast::Interface
67
+ @interfaces << element
68
+ when WebIDL::Ast::ImplementsStatement
69
+ implements << element
70
+ when WebIDL::Ast::IncludesStatement
71
+ includes << element
72
+ end
73
+ end
74
+
75
+ @interfaces_by_name = @interfaces.group_by(&:name)
76
+ apply_implements(implements)
77
+ apply_includes(includes)
78
+ merge_interfaces
79
+ end
80
+
81
+ def extract_interface_map
82
+ raise NotImplementedError
83
+ end
84
+
85
+ def drop_issued_interfaces
86
+ @interface_map.delete_if do |_, interface|
87
+ issued_interfaces.include?(interface)
88
+ end
89
+ end
90
+
91
+ def build_result
92
+ raise NotImplementedError
93
+ end
94
+
95
+ def parse_idl(str)
96
+ result = idl_parser.parse(str)
97
+
98
+ if result
99
+ result.build
100
+ else
101
+ errors << idl_parser.failure_reason
102
+ nil
103
+ end
104
+ end
105
+
106
+ def apply_implements(implements)
107
+ implements.each do |is|
108
+ implementor_name = is.implementor.gsub(/^::/, '')
109
+ implementee_name = is.implementee.gsub(/^::/, '')
110
+
111
+ begin
112
+ intf = fetch_interface(implementor_name).first
113
+ intf.implements << fetch_interface(implementee_name).first
114
+ rescue InterfaceNotFound => e
115
+ puts e.message
116
+ end
117
+ end
118
+ end
119
+
120
+ def apply_includes(includes)
121
+ includes.each do |is|
122
+ includer_name = is.includer.gsub(/^::/, '')
123
+ includee_name = is.includee.gsub(/^::/, '')
124
+
125
+ begin
126
+ intf = fetch_interface(includer_name).first
127
+ intf.includes << fetch_interface(includee_name).first
128
+ rescue InterfaceNotFound => e
129
+ puts e.message
130
+ end
131
+ end
132
+ end
133
+
134
+ def merge_interfaces
135
+ non_duplicates = @interfaces.uniq(&:name)
136
+ duplicates = @interfaces - non_duplicates
137
+
138
+ duplicates.each do |intf|
139
+ final = non_duplicates.find { |i| i.name == intf.name }
140
+ final.inherits += intf.inherits
141
+ final.members += intf.members
142
+ final.extended_attributes += intf.extended_attributes
143
+ end
144
+
145
+ @interfaces = non_duplicates
146
+ end
147
+
148
+ def idl_parser
149
+ @idl_parser ||= WebIDL::Parser::IDLParser.new
150
+ end
151
+
152
+ def idl_sorter
153
+ @idl_sorter ||= Base::IDLSorter.new(@interfaces)
154
+ end
155
+ end # SpecExtractor
156
+ end # Base
157
+ end # Generator
158
+ end # Watir
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Generator
5
+ module Util
6
+ module_function
7
+
8
+ def classify(regexp, str)
9
+ if str =~ regexp
10
+ Regexp.last_match(1)
11
+ else
12
+ str
13
+ end
14
+ end
15
+
16
+ def paramify(regexp, str)
17
+ classify(regexp, str).snake_case
18
+ end
19
+ end # Util
20
+ end # Generator
21
+ end # Watir
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Generator
5
+ class Base
6
+ class Visitor < WebIDL::RubySexpVisitor
7
+ STRING_TYPES = ['WindowProxy', 'ValidityState', 'TimeRanges', 'Location',
8
+ 'Any', 'TimedTrackArray', 'TimedTrack', 'TextTrackArray', 'TextTrack',
9
+ /Media.+/, 'TextTrackKind', 'Function', /.*EventHandler$/,
10
+ 'Document', 'DocumentFragment', 'DOMTokenList', 'DOMSettableTokenList',
11
+ 'DOMStringMap', 'HTMLPropertiesCollection', /HTML.*Element/, /HTML.*Collection/,
12
+ 'CSSStyleDeclaration', /.+List$/, 'Date', 'Element', /DOM.+ReadOnly/,
13
+ /SVGAnimated.+/, /SVG.*Element/, /SVG.*Collection/, 'SVGViewSpec',
14
+ 'Object', 'USVString', 'DOMString', 'any'].freeze
15
+ def initialize
16
+ super
17
+
18
+ # When an interface has multiple IDL definitions in the spec, the inheritance is sometimes
19
+ # not repeated. So we'll keep track ourselves.
20
+ @inheritance_map = {}
21
+
22
+ @already_defined = []
23
+ end
24
+
25
+ #
26
+ # WebIDL visitor interface
27
+ #
28
+
29
+ def visit_interface(interface)
30
+ name = interface.name
31
+ parent = interface.inherits.first
32
+
33
+ warn name
34
+ return if name !~ interface_regexp || name =~ /(Collection|Document)$/
35
+
36
+ parent = if force_inheritance.key?(name)
37
+ force_inheritance[name]
38
+ else
39
+ @inheritance_map[name] ||= parent&.name
40
+ return unless @inheritance_map[name]
41
+
42
+ @inheritance_map[name]
43
+ end
44
+
45
+ [:scope,
46
+ [:block,
47
+ element_class(interface.name, extract_attributes(interface), parent),
48
+ collection_class(interface.name)]]
49
+ end
50
+
51
+ def visit_module(mod)
52
+ # ignored
53
+ end
54
+
55
+ def visit_implements_statement(stmt)
56
+ # ignored
57
+ end
58
+
59
+ private
60
+
61
+ def element_class(name, attributes, parent)
62
+ [:class, Util.classify(classify_regexp, name), [:const, Util.classify(classify_regexp, parent)],
63
+ *attribute_calls(attributes)]
64
+ end
65
+
66
+ def extract_attributes(interface)
67
+ members = interface.members
68
+ members += interface.implements.flat_map(&:members)
69
+ members += interface.includes.flat_map(&:members)
70
+
71
+ members.select { |e| e.is_a?(WebIDL::Ast::Attribute) }.uniq(&:name)
72
+ end
73
+
74
+ def collection_class(name)
75
+ return if @already_defined.include?(name)
76
+
77
+ @already_defined << name
78
+ name = Util.classify(classify_regexp, name)
79
+
80
+ [:class, "#{name}Collection", %i[const ElementCollection]]
81
+ end
82
+
83
+ def attribute_calls(attributes)
84
+ attributes.map do |attribute|
85
+ call(:attribute, [
86
+ [:lit, ruby_type_for(attribute.type)],
87
+ [:lit, ruby_method_name_for(attribute)],
88
+ [:lit, attribute.name.to_sym]
89
+ ])
90
+ end
91
+ end
92
+
93
+ def call(name, args)
94
+ [:call, nil, name.to_sym, [:arglist] + args]
95
+ end
96
+
97
+ def ruby_method_name_for(attribute)
98
+ str = if %w[httpEquiv contentEditable acceptCharset isContentEditable].include? attribute.name
99
+ attribute.name.snake_case
100
+ else
101
+ attribute.name.downcase
102
+ end
103
+
104
+ if attribute.type.name == :Boolean
105
+ str = Regexp.last_match(1) if str =~ /^is_(.+)/
106
+ str << '?'
107
+ end
108
+
109
+ str = 'for' if str == 'htmlfor'
110
+
111
+ str.to_sym
112
+ end
113
+
114
+ def ruby_type_for(type)
115
+ case type.name.to_s
116
+ when *STRING_TYPES
117
+ # probably completely wrong.
118
+ String
119
+ when 'UnsignedLong', 'Long', 'Integer', 'Short', 'UnsignedShort',
120
+ 'SVGAnimatedLength'
121
+ Integer
122
+ when 'Float', /.*Double$/
123
+ Float
124
+ when 'Boolean'
125
+ 'Boolean'
126
+ else
127
+ raise "unknown type: #{type.name}"
128
+ end
129
+ end
130
+ end # Visitor
131
+ end # Base
132
+ end # Generator
133
+ end # Watir
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'nokogiri'
4
+ require 'open-uri'
5
+ require 'webidl'
6
+ require 'active_support/inflector'
7
+
8
+ require 'watir/generator/base/generator'
9
+ require 'watir/generator/base/idl_sorter'
10
+ require 'watir/generator/base/spec_extractor'
11
+ require 'watir/generator/base/util'
12
+ require 'watir/generator/base/visitor'
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Generator
5
+ class HTML < Base
6
+ private
7
+
8
+ def ignored_tags
9
+ %w[link]
10
+ end
11
+
12
+ def ignored_interfaces
13
+ ignored = ignored_tags.map { |tag| "HTML#{tag.capitalize}Element" }
14
+ # frame is implemented manually, see https://github.com/watir/watir/issues/204
15
+ ignored << 'HTMLFrameElement'
16
+ end
17
+
18
+ def ignored_attributes
19
+ %w[cells elements hash rows span text size selected? style
20
+ width height tHead tFoot link options selected caption]
21
+ end
22
+
23
+ def generator_implementation
24
+ 'HTML'
25
+ end
26
+
27
+ def visitor_class
28
+ HTML::Visitor
29
+ end
30
+
31
+ def extractor_class
32
+ HTML::SpecExtractor
33
+ end
34
+ end # Generator
35
+ end # HTML
36
+ end # Watir
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Generator
5
+ class HTML
6
+ class SpecExtractor < Base::SpecExtractor
7
+ private
8
+
9
+ def extract_interface_map
10
+ # http://www.whatwg.org/specs/web-apps/current-work/#elements-1
11
+ table = @doc.search("//h3[@id='index-elements']/following-sibling::table[1]").first
12
+ table || raise('could not find index-elements table')
13
+
14
+ @interface_map = {}
15
+
16
+ parse_table(table).each do |row|
17
+ row['Element'].split(', ').each { |tag| @interface_map[tag] = row['Interface'] }
18
+ end
19
+ end
20
+
21
+ def build_result
22
+ {}.tap do |result|
23
+ @interface_map.each do |tag, interface|
24
+ result[tag] = fetch_interface(interface)
25
+ end
26
+
27
+ # missing from the elements-1 table
28
+ result['frameset'] = fetch_interface('HTMLFrameSetElement')
29
+ end
30
+ end
31
+
32
+ def parse_table(table)
33
+ headers = table.css('thead th').map { |e| e.inner_text.strip }
34
+
35
+ table.css('tbody tr').map do |row|
36
+ result = {}
37
+
38
+ row.css('th, td').each_with_index do |node, idx|
39
+ result[headers[idx]] = node.inner_text.strip
40
+ end
41
+
42
+ result
43
+ end
44
+ end
45
+
46
+ def issued_interfaces
47
+ []
48
+ end
49
+ end # SpecExtractor
50
+ end # HTML
51
+ end # Generator
52
+ end # Watir
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Generator
5
+ class HTML
6
+ class Visitor < Base::Visitor
7
+ def classify_regexp
8
+ /^HTML(.+)Element$/
9
+ end
10
+
11
+ private
12
+
13
+ def interface_regexp
14
+ /^HTML/
15
+ end
16
+
17
+ def force_inheritance
18
+ {'HTMLElement' => 'Element'}
19
+ end
20
+ end # Visitor
21
+ end # HTML
22
+ end # Generator
23
+ end # Watir
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ ActiveSupport::Inflector.inflections do |inflect|
4
+ inflect.plural 'body', 'bodys'
5
+ inflect.plural 'tbody', 'tbodys'
6
+ inflect.plural 'canvas', 'canvases'
7
+ inflect.plural 'ins', 'inses'
8
+ inflect.plural(/^s$/, 'ss')
9
+ inflect.plural 'meta', 'metas'
10
+ inflect.plural 'details', 'detailses'
11
+ inflect.plural 'data', 'datas'
12
+ inflect.plural 'datalist', 'datalists'
13
+ end
14
+
15
+ require 'watir/generator/html/generator'
16
+ require 'watir/generator/html/spec_extractor'
17
+ require 'watir/generator/html/visitor'
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Generator
5
+ class SVG < Base
6
+ private
7
+
8
+ # fix collisions with HTML
9
+ #
10
+ # TODO: change generator so instead these classes
11
+ # are inherited from HTML ones
12
+
13
+ def ignored_tags
14
+ %w[a audio canvas iframe image script source style text title track video unknown]
15
+ end
16
+
17
+ def ignored_interfaces
18
+ ignored_tags.map { |tag| "SVG#{tag.capitalize}Element" }
19
+ end
20
+
21
+ def ignored_attributes
22
+ []
23
+ end
24
+
25
+ def generator_implementation
26
+ 'SVG'
27
+ end
28
+
29
+ def visitor_class
30
+ SVG::Visitor
31
+ end
32
+
33
+ def extractor_class
34
+ SVG::SpecExtractor
35
+ end
36
+ end # SVG
37
+ end # Generator
38
+ end # Watir