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,276 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class Window
5
+ include Waitable
6
+ include Exception
7
+
8
+ attr_reader :browser
9
+
10
+ def initialize(browser, selector = {})
11
+ @browser = browser
12
+ @driver = browser.driver
13
+ @selector = selector
14
+
15
+ if selector.empty?
16
+ @handle = current_window
17
+ elsif selector.key? :handle
18
+ @handle = selector.delete :handle
19
+ else
20
+ types = %i[title url element]
21
+ return if selector.keys.all? { |k| types.include? k }
22
+
23
+ raise ArgumentError, "invalid window selector: #{selector_string}"
24
+ end
25
+ end
26
+
27
+ def inspect
28
+ format('#<%<class>s:0x%<hash>x located=%<handle>s>',
29
+ class: self.class, hash: hash * 2, handle: !!@handle)
30
+ end
31
+
32
+ #
33
+ # Returns window size.
34
+ #
35
+ # @example
36
+ # size = browser.window.size
37
+ # [size.width, size.height] #=> [1600, 1200]
38
+ #
39
+
40
+ def size
41
+ use { return @driver.manage.window.size }
42
+ end
43
+
44
+ #
45
+ # Returns window position.
46
+ #
47
+ # @example
48
+ # position = browser.window.position
49
+ # [position.x, position.y] #=> [92, 76]
50
+ #
51
+
52
+ def position
53
+ use { return @driver.manage.window.position }
54
+ end
55
+
56
+ #
57
+ # Resizes window to given width and height.
58
+ #
59
+ # @example
60
+ # browser.window.resize_to 1600, 1200
61
+ #
62
+ # @param [Integer] width
63
+ # @param [Integer] height
64
+ #
65
+
66
+ def resize_to(width, height)
67
+ Selenium::WebDriver::Dimension.new(Integer(width), Integer(height)).tap do |dimension|
68
+ use { @driver.manage.window.size = dimension }
69
+ end
70
+ end
71
+
72
+ #
73
+ # Moves window to given x and y coordinates.
74
+ #
75
+ # @example
76
+ # browser.window.move_to 300, 200
77
+ #
78
+ # @param [Integer] x_coord
79
+ # @param [Integer] y_coord
80
+ #
81
+
82
+ def move_to(x_coord, y_coord)
83
+ Selenium::WebDriver::Point.new(Integer(x_coord), Integer(y_coord)).tap do |point|
84
+ use { @driver.manage.window.position = point }
85
+ end
86
+ end
87
+
88
+ #
89
+ # Maximizes window.
90
+ #
91
+ # @example
92
+ # browser.window.maximize
93
+ #
94
+
95
+ def maximize
96
+ use { @driver.manage.window.maximize }
97
+ end
98
+
99
+ #
100
+ # Minimize window.
101
+ #
102
+ # @example
103
+ # browser.window.minimize
104
+ #
105
+
106
+ def minimize
107
+ use { @driver.manage.window.minimize }
108
+ end
109
+
110
+ #
111
+ # Make window full screen.
112
+ #
113
+ # @example
114
+ # browser.window.full_screen
115
+ #
116
+
117
+ def full_screen
118
+ use { @driver.manage.window.full_screen }
119
+ end
120
+
121
+ #
122
+ # Returns true if window exists.
123
+ #
124
+ # @return [Boolean]
125
+ #
126
+
127
+ def exists?
128
+ assert_exists
129
+ true
130
+ rescue NoMatchingWindowFoundException
131
+ false
132
+ end
133
+
134
+ alias present? exists?
135
+ alias exist? exists?
136
+
137
+ #
138
+ # Returns true if two windows are equal.
139
+ #
140
+ # @example
141
+ # browser.window(title: /window_switching/) == browser.window(/closeable/)
142
+ # #=> false
143
+ #
144
+ # @param [Window] other
145
+ #
146
+
147
+ def ==(other)
148
+ return false unless other.is_a?(self.class)
149
+
150
+ handle == other.handle
151
+ end
152
+ alias eql? ==
153
+
154
+ def hash
155
+ [handle, self.class].hash
156
+ end
157
+
158
+ #
159
+ # Returns true if window is current.
160
+ #
161
+ # @example
162
+ # browser.window.current?
163
+ # #=> true
164
+ #
165
+
166
+ def current?
167
+ current_window == handle
168
+ end
169
+
170
+ #
171
+ # Closes window.
172
+ #
173
+
174
+ def close
175
+ @browser.original_window = nil if self == @browser.original_window
176
+ use { @driver.close }
177
+ end
178
+
179
+ #
180
+ # Returns window title.
181
+ #
182
+ # @return [String]
183
+ #
184
+
185
+ def title
186
+ use { return @driver.title }
187
+ end
188
+
189
+ #
190
+ # Returns window URL.
191
+ #
192
+ # @return [String]
193
+ #
194
+
195
+ def url
196
+ use { return @driver.current_url }
197
+ end
198
+
199
+ #
200
+ # Switches to given window and executes block, then switches back.
201
+ #
202
+ # @example
203
+ # browser.window(title: "closeable window").use do
204
+ # browser.a(id: "close").click
205
+ # end
206
+ #
207
+
208
+ def use
209
+ wait_for_exists
210
+ cache_current = current_window
211
+ @browser.original_window ||= cache_current
212
+ restore_to = unless cache_current == handle
213
+ @driver.switch_to.window(handle)
214
+ cache_current
215
+ end
216
+ if block_given?
217
+ begin
218
+ yield
219
+ ensure
220
+ @driver.switch_to.window(restore_to) if restore_to
221
+ end
222
+ end
223
+ self
224
+ end
225
+
226
+ #
227
+ # @api private
228
+ #
229
+
230
+ def selector_string
231
+ @selector.inspect
232
+ end
233
+
234
+ def handle
235
+ @handle ||= locate
236
+ end
237
+
238
+ private
239
+
240
+ def locate
241
+ @selector.empty? ? nil : @driver.window_handles.find { |wh| matches?(wh) }
242
+ end
243
+
244
+ def assert_exists
245
+ return if !handle.nil? && @driver.window_handles.include?(handle)
246
+
247
+ raise(NoMatchingWindowFoundException, selector_string)
248
+ end
249
+
250
+ # return a handle to the currently active window if it is still open; otherwise nil
251
+ def current_window
252
+ @driver.window_handle
253
+ rescue Selenium::WebDriver::Error::NoSuchWindowError
254
+ nil
255
+ end
256
+
257
+ def matches?(handle)
258
+ @driver.switch_to.window(handle) do
259
+ matches_title = @selector[:title].nil? || @browser.title =~ /#{@selector[:title]}/
260
+ matches_url = @selector[:url].nil? || @browser.url =~ /#{@selector[:url]}/
261
+ matches_element = @selector[:element].nil? || @selector[:element].exists?
262
+
263
+ matches_title && matches_url && matches_element
264
+ end
265
+ rescue Selenium::WebDriver::Error::NoSuchWindowError
266
+ # the window may disappear while we're iterating.
267
+ false
268
+ end
269
+
270
+ def wait_for_exists
271
+ wait_until(&:exists?)
272
+ rescue Wait::TimeoutError
273
+ raise NoMatchingWindowFoundException, selector_string
274
+ end
275
+ end # Window
276
+ end # Watir
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class WindowCollection
5
+ include Enumerable
6
+ include Waitable
7
+
8
+ def initialize(browser, selector = {})
9
+ types = %i[title url element]
10
+ unless selector.keys.all? { |k| types.include? k }
11
+ raise ArgumentError, "invalid window selector: #{selector.inspect}"
12
+ end
13
+
14
+ @browser = browser
15
+ @selector = selector
16
+ end
17
+
18
+ #
19
+ # Yields each window in collection.
20
+ #
21
+ # @yieldparam [Watir::Window]
22
+ #
23
+
24
+ def each(&blk)
25
+ reset!
26
+ window_list.each(&blk)
27
+ end
28
+
29
+ alias length count
30
+ alias size count
31
+ alias empty? none?
32
+
33
+ def [](*)
34
+ raise NoMethodError, 'indexing not reliable on WindowCollection'
35
+ end
36
+ alias first []
37
+ alias last []
38
+ alias to_a []
39
+
40
+ def ==(other)
41
+ window_list == other.send(:window_list)
42
+ end
43
+ alias eql? ==
44
+
45
+ def restore!
46
+ return if @browser.closed?
47
+
48
+ window_list.reject { |win| win.handle == @browser.original_window.handle }.each(&:close)
49
+ @browser.original_window.use
50
+ rescue StandardError
51
+ @browser.close
52
+ end
53
+
54
+ def reset!
55
+ @window_list = nil
56
+ end
57
+
58
+ private
59
+
60
+ def window_list
61
+ @window_list ||= begin
62
+ handles = @browser.driver.window_handles.select { |wh| matches?(wh) }
63
+ handles.map { |wh| Window.new(@browser, handle: wh) }
64
+ end
65
+ end
66
+
67
+ # NOTE: This is the exact same code from `Window#matches?`
68
+ # TODO: Move this code into a separate WindowLocator class
69
+ def matches?(handle)
70
+ @selector.empty? || @browser.driver.switch_to.window(handle) do
71
+ matches_title = @selector[:title].nil? || @browser.title =~ /#{@selector[:title]}/
72
+ matches_url = @selector[:url].nil? || @browser.url =~ /#{@selector[:url]}/
73
+ matches_element = @selector[:element].nil? || @selector[:element].exists?
74
+
75
+ matches_title && matches_url && matches_element
76
+ end
77
+ rescue Selenium::WebDriver::Error::NoSuchWindowError
78
+ # the window may disappear while we're iterating.
79
+ false
80
+ end
81
+ end # Window
82
+ end # Watir
data/lib/watir.rb ADDED
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'net/http'
4
+ require 'selenium-webdriver'
5
+ require 'time'
6
+
7
+ require 'watir/search_context'
8
+ require 'watir/scroll'
9
+ require 'watir/wait'
10
+ require 'watir/exception'
11
+ require 'watir/window'
12
+ require 'watir/window_collection'
13
+ require 'watir/has_window'
14
+ require 'watir/adjacent'
15
+ require 'watir/js_execution'
16
+ require 'watir/alert'
17
+ require 'watir/js_snippets'
18
+ require 'watir/container'
19
+ require 'watir/cookies'
20
+ require 'watir/http_client'
21
+ require 'watir/capabilities'
22
+ require 'watir/navigation'
23
+ require 'watir/browser'
24
+ require 'watir/screenshot'
25
+ require 'watir/after_hooks'
26
+ require 'watir/logger'
27
+ require 'watir/version'
28
+
29
+ module Watir
30
+ class << self
31
+ attr_writer :default_timeout
32
+
33
+ #
34
+ # Default wait time for wait methods.
35
+ #
36
+
37
+ def default_timeout
38
+ @default_timeout ||= 30
39
+ end
40
+
41
+ #
42
+ # @api private
43
+ #
44
+
45
+ def tag_to_class
46
+ @tag_to_class ||= {}
47
+ end
48
+
49
+ #
50
+ # @api private
51
+ #
52
+
53
+ def element_class_for(tag_name)
54
+ tag_to_class[tag_name.to_sym] || HTMLElement
55
+ end
56
+ end
57
+
58
+ #
59
+ # Returns logger instance that can be used across the whole Selenium.
60
+ #
61
+ # @return [Logger]
62
+ #
63
+
64
+ def self.logger
65
+ @logger ||= Logger.new
66
+ end
67
+ end
68
+ require 'watir/locators'
69
+
70
+ require 'watir/attribute_helper'
71
+ require 'watir/row_container'
72
+ require 'watir/cell_container'
73
+ require 'watir/user_editable'
74
+ require 'watir/element_collection'
75
+ require 'watir/elements/element'
76
+
77
+ require 'watir/elements/html_elements'
78
+ require 'watir/elements/svg_elements'
79
+
80
+ require 'watir/elements/button'
81
+ require 'watir/elements/cell'
82
+ require 'watir/elements/checkbox'
83
+ require 'watir/elements/date_field'
84
+ require 'watir/elements/date_time_field'
85
+ require 'watir/elements/dlist'
86
+ require 'watir/elements/file_field'
87
+ require 'watir/elements/font'
88
+ require 'watir/elements/form'
89
+ require 'watir/elements/iframe'
90
+ require 'watir/elements/hidden'
91
+ require 'watir/elements/image'
92
+ require 'watir/elements/link'
93
+ require 'watir/elements/list'
94
+ require 'watir/elements/option'
95
+ require 'watir/elements/radio'
96
+ require 'watir/elements/row'
97
+ require 'watir/elements/select'
98
+ require 'watir/elements/table'
99
+ require 'watir/elements/table_cell'
100
+ require 'watir/elements/table_row'
101
+ require 'watir/elements/table_section'
102
+ require 'watir/elements/text_area'
103
+ require 'watir/elements/text_field'
104
+ require 'watir/elements/input'
105
+ require 'watir/radio_set'
106
+ require 'watir/shadow_root'
107
+
108
+ require 'watir/aliases'
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WatirSpec
4
+ module Guards
5
+ class << self
6
+ def guards
7
+ @guards ||= Hash.new { |hash, key| hash[key] = [] }
8
+ end
9
+
10
+ def record(guard_name, impls, data)
11
+ guards[impls] << {name: guard_name, data: data}
12
+ end
13
+
14
+ def report
15
+ gs = WatirSpec.implementation.matching_guards_in(guards)
16
+ str = "WatirSpec guards for this implementation: \n"
17
+
18
+ if gs.empty?
19
+ "\tnone."
20
+ else
21
+ gs.each do |guard|
22
+ guard[:data][:file] = guard[:data][:file][%r{/spec/(.*):}, 1]
23
+ guard_name = "#{guard[:name]}:".ljust(15)
24
+ str << " \t#{guard_name} #{guard[:data].inspect}\n"
25
+ end
26
+ Watir.logger.warn str, id: [:guard_names]
27
+ end
28
+ end
29
+ end # class << self
30
+
31
+ private
32
+
33
+ def deviates_on(*impls)
34
+ Guards.record :deviates, impls, file: caller(1..1).first
35
+ return yield if WatirSpec.unguarded?
36
+
37
+ yield if WatirSpec.implementation.matches_guard?(impls)
38
+ end
39
+
40
+ def not_compliant_on(*impls)
41
+ Guards.record :not_compliant, impls, file: caller(1..1).first
42
+ return yield if WatirSpec.unguarded?
43
+
44
+ yield unless WatirSpec.implementation.matches_guard?(impls)
45
+ end
46
+
47
+ def compliant_on(*impls)
48
+ Guards.record :compliant, impls, file: caller(1..1).first
49
+ return yield if WatirSpec.unguarded?
50
+
51
+ yield if WatirSpec.implementation.matches_guard?(impls)
52
+ end
53
+
54
+ def bug(key, *impls)
55
+ Guards.record :bug, impls, file: caller(1..1).first, key: key
56
+ return yield if WatirSpec.unguarded?
57
+
58
+ yield if impls.any? && !WatirSpec.implementation.matches_guard?(impls)
59
+ end
60
+ end
61
+ end
62
+
63
+ class Object
64
+ include WatirSpec::Guards
65
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WatirSpec
4
+ class Implementation
5
+ attr_writer :name, :guard_proc, :browser_class
6
+ attr_accessor :browser_args, :driver_info
7
+
8
+ def initialize
9
+ @guard_proc = nil
10
+ end
11
+
12
+ def initialize_copy(_orig)
13
+ @browser_args = browser_args.map(&:dup)
14
+ end
15
+
16
+ def browser_class
17
+ @browser_class || raise('browser_class not set')
18
+ end
19
+
20
+ def name
21
+ @name || raise('implementation name not set')
22
+ end
23
+
24
+ def browser_name
25
+ browser_args.first == :ie ? :internet_explorer : browser_args.first
26
+ end
27
+
28
+ def matches_guard?(args)
29
+ return @guard_proc.call(args) if @guard_proc
30
+
31
+ args.include? name
32
+ end
33
+
34
+ def matching_guards_in(guards)
35
+ result = []
36
+ guards.each { |args, data| data.each { |d| result << d } if args.empty? || matches_guard?(args) }
37
+
38
+ result
39
+ end
40
+
41
+ def inspect_args
42
+ selenium_opts = browser_args.last.dup
43
+
44
+ options = selenium_opts.delete(:options)
45
+ args = ["#{browser_args.first} tests:\n"]
46
+ selenium_opts.each { |opt| args << "#{opt.inspect}\n" }
47
+
48
+ return "#{browser_args.first} default options" if selenium_opts.empty? && options.nil?
49
+
50
+ args << "\toptions:\n"
51
+ options.each { |k, v| args << "\t\t#{k}: #{v}\n" }
52
+
53
+ args.join
54
+ end
55
+ end # Implementation
56
+ end # WatirSpec
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rake/tasklib'
4
+
5
+ module WatirSpec
6
+ class RakeTasks < Rake::TaskLib
7
+ def initialize
8
+ super
9
+
10
+ namespace :watirspec do
11
+ desc 'Initialize WatirSpec'
12
+ task :init do
13
+ init_watirspec
14
+ print_usage
15
+ end
16
+
17
+ desc 'List WatirSpec examples'
18
+ task :list do
19
+ print_specs
20
+ end
21
+
22
+ desc 'Run WatirSpec examples'
23
+ task :run, %i[spec line] do |_, args|
24
+ run(args)
25
+ end
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def init_watirspec
32
+ FileUtils.mkdir_p('spec')
33
+ return if File.exist?('spec/watirspec_helper.rb')
34
+
35
+ File.write('spec/watirspec_helper.rb', watirspec_helper_template)
36
+ end
37
+
38
+ def print_specs
39
+ puts "The following spec files are present:\n\n"
40
+ spec_files.each do |file|
41
+ filename = file.sub("#{watirspec_path}/", '')
42
+ puts " #{filename}"
43
+ end
44
+ end
45
+
46
+ def run(**args)
47
+ return if system(rspec_command(args))
48
+
49
+ exit $CHILD_STATUS.exitstatus || 1
50
+ end
51
+
52
+ def rspec_command(**args)
53
+ cmd = [rspec_binary]
54
+ if args[:spec]
55
+ spec_file = spec_files.find { |file| file == "#{watirspec_path}/#{args[:spec]}_spec.rb" }
56
+ spec_file << ":#{args[:line]}" if args[:line]
57
+ cmd << spec_file
58
+ else
59
+ cmd << spec_files
60
+ end
61
+
62
+ cmd.join(' ')
63
+ end
64
+
65
+ def spec_files
66
+ Dir.glob("#{watirspec_path}/**/*_spec.rb")
67
+ end
68
+
69
+ def rspec_binary
70
+ rspec_path = Bundler.rubygems.find_name('rspec-core').first.full_gem_path
71
+ "#{rspec_path}/exe/rspec"
72
+ end
73
+
74
+ def watirspec_path
75
+ watir_path = Bundler.rubygems.find_name('watir').first.full_gem_path
76
+ "#{watir_path}/spec/watirspec"
77
+ end
78
+
79
+ def watirspec_helper_template
80
+ <<~RUBY
81
+ require 'watirspec'
82
+ # require your gems
83
+
84
+ WatirSpec.implementation do |watirspec|
85
+ # add WatirSpec implementation (see example below)
86
+ #
87
+ # watirspec.name = :watizzle
88
+ # watirspec.browser_class = Watir::Browser
89
+ # watirspec.browser_args = [:firefox, {}]
90
+ # watirspec.guard_proc = lambda do |args|
91
+ # args.include?(:firefox)
92
+ # end
93
+ end
94
+
95
+ WatirSpec.run!
96
+ RUBY
97
+ end
98
+
99
+ def print_usage
100
+ p <<~PRINT_USAGE
101
+ File spec/watirspec_helper.rb is successfully created!
102
+ Please, check it and customize for your needs. Once done, you can start using WatirSpec.
103
+
104
+ Run all WatirSpec examples:
105
+ $ bundle exec rake watirspec:run
106
+
107
+ Run specific WatirSpec example:
108
+ $ bundle exec rake watirspec:run[elements/div]
109
+
110
+ Run WatirSpec example on a custom line:
111
+ $ bundle exec rake watirspec:run[elements/div, 50]
112
+
113
+ List all WatirSpec examples:
114
+ $ bundle exec rake watirspec:list
115
+ PRINT_USAGE
116
+ end
117
+ end
118
+ end