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,121 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3
+ <head>
4
+ <title>Tables</title>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <script src="javascript/helpers.js" type="text/javascript" charset="utf-8"></script>
7
+ </head>
8
+ <body>
9
+ <div id="messages"></div>
10
+ <h1>Tables</h1>
11
+ <h2>Semantic table</h2>
12
+ <table cellspacing="0" data-locator="top table" cellpadding="5" rules="groups" frame="box" border="1" id="axis_example" summary="Hugh Laurie made more money than Gregory House in both March and April of 2008.">
13
+ <caption>Income tax information for Gregory House and Hugh Laurie</caption>
14
+ <colgroup width="25%" align="left"></colgroup>
15
+ <colgroup width="25%" span="3" align="right"></colgroup>
16
+ <thead id="tax_headers">
17
+ <tr style="border-bottom: 1px solid black;" class="dark" id="thead_row_1" data-locator="thead row">
18
+ <th></th>
19
+ <th id="before_tax" axis="cash" abbr="Before tax">Before income tax</th>
20
+ <th id="tax" axis="cash" abbr="Tax">Income tax</th>
21
+ <th id="after_tax" axis="cash" abbr="After tax">After income tax</th>
22
+ </tr>
23
+ </thead>
24
+ <tfoot id="tax_totals">
25
+ <tr class="dark" id="tfoot_row_1" data-locator="tfoot row">
26
+ <th axis="sum">Sum</th>
27
+ <td headers="before_tax">24 349</td>
28
+ <td headers="tax">5 577</td>
29
+ <td headers="after_tax">18 722</td>
30
+ </tr>
31
+ </tfoot>
32
+ <tbody id="first">
33
+ <tr id="march" data-locator="tbody row">
34
+ <th id="d1" axis="date" scope="rowgroup">March 2008</th>
35
+ <th></th>
36
+ <th></th>
37
+ <th></th>
38
+ </tr>
39
+ <tr id="gregory" class="brick" data-locator="House row">
40
+ <td id="p1" abbr="Dr. House"data-locator="first cell">Gregory House</td>
41
+ <td headers="before_tax p1 d1" data-locator="before tax">5 934</td>
42
+ <td headers="tax p1 d1" data-locator="tax">1 347</td>
43
+ <td id="last" headers="after_tax p1 d1" data-locator="after tax">4 587</td>
44
+ </tr>
45
+ <tr id="hugh">
46
+ <td id="p2" abbr="Laurie" data-locator="hugh">Hugh Laurie</td>
47
+ <td headers="before_tax p2 d1">6 300</td>
48
+ <td headers="tax p2 d1">1 479</td>
49
+ <td headers="after_tax p2 d1">4 821</td>
50
+ </tr>
51
+ </tbody>
52
+ <tbody name="second" id="second">
53
+ <tr>
54
+ <th id="d2" axis="date" scope="rowgroup">April 2008</th>
55
+ <th></th>
56
+ <th></th>
57
+ <th></th>
58
+ </tr>
59
+ <tr>
60
+ <td id="p3" abbr="Dr. House">Gregory House</td>
61
+ <td headers="before_tax p3 d2">5 863</td>
62
+ <td headers="tax p3 d2">1 331</td>
63
+ <td headers="after_tax p3 d2">4 532</td>
64
+ </tr>
65
+ <tr>
66
+ <td id="p4" abbr="Laurie">Hugh Laurie</td>
67
+ <td headers="before_tax p4 d2">6 252</td>
68
+ <td headers="tax p4 d2">1 420</td>
69
+ <td headers="after_tax p4 d2">4 <span id="cell-child">832</span></td>
70
+ </tr>
71
+ </tbody>
72
+ </table>
73
+ <h2>Table inside a table</h2>
74
+ <table border="1" id="outer">
75
+ <tr id="outer_first" data-locator="first row">
76
+ <td>
77
+ Table 1, Row 1, Cell 1
78
+ </td>
79
+ <td>
80
+ Table 1, Row 1, Cell 2
81
+ </td>
82
+ </tr>
83
+ <tr id="outer_second" data-locator="middle row">
84
+ <td id="t1_r2_c1">
85
+ Table 1, Row 2, Cell 1
86
+ </td>
87
+ <td id="t1_r2_c2">
88
+ Table 1, Row 2, Cell 2
89
+ <table border="1" id="inner" onclick="WatirSpec.addMessage('table')">
90
+ <tr id="inner_first" onclick="WatirSpec.addMessage('tr')">
91
+ <td id="t2_r1_c1" onclick="WatirSpec.addMessage('td')">
92
+ Table 2, Row 1, Cell 1
93
+ </td>
94
+ <td>
95
+ Table 2, Row 1, Cell 2
96
+ </td>
97
+ </tr>
98
+ </table>
99
+ </td>
100
+ </tr>
101
+ <tr id="outer_last" data-locator="last row">
102
+ <td>
103
+ Table 1, Row 3, Cell 1
104
+ </td>
105
+ <td>
106
+ Table 1, Row 3, Cell 2
107
+ </td>
108
+ </tr>
109
+ </table>
110
+ <h2>Colspan</h2>
111
+ <table border="1" id="colspan">
112
+ <tr>
113
+ <td colspan="2" id="colspan_2">Colspan 2</td>
114
+ </tr>
115
+ <tr>
116
+ <td id="no_colspan">No colspan attribute</td>
117
+ <td>No colspan attribute</td>
118
+ </tr>
119
+ </table>
120
+ </body>
121
+ </html>
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html lang='en_gb' xml:lang='en_gb' xmlns='http://www.w3.org/1999/xhtml'>
3
+ <head>
4
+ <title>
5
+ Timeout test
6
+ </title>
7
+ <meta content='text/html; charset=utf-8' http-equiv='content-type' />
8
+ <script type='text/javascript'>
9
+ //<![CDATA[
10
+ function move_on() {
11
+ window.location = 'non_control_elements.html';
12
+ }
13
+ //]]>
14
+ </script>
15
+ </head>
16
+ <body onload='setTimeout(move_on, 500)'>
17
+ Wait 500ms for the next page.
18
+ </body>
19
+ </html>
@@ -0,0 +1,20 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Uneven Table</title>
6
+ </head>
7
+ <body>
8
+ <table border="0" cellspacing="5" cellpadding="5">
9
+ <tr>
10
+ <th>Header 1</th>
11
+ <th>Header 2</th>
12
+ <th>Header 3</th>
13
+ </tr>
14
+ <tr>
15
+ <td>Data 1</td>
16
+ <td>Data 2</td>
17
+ </tr>
18
+ </table>
19
+ </body>
20
+ </html>
@@ -0,0 +1,99 @@
1
+ <!DOCTYPE HTML>
2
+ <html>
3
+ <head>
4
+ <title>wait test</title>
5
+ <script type="text/javascript" charset="utf-8">
6
+
7
+ function setTimeoutAddDisplay(id, current_id, timeout) {
8
+ setTimeoutAdd(id, "none", id, current_id, timeout);
9
+ setTimeoutDisplay(id, "block", timeout*2)
10
+ }
11
+
12
+ function setTimeoutDisplay(id, display, timeout) {
13
+ setTimeout(function() {
14
+ var el = document.getElementById(id)
15
+ el.style.display = display;
16
+ el.setAttribute("custom", id)
17
+ }, timeout);
18
+ }
19
+
20
+ function setTimeoutAdd(id, display, text, existing_id, timeout) {
21
+ var newDiv = document.createElement("div");
22
+ newDiv.setAttribute("id", id);
23
+ newDiv.style.display = display;
24
+ newDiv.appendChild(document.createTextNode(text));
25
+
26
+ var currentDiv = document.getElementById(existing_id);
27
+
28
+ setTimeout(function() {
29
+ document.body.insertBefore(newDiv, currentDiv);
30
+ }, timeout);
31
+ }
32
+
33
+ function setTimeoutRemove(id, timeout) {
34
+ setTimeout(function() {
35
+ var e = document.getElementById(id);
36
+ e.parentNode.removeChild(e);
37
+ }, timeout);
38
+ }
39
+
40
+ function setDisabled(id, disabled, timeout) {
41
+ setTimeout(function() {
42
+ document.getElementById(id).disabled = disabled;
43
+ }, timeout);
44
+ }
45
+
46
+ function makeWritable(id, timeout) {
47
+ setTimeout(function() {
48
+ document.getElementById(id).removeAttribute('readonly');
49
+ }, timeout);
50
+ }
51
+
52
+ function changeName(id) {
53
+ document.getElementById(id).name = 'different';
54
+ }
55
+ </script>
56
+ </head>
57
+
58
+ <body>
59
+ <div id="foo" custom="" style="display:block;">foo</div>
60
+ <div id="bar" style="display:none;" onclick='this.innerHTML = "changed"'>bar</div>
61
+ <a id="show_bar" href="#" onclick="setTimeoutDisplay('bar', 'block', 1000);">show bar</a>
62
+ <a id="hide_foo" href="#" onclick="setTimeoutDisplay('foo', 'none', 1000);">hide foo</a>
63
+ <a id="remove_foo" href="#" onclick="setTimeoutRemove('foo', 1000);">remove foo</a>
64
+ <a id="add_foobar" href="#" onclick="setTimeoutAddDisplay('foobar', 'bar', 1000);">add foobar</a>
65
+ <a id="readd_bar" href="#" onclick="setTimeoutRemove('bar', 500); setTimeoutAddDisplay('bar', 'foo', 1000);">re-add bar</a>
66
+ <div id="buttons">
67
+ <button id="btn" type="button" onclick="setDisabled('btn', true, 0);" disabled>Click To Disable!</button>
68
+ <a id="enable_btn" href="#" onclick="setDisabled('btn', false, 1000);">enable btn</a>
69
+ <button id="btn2" style="display:none;" type="button" disabled>Hidden and Disabled</button>
70
+ <a id="show_and_enable_btn" href="#" onclick="setTimeoutDisplay('btn2', 'block', 500); setDisabled('btn2', false, 1000);">
71
+ show and enable btn
72
+ </a>
73
+ </div>
74
+ <div>
75
+ <a id="change_select" href="#" onclick="changeName('add_select');">change select list</a>
76
+ <a id="add_select" name="add_select" href="#" onclick="setTimeoutDisplay('languages', 'block', 500);">show select list</a>
77
+ </div>
78
+ <form>
79
+ <label for="textfield">Not Displayed Yet</label>
80
+ <input type="textfield" title="Text Displayed" name="textfield" id="textfield" style="display:none;" /> <br />
81
+ <a id="show_textfield" href="#" onclick="setTimeoutDisplay('textfield', 'block', 1000);">show textfield</a>
82
+ <label for="writable">Not Writable</label>
83
+ <input type="text" title="Not Writable" name="writable" id="writable" readonly/> <br />
84
+ <a id="make-writable" onclick="makeWritable('writable', 1000);">Make Writable</a>
85
+ <fieldset>
86
+ <select name="languages" id="languages", style="display: none">
87
+ <option id="danish" value="1">Danish</option>
88
+ <option selected="selected" value="2">English</option>
89
+ <option selected="selected" value="3">Norwegian</option>
90
+ <option value="4" disabled>Russian</option>
91
+ <option>Swedish</option>
92
+ </select> <br />
93
+ </fieldset>
94
+ </form>
95
+ <div id="also_hidden" style="display:none;">
96
+ <div id="hidden_child">Nothing to see here</div>
97
+ </div>
98
+ </body>
99
+ </html>
File without changes
@@ -0,0 +1,22 @@
1
+ <!DOCTYPE HTML>
2
+ <html>
3
+ <head>
4
+ <title>window switching</title>
5
+ <script>
6
+ function windowOpenDelayed(timeout) {
7
+ setTimeout(function() {
8
+ window.open("closeable.html");
9
+ }, timeout);
10
+ }
11
+ </script>
12
+ </head>
13
+
14
+ <body>
15
+ <p>
16
+ Click <a id="open" href="#" onclick='window.open("closeable.html")'>here</a> to open a new window.
17
+ </p>
18
+ <p>
19
+ Click <a id="delayed" href="#" onclick=windowOpenDelayed(1000)>here</a> to open a new window after a delay.
20
+ </p>
21
+ </body>
22
+ </html>
@@ -0,0 +1,346 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe RadioSet do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
9
+ end
10
+
11
+ # Exists method
12
+ describe '#exists?' do
13
+ it 'returns true if matches any radio_set button' do
14
+ expect(browser.radio_set(id: 'new_user_newsletter_yes')).to exist
15
+ expect(browser.radio_set(id: /new_user_newsletter_yes/)).to exist
16
+ expect(browser.radio_set(name: 'new_user_newsletter')).to exist
17
+ expect(browser.radio_set(name: /new_user_newsletter/)).to exist
18
+ expect(browser.radio_set(value: 'yes')).to exist
19
+ expect(browser.radio_set(value: /yes/)).to exist
20
+ expect(browser.radio_set(class: 'huge')).to exist
21
+ expect(browser.radio_set(class: /huge/)).to exist
22
+ expect(browser.radio_set(index: 0)).to exist
23
+ expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_yes']")).to exist
24
+ end
25
+
26
+ it 'returns false if no radio button exists' do
27
+ expect(browser.radio_set(id: 'no_such_id')).not_to exist
28
+ expect(browser.radio_set(id: /no_such_id/)).not_to exist
29
+ expect(browser.radio_set(name: 'no_such_name')).not_to exist
30
+ expect(browser.radio_set(name: /no_such_name/)).not_to exist
31
+ expect(browser.radio_set(value: 'no_such_value')).not_to exist
32
+ expect(browser.radio_set(value: /no_such_value/)).not_to exist
33
+ expect(browser.radio_set(text: 'no_such_text')).not_to exist
34
+ expect(browser.radio_set(text: /no_such_text/)).not_to exist
35
+ expect(browser.radio_set(class: 'no_such_class')).not_to exist
36
+ expect(browser.radio_set(class: /no_such_class/)).not_to exist
37
+ expect(browser.radio_set(index: 1337)).not_to exist
38
+ expect(browser.radio_set(xpath: "input[@id='no_such_id']")).not_to exist
39
+ end
40
+
41
+ it 'returns the first radio set if given no args' do
42
+ expect(browser.radio_set).to exist
43
+ end
44
+
45
+ it "raises TypeError when 'what' argument is invalid" do
46
+ expect { browser.radio_set(id: 3.14).exists? }.to raise_error(TypeError)
47
+ end
48
+ end
49
+
50
+ # Attribute methods
51
+ describe '#name' do
52
+ it 'returns the name attribute if the radio exists' do
53
+ expect(browser.radio_set(id: 'new_user_newsletter_yes').name).to eq 'new_user_newsletter'
54
+ end
55
+
56
+ it 'returns an empty string if the radio exists and there is not name' do
57
+ expect(browser.radio_set(id: 'new_user_newsletter_absolutely').name).to eq ''
58
+ end
59
+
60
+ it "raises UnknownObjectException if the radio doesn't exist" do
61
+ expect { browser.radio_set(index: 1337).name }.to raise_unknown_object_exception
62
+ end
63
+ end
64
+
65
+ context 'without name specified' do
66
+ it 'Finds specified radio' do
67
+ expect(browser.radio_set(id: 'new_user_newsletter_absolutely').count).to eq 1
68
+ expect(browser.radio_set(id: 'new_user_newsletter_absolutely').radios.size).to eq 1
69
+ expect(browser.radio_set(id: 'new_user_newsletter_absolutely').radio(value: 'absolutely').exist?).to be true
70
+ end
71
+ end
72
+
73
+ describe '#type' do
74
+ it 'returns the type attribute if the radio set exists' do
75
+ expect(browser.radio_set.type).to eq 'radio'
76
+ end
77
+
78
+ it "raises UnknownObjectException if the radio doesn't exist" do
79
+ expect { browser.radio_set(index: 1337).type }.to raise_unknown_object_exception
80
+ end
81
+ end
82
+
83
+ describe '#value' do
84
+ it 'returns the value attributes of the selected radio button' do
85
+ expect(browser.radio_set(id: 'new_user_newsletter_yes').value).to eq 'yes'
86
+ end
87
+
88
+ it "raises UnknownObjectException if the radio doesn't exist" do
89
+ expect { browser.radio_set(index: 1337).value }.to raise_unknown_object_exception
90
+ end
91
+ end
92
+
93
+ describe '#text' do
94
+ it 'returns the text of the selected radio button' do
95
+ expect(browser.radio_set(id: 'new_user_newsletter_yes').text).to eq 'Yes'
96
+ end
97
+
98
+ it "raises UnknownObjectException if the radio set doesn't exist" do
99
+ expect { browser.radio_set(index: 1337).text }.to raise_unknown_object_exception
100
+ end
101
+ end
102
+
103
+ describe '#respond_to?' do
104
+ it 'returns true for all attribute methods' do
105
+ expect(browser.radio_set(index: 0)).not_to respond_to(:class_name)
106
+ expect(browser.radio_set(index: 0)).not_to respond_to(:id)
107
+ expect(browser.radio_set(index: 0)).to respond_to(:name)
108
+ expect(browser.radio_set(index: 0)).not_to respond_to(:title)
109
+ expect(browser.radio_set(index: 0)).to respond_to(:type)
110
+ expect(browser.radio_set(index: 0)).to respond_to(:value)
111
+ expect(browser.radio_set(index: 0)).to respond_to(:text)
112
+ expect(browser.radio_set(index: 0)).not_to respond_to(:clear)
113
+ end
114
+ end
115
+
116
+ # Access methods
117
+ describe '#enabled?' do
118
+ it 'returns true if any radio button in the set is enabled' do
119
+ expect(browser.radio_set(id: 'new_user_newsletter_nah')).to be_enabled
120
+ expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_nah']")).to be_enabled
121
+ end
122
+
123
+ it 'returns false if all radio buttons are disabled' do
124
+ expect(browser.radio_set(id: 'new_user_newsletter_none')).not_to be_enabled
125
+ expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_none']")).not_to be_enabled
126
+ end
127
+
128
+ it "raises UnknownObjectException if the radio button doesn't exist" do
129
+ expect { browser.radio_set(id: 'no_such_id').enabled? }.to raise_unknown_object_exception
130
+ expect { browser.radio_set(xpath: "//input[@id='no_such_id']").enabled? }.to raise_unknown_object_exception
131
+ end
132
+ end
133
+
134
+ describe '#disabled?' do
135
+ it 'returns false if the any radio button in the set is enabled' do
136
+ expect(browser.radio_set(id: 'new_user_newsletter_nah')).not_to be_disabled
137
+ expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_nah']")).not_to be_disabled
138
+ end
139
+
140
+ it 'returns true if all radio buttons are disabled' do
141
+ expect(browser.radio_set(id: 'new_user_newsletter_none')).to be_disabled
142
+ expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_none']")).to be_disabled
143
+ end
144
+
145
+ it 'raises UnknownObjectException when the radio set does not exist' do
146
+ expect { browser.radio_set(index: 1337).disabled? }.to raise_unknown_object_exception
147
+ end
148
+ end
149
+
150
+ # Other
151
+ describe '#radio' do
152
+ it 'returns first instance of Radio if no arguments specified' do
153
+ radio = browser.radio_set(id: 'new_user_newsletter_yes').radio
154
+ expect(radio).to be_instance_of(Watir::Radio)
155
+ expect(radio.value).to eq 'yes'
156
+ end
157
+
158
+ it 'returns provided instance of Radio if element has no name' do
159
+ radio = browser.radio_set(id: 'new_user_newsletter_absolutely').radio
160
+ expect(radio).to be_instance_of(Watir::Radio)
161
+ expect(radio.value).to eq 'absolutely'
162
+ end
163
+
164
+ it 'returns an instance of Radio matching the provided value' do
165
+ radio = browser.radio_set(id: 'new_user_newsletter_yes').radio(id: 'new_user_newsletter_no')
166
+ expect(radio).to be_instance_of(Watir::Radio)
167
+ expect(radio.value).to eq 'no'
168
+ end
169
+
170
+ it 'does not exist when using bad locator' do
171
+ radio = browser.radio_set(id: 'new_user_newsletter_yes').radio(id: 'new_user_newsletter_not_there')
172
+ expect(radio).not_to exist
173
+ end
174
+
175
+ it 'raises Unknown Object Exception if it specifies the wrong name' do
176
+ radio_set = browser.radio_set(id: 'new_user_newsletter_yes')
177
+ expect { radio_set.radio(name: '') }.to raise_unknown_object_exception
178
+ expect { radio_set.radio(name: 'foo') }.to raise_unknown_object_exception
179
+ end
180
+ end
181
+
182
+ describe '#radios' do
183
+ it 'returns array of all radios in the set if no arguments specified' do
184
+ radios = browser.radio_set(id: 'new_user_newsletter_yes').radios
185
+ expect(radios).to be_instance_of(Watir::RadioCollection)
186
+ values = %w[yes no certainly nah nah]
187
+ expect(radios.map(&:value)).to match_array values
188
+ end
189
+
190
+ it 'returns RadioCollection matching the provided value' do
191
+ radios = browser.radio_set(id: 'new_user_newsletter_yes').radios(id: /new_user_newsletter_n/)
192
+ expect(radios).to be_instance_of(Watir::RadioCollection)
193
+ expect(radios.map(&:value)).to eq %w[no nah]
194
+ end
195
+
196
+ it 'returns provided instance of Radio if element has no name' do
197
+ radios = browser.radio_set(id: 'new_user_newsletter_absolutely').radios
198
+ expect(radios).to be_instance_of(Watir::RadioCollection)
199
+ expect(radios.size).to eq 1
200
+ expect(radios.first.value).to eq 'absolutely'
201
+ end
202
+
203
+ it 'returns empty collection if specified radio does not exist' do
204
+ radios = browser.radio_set(id: 'new_user_newsletter_yes').radios(id: 'new_user_newsletter_not_there')
205
+ expect(radios).to be_empty
206
+ end
207
+
208
+ it 'raises empty collection if it specifies the wrong name' do
209
+ radio_set = browser.radio_set(id: 'new_user_newsletter_yes')
210
+ expect { radio_set.radios(name: '') }.to raise_unknown_object_exception
211
+ end
212
+
213
+ it 'returns the radio button at the specified index' do
214
+ radio_set = browser.radio_set(id: 'new_user_newsletter_yes')
215
+ expect(radio_set[1]).to be_a Watir::Radio
216
+ end
217
+ end
218
+
219
+ describe '#selected' do
220
+ it "raises UnknownObjectException if the radio set doesn't exist" do
221
+ expect { browser.radio_set(name: 'no_such_name').selected }.to raise_unknown_object_exception
222
+ end
223
+
224
+ it 'gets the currently selected radio' do
225
+ expect(browser.radio_set(id: 'new_user_newsletter_no').selected.text).to eq 'Yes'
226
+ expect(browser.radio_set(id: 'new_user_newsletter_no').selected.value).to eq 'yes'
227
+ end
228
+ end
229
+
230
+ describe '#include?' do
231
+ it 'returns true if the given radio exists by text' do
232
+ expect(browser.radio_set(id: 'new_user_newsletter_no')).to include('Yes')
233
+ end
234
+
235
+ it "returns false if the given option doesn't exist" do
236
+ expect(browser.radio_set(id: 'new_user_newsletter_no')).not_to include('Mother')
237
+ end
238
+ end
239
+
240
+ describe '#selected?' do
241
+ it 'returns true if the given option is selected by text' do
242
+ browser.radio_set(id: 'new_user_newsletter_yes').select('No')
243
+ expect(browser.radio_set(id: 'new_user_newsletter_yes')).to be_selected('No')
244
+ end
245
+
246
+ it 'returns false if the given option is not selected by text' do
247
+ expect(browser.radio_set(id: 'new_user_newsletter_yes')).not_to be_selected('Probably')
248
+ end
249
+
250
+ it "raises UnknownObjectException if the radio button doesn't exist" do
251
+ expect { browser.radio_set(id: 'new_user_newsletter_yes').selected?('missing_option') }
252
+ .to raise_unknown_object_exception
253
+ end
254
+ end
255
+
256
+ describe '#select' do
257
+ context 'when interacting with radios' do
258
+ it 'selects radio text by String' do
259
+ browser.radio_set(id: 'new_user_newsletter_yes').select('Probably')
260
+ expect(browser.radio_set(id: 'new_user_newsletter_yes').selected.text).to eq 'Probably'
261
+ end
262
+
263
+ it 'selects radio text by Regexp' do
264
+ browser.radio_set(id: 'new_user_newsletter_yes').select(/Prob/)
265
+ expect(browser.radio_set(id: 'new_user_newsletter_yes').selected.text).to eq 'Probably'
266
+ end
267
+
268
+ it 'selects the radio text when given an Xpath' do
269
+ browser.radio_set(xpath: "//input[@id='new_user_newsletter_no']").select('Probably')
270
+ expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_no']").selected.text).to eq 'Probably'
271
+ end
272
+
273
+ it 'selects radio value by string' do
274
+ browser.radio_set(id: 'new_user_newsletter_yes').select('no')
275
+ expect(browser.radio_set(id: 'new_user_newsletter_yes').selected.text).to eq 'No'
276
+ end
277
+
278
+ it 'selects radio value by regexp' do
279
+ browser.radio_set(id: 'new_user_newsletter_yes').select(/nah/)
280
+ expect(browser.radio_set(id: 'new_user_newsletter_yes').selected.text).to eq 'Probably'
281
+ end
282
+ end
283
+
284
+ it 'returns the value selected' do
285
+ expect(browser.radio_set(id: 'new_user_newsletter_yes').select('no')).to eq 'no'
286
+ end
287
+
288
+ it 'fires onchange event when selecting a radio' do
289
+ browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'certainly').set
290
+ expect(messages).to eq ['changed: new_user_newsletter']
291
+
292
+ browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'certainly').set
293
+ expect(messages).to eq ['changed: new_user_newsletter'] # no event fired here - didn't change
294
+
295
+ browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'yes').set
296
+ browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'certainly').set
297
+ list = ['changed: new_user_newsletter', 'clicked: new_user_newsletter_yes', 'changed: new_user_newsletter']
298
+ expect(messages).to eq list
299
+ end
300
+
301
+ it "doesn't fire onchange event when selecting an already selected radio" do
302
+ browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'no').set
303
+
304
+ browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'no').set
305
+ expect(messages.size).to eq 1
306
+
307
+ browser.radio_set(id: 'new_user_newsletter_yes').radio(value: 'no').set
308
+ expect(messages.size).to eq 1
309
+ end
310
+ end
311
+
312
+ describe '#eql?' do
313
+ it 'returns true when located by any radio button' do
314
+ rs = browser.radio_set(id: 'new_user_newsletter_yes')
315
+ expect(browser.radio_set(id: /new_user_newsletter_no/)).to eql rs
316
+ expect(browser.radio_set(name: 'new_user_newsletter', index: 2)).to eql rs
317
+ expect(browser.radio_set(name: /new_user_newsletter/)).to eql rs
318
+ expect(browser.radio_set(value: 'yes')).to eql rs
319
+ expect(browser.radio_set(value: /yes/)).to eql rs
320
+ expect(browser.radio_set(class: 'huge')).to eql rs
321
+ expect(browser.radio_set(class: /huge/)).to eql rs
322
+ expect(browser.radio_set(index: 0)).to eql rs
323
+ expect(browser.radio_set(xpath: "//input[@id='new_user_newsletter_probably']")).to eql rs
324
+ end
325
+ end
326
+
327
+ it 'returns the text of the selected radio' do
328
+ expect(browser.radio_set(id: 'new_user_newsletter_yes').select('No')).to eq 'No'
329
+ end
330
+
331
+ it "raises UnknownObjectException if the radio doesn't exist" do
332
+ expect { browser.radio_set(id: 'new_user_newsletter_yes').select('missing_option') }
333
+ .to raise_unknown_object_exception
334
+ expect { browser.radio_set(id: 'new_user_newsletter_yes').select(/missing_option/) }
335
+ .to raise_unknown_object_exception
336
+ end
337
+
338
+ it 'raises ObjectDisabledException if the option is disabled' do
339
+ expect { browser.radio_set(id: 'new_user_newsletter_none').select('None') }.to raise_object_disabled_exception
340
+ end
341
+
342
+ it 'raises a TypeError if argument is not a String, Regexp or Numeric' do
343
+ expect { browser.radio_set(id: 'new_user_newsletter_yes').select([]) }.to raise_error(TypeError)
344
+ end
345
+ end
346
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'base64'
4
+ require 'watirspec_helper'
5
+
6
+ module Watir
7
+ describe Screenshot do
8
+ let(:png_header) { (+"\211PNG").force_encoding('ASCII-8BIT') }
9
+
10
+ describe '#png' do
11
+ it 'gets png representation of screenshot' do
12
+ expect(browser.screenshot.png[0..3]).to eq png_header
13
+ end
14
+ end
15
+
16
+ describe '#base64' do
17
+ it 'gets base64 representation of screenshot' do
18
+ image = browser.screenshot.base64
19
+ expect(Base64.decode64(image)[0..3]).to eq png_header
20
+ end
21
+ end
22
+
23
+ describe '#save' do
24
+ it 'saves screenshot to given file' do
25
+ path = "#{Dir.tmpdir}/test#{::Time.now.to_i}.png"
26
+ expect(File).not_to exist(path)
27
+ browser.screenshot.save(path)
28
+ expect(File).to exist(path)
29
+ expect(File.binread(path)[0..3]).to eq png_header
30
+ end
31
+ end
32
+ end
33
+ end