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,580 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe Browser, exclude: {browser: :ie, reason: 'Cannot call #restore!'} do
7
+ before do
8
+ browser.goto WatirSpec.url_for('window_switching.html')
9
+ browser.a(id: 'open').click
10
+ browser.windows.wait_until(size: 2)
11
+ end
12
+
13
+ after do
14
+ browser.windows.restore!
15
+ end
16
+
17
+ describe '#windows' do
18
+ it 'returns a WindowCollection' do
19
+ expect(browser.windows).to be_a(WindowCollection)
20
+ end
21
+
22
+ it 'stores Window instances' do
23
+ expect(browser.windows(title: 'closeable window')).to all(be_a(Window))
24
+ end
25
+
26
+ it 'filters windows to match the given selector' do
27
+ expect(browser.windows(title: 'closeable window').size).to eq 1
28
+ end
29
+
30
+ it 'raises ArgumentError if the selector is invalid' do
31
+ expect { browser.windows(name: 'foo') }.to raise_error(ArgumentError)
32
+ end
33
+
34
+ it 'returns an empty array if no window matches the selector' do
35
+ expect(browser.windows(title: 'noop')).to be_empty
36
+ end
37
+ end
38
+
39
+ describe '#window' do
40
+ it 'finds window by :url' do
41
+ expect(browser.window(url: /closeable\.html/).use).to be_a(Window)
42
+ end
43
+
44
+ it 'finds window by :title' do
45
+ expect(browser.window(title: 'closeable window').use).to be_a(Window)
46
+ end
47
+
48
+ it 'finds window by :element' do
49
+ expect(browser.window(element: browser.a(id: 'close')).use).to be_a(Window)
50
+ end
51
+
52
+ it 'finds window by multiple values' do
53
+ expect(browser.window(title: 'closeable window', url: /closeable\.html/).use).to be_a(Window)
54
+ end
55
+
56
+ it 'does not find incorrect handle' do
57
+ expect(browser.window(handle: 'bar')).not_to be_present
58
+ end
59
+
60
+ it 'returns the current window if no argument is given' do
61
+ expect(browser.window.url).to match(/window_switching\.html/)
62
+ end
63
+
64
+ it 'stores the reference to a window when no argument is given' do
65
+ original_window = browser.window
66
+ browser.window(title: 'closeable window').use
67
+ expect(original_window.url).to match(/window_switching\.html/)
68
+ end
69
+
70
+ it 'executes the given block in the window',
71
+ except: {browser: :safari,
72
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'} do
73
+ browser.window(title: 'closeable window') do
74
+ link = browser.a(id: 'close')
75
+ expect(link).to exist
76
+ link.click
77
+ end
78
+
79
+ expect { browser.windows.wait_until(size: 1) }.not_to raise_error
80
+ end
81
+
82
+ it 'raises ArgumentError if the selector is invalid' do
83
+ expect { browser.window(name: 'foo') }.to raise_error(ArgumentError)
84
+ end
85
+
86
+ it 'raises a NoMatchingWindowFoundException error if no window matches the selector' do
87
+ expect { browser.window(title: 'noop').use }.to raise_no_matching_window_exception
88
+ end
89
+
90
+ it 'raises NoMatchingWindowFoundException error when attempting to use a window with an incorrect handle' do
91
+ expect { browser.window(handle: 'bar').use }.to raise_no_matching_window_exception
92
+ end
93
+ end
94
+
95
+ describe '#switch_window' do
96
+ it 'stays on the same window when matches single window' do
97
+ browser.switch_window
98
+ browser.window.close
99
+ browser.original_window.use
100
+
101
+ title = browser.title
102
+ expect { browser.window(title: title).use }.not_to raise_exception
103
+ end
104
+
105
+ it 'switches to second window' do
106
+ original_window = browser.window
107
+ browser.switch_window
108
+ new_window = browser.window
109
+
110
+ expect(original_window).not_to eq new_window
111
+ expect(browser.windows).to include(original_window, new_window)
112
+ end
113
+
114
+ it 'returns an instance of Window' do
115
+ expect(browser.switch_window).to be_a(Window)
116
+ end
117
+
118
+ it 'times out if there is no second window' do
119
+ browser.windows.restore!
120
+ message = /waiting for true condition on (.*) title="window switching">$/
121
+ expect { browser.switch_window }.to raise_timeout_exception(message)
122
+ end
123
+
124
+ it 'provides previous window value to #original_window' do
125
+ browser.switch_window
126
+ expect(browser.original_window).not_to be_nil
127
+ end
128
+
129
+ it 'waits for second window' do
130
+ browser.windows.restore!
131
+ expect {
132
+ browser.a(id: 'delayed').click
133
+ browser.switch_window
134
+ }.to execute_when_satisfied(min: 1)
135
+ end
136
+ end
137
+ end
138
+
139
+ describe Window, exclude: {browser: :ie, reason: 'Cannot call #restore!'} do
140
+ after do
141
+ browser.windows.restore!
142
+ end
143
+
144
+ context 'when using multiple windows' do
145
+ before do
146
+ browser.goto WatirSpec.url_for('window_switching.html')
147
+ browser.a(id: 'open').click
148
+ browser.windows.wait_until(size: 2)
149
+ browser.wait_until { |b| !b.window(title: 'about:blank').exist? }
150
+ end
151
+
152
+ it 'allows actions on first window after opening second',
153
+ except: {browser: :safari, reason: 'Focus is on newly opened window instead of the first'} do
154
+ browser.a(id: 'open').click
155
+
156
+ expect { browser.windows.wait_until(size: 3) }.not_to raise_timeout_exception
157
+ end
158
+
159
+ describe '#close' do
160
+ it 'closes a window' do
161
+ browser.window(title: 'window switching').use
162
+ browser.a(id: 'open').click
163
+ browser.windows.wait_until(size: 3)
164
+
165
+ described_class.new(browser, title: 'closeable window').close
166
+
167
+ expect { browser.windows.wait_until(size: 2) }.not_to raise_timeout_exception
168
+ end
169
+
170
+ it 'closes the current window',
171
+ except: {browser: :safari},
172
+ reason: 'Focus is on newly opened window instead of the first' do
173
+ browser.a(id: 'open').click
174
+ browser.windows.wait_until(size: 3)
175
+
176
+ described_class.new(browser, title: 'closeable window').use.close
177
+
178
+ expect { browser.windows.wait_until(size: 2) }.not_to raise_timeout_exception
179
+ end
180
+ end
181
+
182
+ describe '#use' do
183
+ it 'switches to the window' do
184
+ described_class.new(browser, title: 'closeable window').use
185
+ expect(browser.title).to eq 'closeable window'
186
+ end
187
+ end
188
+
189
+ describe '#current?' do
190
+ it 'returns true if it is the current window' do
191
+ expect(described_class.new(browser, title: browser.title)).to be_current
192
+ end
193
+
194
+ it 'returns false if it is not the current window' do
195
+ expect(described_class.new(browser, title: 'closeable window')).not_to be_current
196
+ end
197
+ end
198
+
199
+ describe '#title' do
200
+ it 'returns the title of the window' do
201
+ browser.wait_while { |b| b.window(title: /^$/).exists? }
202
+ titles = browser.windows.map(&:title)
203
+
204
+ expect(titles).to include 'window switching', 'closeable window'
205
+ end
206
+ end
207
+
208
+ describe '#url' do
209
+ it 'returns the url of the window' do
210
+ urls = browser.windows.map(&:url)
211
+
212
+ expect(urls).to(include(/window_switching\.html/, /closeable\.html$/))
213
+ end
214
+ end
215
+
216
+ describe '#eql?' do
217
+ it 'knows when two windows are equal' do
218
+ win1 = described_class.new browser, {}
219
+ win2 = described_class.new browser, title: 'window switching'
220
+
221
+ expect(win1).to eq win2
222
+ end
223
+
224
+ it 'knows when two windows are not equal' do
225
+ win1 = described_class.new browser, title: 'closeable window'
226
+ win2 = described_class.new browser, title: 'window switching'
227
+
228
+ expect(win1).not_to eq win2
229
+ end
230
+ end
231
+
232
+ describe '#handle' do
233
+ it 'does not find if not matching' do
234
+ expect(browser.window(title: 'noop').handle).to be_nil
235
+ end
236
+
237
+ it 'finds window by :url' do
238
+ expect(browser.window(url: /closeable\.html/).handle).not_to be_nil
239
+ end
240
+
241
+ it 'finds window by :title' do
242
+ expect(browser.window(title: 'closeable window').handle).not_to be_nil
243
+ end
244
+
245
+ it 'finds window by :element' do
246
+ expect(browser.window(element: browser.a(id: 'close')).handle).not_to be_nil
247
+ end
248
+
249
+ it 'finds window by multiple values' do
250
+ expect(browser.window(url: /closeable\.html/, title: 'closeable window').handle).not_to be_nil
251
+ end
252
+ end
253
+ end
254
+
255
+ context 'with a closed window',
256
+ except: {browser: :safari,
257
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'} do
258
+ before do
259
+ @original_window = browser.window
260
+ browser.goto WatirSpec.url_for('window_switching.html')
261
+ browser.a(id: 'open').click
262
+ browser.windows.wait_until(size: 2)
263
+ @handles = browser.driver.window_handles
264
+ @closed_window = browser.window(title: 'closeable window').use
265
+ browser.a(id: 'close').click
266
+ browser.windows.wait_until(size: 1)
267
+ end
268
+
269
+ describe '#exists?' do
270
+ it 'returns false if previously referenced window is closed' do
271
+ expect(@closed_window).not_to be_present
272
+ end
273
+
274
+ it 'returns false if closed window is referenced' do
275
+ expect(browser.window).not_to exist
276
+ end
277
+ end
278
+
279
+ describe '#current?' do
280
+ it 'returns false if the referenced window is closed' do
281
+ expect(@original_window).not_to be_current
282
+ end
283
+ end
284
+
285
+ describe '#eql?' do
286
+ it 'returns false when checking equivalence to a closed window' do
287
+ expect(browser.window).not_to eq @closed_widow
288
+ end
289
+ end
290
+
291
+ describe '#use' do
292
+ it 'raises NoMatchingWindowFoundException error when attempting to use a referenced window that is closed' do
293
+ expect { @closed_window.use }.to raise_no_matching_window_exception
294
+ end
295
+
296
+ it 'raises NoMatchingWindowFoundException error when attempting to use the current window if it is closed' do
297
+ expect { browser.window.use }.to raise_no_matching_window_exception
298
+ end
299
+ end
300
+
301
+ it 'raises an exception when using an element on a closed window',
302
+ exclude: {browser: :firefox,
303
+ platform: :windows,
304
+ reason: 'https://github.com/mozilla/geckodriver/issues/1847'} do
305
+ msg = 'browser window was closed'
306
+ expect { browser.a.text }.to raise_exception(Exception::NoMatchingWindowFoundException, msg)
307
+ end
308
+
309
+ it 'raises an exception when locating a closed window' do
310
+ expect { browser.window(title: 'closeable window').use }.to raise_no_matching_window_exception
311
+ end
312
+ end
313
+
314
+ context 'with a closed window on a delay' do
315
+ it 'raises an exception when locating a window closed during lookup' do
316
+ browser.goto WatirSpec.url_for('window_switching.html')
317
+ browser.a(id: 'open').click
318
+ browser.windows.wait_until(size: 2)
319
+ browser.window(title: 'closeable window').use
320
+ browser.a(id: 'close-delay').click
321
+ allow(browser).to receive(:title).and_invoke(-> { sleep(0.5) && browser.wd.title })
322
+
323
+ expect { browser.window(title: 'closeable window').use }.to raise_no_matching_window_exception
324
+ end
325
+ end
326
+
327
+ context 'with current window closed',
328
+ except: {browser: :safari,
329
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'} do
330
+ before do
331
+ browser.goto WatirSpec.url_for('window_switching.html')
332
+ browser.a(id: 'open').click
333
+ browser.windows.wait_until(size: 2)
334
+ browser.window(title: 'closeable window').use
335
+ browser.a(id: 'close').click
336
+ browser.windows.wait_until(size: 1)
337
+ end
338
+
339
+ describe '#present?' do
340
+ it 'finds window by url' do
341
+ expect(browser.window(url: /window_switching\.html/)).to be_present
342
+ end
343
+
344
+ it 'finds window by title' do
345
+ expect(browser.window(title: 'window switching')).to be_present
346
+ end
347
+
348
+ it 'finds window by element' do
349
+ expect(browser.window(element: browser.link(id: 'open'))).to be_present
350
+ end
351
+ end
352
+
353
+ describe '#use' do
354
+ context 'when switching windows without blocks' do
355
+ it 'by url' do
356
+ browser.window(url: /window_switching\.html/).use
357
+ expect(browser.title).to be == 'window switching'
358
+ end
359
+
360
+ it 'by title' do
361
+ browser.window(title: 'window switching').use
362
+ expect(browser.url).to match(/window_switching\.html/)
363
+ end
364
+
365
+ it 'by element' do
366
+ browser.window(element: browser.link(id: 'open')).use
367
+ expect(browser.url).to match(/window_switching\.html/)
368
+ end
369
+ end
370
+
371
+ context 'when switching windows with blocks' do
372
+ it 'by url' do
373
+ browser.window(url: /window_switching\.html/).use { expect(browser.title).to be == 'window switching' }
374
+ end
375
+
376
+ it 'by title' do
377
+ browser.window(title: 'window switching').use { expect(browser.url).to match(/window_switching\.html/) }
378
+ end
379
+
380
+ it 'by element' do
381
+ element = browser.link(id: 'open')
382
+ browser.window(element: element).use { expect(browser.url).to match(/window_switching\.html/) }
383
+ end
384
+ end
385
+ end
386
+ end
387
+
388
+ context 'when manipulating size and position', except: {headless: true} do
389
+ before(:all) do
390
+ maximized_size = browser.window.size
391
+
392
+ browser.window.resize_to(
393
+ maximized_size.width - 100,
394
+ maximized_size.height - 100
395
+ )
396
+ browser.wait_until { |b| b.window.size != maximized_size }
397
+
398
+ current_position = browser.window.position
399
+
400
+ browser.window.move_to(
401
+ current_position.x + 40,
402
+ current_position.y + 40
403
+ )
404
+ browser.wait_until { |b| b.window.position != current_position }
405
+
406
+ @initial_size = browser.window.size
407
+ @initial_position = browser.window.position
408
+ end
409
+
410
+ before do
411
+ browser.goto WatirSpec.url_for('window_switching.html')
412
+ end
413
+
414
+ after do
415
+ browser.window.resize_to @initial_size.width, @initial_size.height
416
+ browser.window.move_to @initial_position.x, @initial_position.y
417
+ end
418
+
419
+ it 'gets the size of the current window' do
420
+ expect(@initial_size.width).to eq browser.execute_script('return window.outerWidth;')
421
+ expect(@initial_size.height).to eq browser.execute_script('return window.outerHeight;')
422
+ end
423
+
424
+ it 'gets the position of the current window' do
425
+ expect(@initial_position.x).to eq browser.execute_script('return window.screenX;')
426
+ expect(@initial_position.y).to eq browser.execute_script('return window.screenY;')
427
+ end
428
+
429
+ it 'resizes the window' do
430
+ browser.window.resize_to(
431
+ @initial_size.width - 20,
432
+ @initial_size.height - 20
433
+ )
434
+
435
+ browser.wait_until { |b| b.window.size != @initial_size }
436
+
437
+ new_size = browser.window.size
438
+ expect(new_size.width).to eq @initial_size.width - 20
439
+ expect(new_size.height).to eq @initial_size.height - 20
440
+ end
441
+
442
+ it 'moves the window' do
443
+ browser.window.move_to(
444
+ @initial_position.x + 5,
445
+ @initial_position.y + 5
446
+ )
447
+
448
+ browser.wait_until { |b| b.window.position != @initial_position }
449
+
450
+ new_position = browser.window.position
451
+ expect(new_position.x).to eq @initial_position.x + 5
452
+ expect(new_position.y).to eq @initial_position.y + 5
453
+ end
454
+
455
+ it 'maximizes the window' do
456
+ browser.window.maximize
457
+ browser.wait_until { |b| b.window.size != @initial_size }
458
+
459
+ new_size = browser.window.size
460
+ expect(new_size.width).to be >= @initial_size.width
461
+ expect(new_size.height).to be > @initial_size.height
462
+ end
463
+
464
+ it 'makes the window full screen' do
465
+ browser.window.full_screen
466
+ browser.wait_until { |b| b.window.size != @initial_size }
467
+
468
+ new_size = browser.window.size
469
+ expect(new_size.width).to be >= @initial_size.width
470
+ expect(new_size.height).to be > @initial_size.height
471
+ end
472
+
473
+ it 'minimizes the window' do
474
+ expect(browser.execute_script('return document.visibilityState;')).to eq 'visible'
475
+
476
+ browser.window.minimize
477
+
478
+ browser.wait_until { |b| !%w[visible normal].include?(b.execute_script('return document.visibilityState;')) }
479
+
480
+ expect(browser.execute_script('return document.visibilityState;')).to eq 'hidden'
481
+ browser.window.maximize
482
+ end
483
+ end
484
+ end
485
+
486
+ describe WindowCollection, exclude: {browser: :ie, reason: 'Cannot call #restore!'} do
487
+ before do
488
+ browser.goto WatirSpec.url_for('window_switching.html')
489
+ browser.a(id: 'open').click
490
+ browser.windows.wait_until(size: 2)
491
+ end
492
+
493
+ after do
494
+ browser.windows.restore!
495
+ end
496
+
497
+ describe '#to_a' do
498
+ it 'raises exception' do
499
+ expect {
500
+ described_class.new(browser).to_a
501
+ }.to raise_exception(NoMethodError, 'indexing not reliable on WindowCollection')
502
+ end
503
+ end
504
+
505
+ describe '#new' do
506
+ it 'returns all windows by default' do
507
+ windows = described_class.new(browser)
508
+
509
+ expect(windows.size).to eq 2
510
+ end
511
+
512
+ it 'filters available windows by url' do
513
+ windows = described_class.new(browser, url: /closeable\.html/)
514
+
515
+ expect(windows.size).to eq 1
516
+ end
517
+
518
+ it 'filters available windows by title' do
519
+ windows = described_class.new(browser, title: /closeable/)
520
+
521
+ expect(windows.size).to eq 1
522
+ end
523
+
524
+ it 'filters available windows by element' do
525
+ windows = described_class.new(browser, element: browser.element(id: 'close'))
526
+
527
+ expect(windows.size).to eq 1
528
+ end
529
+
530
+ it 'raises ArgumentError if unrecognized locator' do
531
+ expect {
532
+ described_class.new(browser, foo: /closeable/)
533
+ }.to raise_error(ArgumentError)
534
+ end
535
+ end
536
+
537
+ describe '#size' do
538
+ it 'counts the number of matching windows' do
539
+ expect(described_class.new(browser).size).to eq 2
540
+ end
541
+ end
542
+
543
+ describe '#eq?' do
544
+ it 'compares the equivalence of window handles' do
545
+ windows1 = described_class.new(browser, title: //)
546
+ windows2 = described_class.new(browser, url: //)
547
+
548
+ expect(windows1).to eq windows2
549
+ end
550
+ end
551
+
552
+ describe '#reset!' do
553
+ it 'clears window list' do
554
+ wins = browser.windows
555
+ expect(wins.size).to eq 2
556
+ wins.reset!
557
+ expect(wins.instance_variable_get(:@window_list)).to be_nil
558
+ end
559
+ end
560
+
561
+ describe '#restore!' do
562
+ it 'when on other window',
563
+ except: {browser: :safari, reason: 'Focus is on newly opened window instead of the first'} do
564
+ browser.a(id: 'open').click
565
+ browser.windows.wait_until(size: 3)
566
+ browser.window(title: 'closeable window').use
567
+
568
+ browser.windows.restore!
569
+ expect(browser.windows.size).to eq 1
570
+ expect(browser.title).to eq 'window switching'
571
+ end
572
+
573
+ it 'when browser closed does not raise exception' do
574
+ browser.close
575
+
576
+ expect { browser.windows.restore! }.not_to raise_exception
577
+ end
578
+ end
579
+ end
580
+ end