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,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe 'TableFooters' do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('tables.html'))
9
+ end
10
+
11
+ describe 'with selectors' do
12
+ it 'returns the matching elements' do
13
+ expect(browser.tfoots(id: 'tax_totals').to_a).to eq [browser.tfoot(id: 'tax_totals')]
14
+ end
15
+ end
16
+
17
+ describe '#length' do
18
+ it 'returns the correct number of table tfoots (page context)' do
19
+ expect(browser.tfoots.length).to eq 1
20
+ end
21
+
22
+ it 'returns the correct number of table tfoots (table context)' do
23
+ expect(browser.table(index: 0).tfoots.length).to eq 1
24
+ end
25
+ end
26
+
27
+ describe '#[]' do
28
+ it 'returns the row at the given index (page context)' do
29
+ expect(browser.tfoots[0].id).to eq 'tax_totals'
30
+ end
31
+
32
+ it 'returns the row at the given index (table context)' do
33
+ expect(browser.table(index: 0).tfoots[0].id).to eq 'tax_totals'
34
+ end
35
+ end
36
+
37
+ describe '#each' do
38
+ it 'iterates through table tfoots correctly (page context)' do
39
+ browser.tfoots.each_with_index do |tfoot, index|
40
+ expect(tfoot.id).to eq browser.tfoot(index: index).id
41
+ end
42
+ end
43
+
44
+ describe '#each' do
45
+ it 'iterates through table tfoots correctly (page context)' do
46
+ count = 0
47
+
48
+ browser.tfoots.each_with_index do |tfoot, index|
49
+ expect(tfoot.id).to eq browser.tfoot(index: index).id
50
+
51
+ count += 1
52
+ end
53
+
54
+ expect(count).to be > 0
55
+ end
56
+
57
+ it 'iterates through table tfoots correctly (table context)' do
58
+ table = browser.table(index: 0)
59
+ count = 0
60
+
61
+ table.tfoots.each_with_index do |tfoot, index|
62
+ expect(tfoot.id).to eq table.tfoot(index: index).id
63
+
64
+ count += 1
65
+ end
66
+
67
+ expect(count).to be > 0
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe 'TableHeader' do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('tables.html'))
9
+ end
10
+
11
+ describe '#exists?' do
12
+ it 'returns true if the table theader exists (page context)' do
13
+ expect(browser.thead(id: 'tax_headers')).to exist
14
+ expect(browser.thead(id: /tax_headers/)).to exist
15
+ expect(browser.thead(index: 0)).to exist
16
+ expect(browser.thead(xpath: "//thead[@id='tax_headers']")).to exist
17
+ end
18
+
19
+ it 'returns the first thead if given no args' do
20
+ expect(browser.thead).to exist
21
+ end
22
+
23
+ it 'returns true if the table theader exists (table context)' do
24
+ expect(browser.table(index: 0).thead(id: 'tax_headers')).to exist
25
+ expect(browser.table(index: 0).thead(id: /tax_headers/)).to exist
26
+ expect(browser.table(index: 0).thead(index: 0)).to exist
27
+ expect(browser.table(index: 0).thead(xpath: "//thead[@id='tax_headers']")).to exist
28
+ end
29
+
30
+ it "returns false if the table theader doesn't exist (page context)" do
31
+ expect(browser.thead(id: 'no_such_id')).not_to exist
32
+ expect(browser.thead(id: /no_such_id/)).not_to exist
33
+ expect(browser.thead(index: 1337)).not_to exist
34
+ expect(browser.thead(xpath: "//thead[@id='no_such_id']")).not_to exist
35
+ end
36
+
37
+ it "returns false if the table theader doesn't exist (table context)" do
38
+ expect(browser.table(index: 0).thead(id: 'no_such_id')).not_to exist
39
+ expect(browser.table(index: 0).thead(id: /no_such_id/)).not_to exist
40
+ expect(browser.table(index: 0).thead(index: 1337)).not_to exist
41
+ expect(browser.table(index: 0).thead(xpath: "//thead[@id='no_such_id']")).not_to exist
42
+ end
43
+
44
+ it "raises TypeError when 'what' argument is invalid" do
45
+ expect { browser.thead(id: 3.14).exists? }.to raise_error(TypeError)
46
+ expect { browser.table(index: 0).thead(id: 3.14).exists? }.to raise_error(TypeError)
47
+ end
48
+ end
49
+
50
+ describe '#[]' do
51
+ it 'returns the row at the given index (page context)' do
52
+ expect(browser.thead(id: 'tax_headers')[0].id).to eq 'thead_row_1'
53
+ expect(browser.thead(id: 'tax_headers')[0][1].text).to eq 'Before income tax'
54
+ expect(browser.thead(id: 'tax_headers')[0][2].text).to eq 'Income tax'
55
+ end
56
+
57
+ it 'returns the row at the given index (table context)' do
58
+ expect(browser.table(index: 0).thead(id: 'tax_headers')[0].id).to eq 'thead_row_1'
59
+ expect(browser.table(index: 0).thead(id: 'tax_headers')[0][1].text).to eq 'Before income tax'
60
+ expect(browser.table(index: 0).thead(id: 'tax_headers')[0][2].text).to eq 'Income tax'
61
+ end
62
+ end
63
+
64
+ describe '#row' do
65
+ it 'finds the first row matching the selector' do
66
+ row = browser.thead(id: 'tax_headers').row(class: 'dark')
67
+ expect(row.id).to eq 'thead_row_1'
68
+ end
69
+ end
70
+
71
+ describe '#rows' do
72
+ it 'finds rows matching the selector' do
73
+ rows = browser.thead(id: 'tax_headers').rows(class: 'dark')
74
+
75
+ expect(rows.size).to eq 1
76
+ expect(rows.first.id).to eq 'thead_row_1'
77
+ end
78
+ end
79
+
80
+ describe '#strings' do
81
+ it 'returns the text of child cells' do
82
+ expect(browser.thead(id: 'tax_headers').strings).to eq [
83
+ ['', 'Before income tax', 'Income tax', 'After income tax']
84
+ ]
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe 'TableHeaders' do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('tables.html'))
9
+ end
10
+
11
+ describe 'with selectors' do
12
+ it 'returns the matching elements' do
13
+ expect(browser.theads(id: 'tax_headers').to_a).to eq [browser.thead(id: 'tax_headers')]
14
+ end
15
+ end
16
+
17
+ describe '#length' do
18
+ it 'returns the correct number of table theads (page context)' do
19
+ expect(browser.theads.length).to eq 1
20
+ end
21
+
22
+ it 'returns the correct number of table theads (table context)' do
23
+ expect(browser.table(index: 0).theads.length).to eq 1
24
+ end
25
+ end
26
+
27
+ describe '#[]' do
28
+ it 'returns the row at the given index (page context)' do
29
+ expect(browser.theads[0].id).to eq 'tax_headers'
30
+ end
31
+
32
+ it 'returns the row at the given index (table context)' do
33
+ expect(browser.table(index: 0).theads[0].id).to eq 'tax_headers'
34
+ end
35
+ end
36
+
37
+ describe '#each' do
38
+ it 'iterates through table theads correctly (page context)' do
39
+ browser.theads.each_with_index do |thead, index|
40
+ expect(thead.id).to eq browser.thead(index: index).id
41
+ end
42
+ end
43
+
44
+ describe '#each' do
45
+ it 'iterates through table theads correctly (page context)' do
46
+ count = 0
47
+
48
+ browser.theads.each_with_index do |thead, index|
49
+ expect(thead.id).to eq browser.thead(index: index).id
50
+
51
+ count += 1
52
+ end
53
+
54
+ expect(count).to be > 0
55
+ end
56
+
57
+ it 'iterates through table theads correctly (table context)' do
58
+ table = browser.table(index: 0)
59
+ count = 0
60
+
61
+ table.theads.each_with_index do |thead, index|
62
+ expect(thead.id).to eq table.thead(index: index).id
63
+
64
+ count += 1
65
+ end
66
+
67
+ expect(count).to be > 0
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe TableRow do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('tables.html'))
9
+ end
10
+
11
+ describe '#exists?' do
12
+ it 'returns true if the table row exists' do
13
+ expect(browser.tr(id: 'outer_first')).to exist
14
+ expect(browser.tr(id: /outer_first/)).to exist
15
+ expect(browser.tr(index: 0)).to exist
16
+ browser.tr(xpath: "//tr[@id='outer_first']")
17
+ end
18
+
19
+ it 'returns the first row if given no args' do
20
+ expect(browser.tr).to exist
21
+ end
22
+
23
+ it "returns false if the table row doesn't exist" do
24
+ expect(browser.tr(id: 'no_such_id')).not_to exist
25
+ expect(browser.tr(id: /no_such_id/)).not_to exist
26
+ expect(browser.tr(index: 1337)).not_to exist
27
+ browser.tr(xpath: "//tr[@id='no_such_id']")
28
+ end
29
+
30
+ it "raises TypeError when 'what' argument is invalid" do
31
+ expect { browser.tr(id: 3.14).exists? }.to raise_error(TypeError)
32
+ end
33
+ end
34
+
35
+ describe '#[]', except: {browser: :safari, reason: 'Safari does not strip text'} do
36
+ let(:table) { browser.table(id: 'outer') }
37
+
38
+ it 'returns the nth cell of the row' do
39
+ expect(table[0][0].text).to eq 'Table 1, Row 1, Cell 1'
40
+ expect(table[2][0].text).to eq 'Table 1, Row 3, Cell 1'
41
+ end
42
+ end
43
+
44
+ describe '#cells' do
45
+ let(:table) { browser.table(id: 'outer') }
46
+
47
+ it 'returns the correct number of cells' do
48
+ expect(table[0].cells.length).to eq 2
49
+ expect(table[1].cells.length).to eq 2
50
+ expect(table[2].cells.length).to eq 2
51
+ end
52
+
53
+ it 'finds cells in the table' do
54
+ expect(table[0].cells(text: /Table 1/).size).to eq 2
55
+ end
56
+
57
+ it 'does not find cells from nested tables' do
58
+ expect(table[1].cell(id: 't2_r1_c1')).not_to exist
59
+ expect(table[1].cell(id: /t2_r1_c1/)).not_to exist
60
+ end
61
+
62
+ it 'iterates correctly through the cells of the row' do
63
+ browser.table(id: 'outer').tr(index: 1).each_with_index do |cell, idx|
64
+ expect(cell.id).to eq "t1_r2_c#{idx + 1}"
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe TableRowCollection do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('tables.html'))
9
+ end
10
+
11
+ describe 'with selectors' do
12
+ it 'returns the matching elements' do
13
+ expect(browser.trs(id: 'outer_second').to_a).to eq [browser.tr(id: 'outer_second')]
14
+ end
15
+ end
16
+
17
+ describe '#length' do
18
+ it 'returns the correct number of cells (table context)' do
19
+ expect(browser.table(id: 'inner').trs.length).to eq 1
20
+ expect(browser.table(id: 'outer').trs.length).to eq 4
21
+ end
22
+
23
+ it 'returns the correct number of cells (page context)' do
24
+ expect(browser.trs.length).to eq 14
25
+ end
26
+ end
27
+
28
+ describe '#[]' do
29
+ it 'returns the row at the given index (table context)' do
30
+ expect(browser.table(id: 'outer').trs[0].id).to eq 'outer_first'
31
+ end
32
+
33
+ it 'returns the row at the given index (page context)' do
34
+ expect(browser.trs[0].id).to eq 'thead_row_1'
35
+ end
36
+ end
37
+
38
+ describe '#each' do
39
+ it 'iterates through rows correctly' do
40
+ inner_table = browser.table(id: 'inner')
41
+ count = 0
42
+
43
+ inner_table.trs.each_with_index do |r, index|
44
+ expect(r.id).to eq inner_table.tr(index: index).id
45
+ count += 1
46
+ end
47
+ expect(count).to be > 0
48
+ end
49
+
50
+ it 'iterates through the outer table correctly' do
51
+ outer_table = browser.table(id: 'outer')
52
+ count = 0
53
+
54
+ outer_table.trs.each_with_index do |r, index|
55
+ expect(r.id).to eq outer_table.tr(index: index).id
56
+ count += 1
57
+ end
58
+
59
+ expect(count).to be > 0
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe UList do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
9
+ end
10
+
11
+ # Exists method
12
+ describe '#exist?' do
13
+ it "returns true if the 'ul' exists" do
14
+ expect(browser.ul(id: 'navbar')).to exist
15
+ expect(browser.ul(id: /navbar/)).to exist
16
+ expect(browser.ul(index: 0)).to exist
17
+ expect(browser.ul(xpath: "//ul[@id='navbar']")).to exist
18
+ end
19
+
20
+ it 'returns the first ul if given no args' do
21
+ expect(browser.ul).to exist
22
+ end
23
+
24
+ it "returns false if the 'ul' doesn't exist" do
25
+ expect(browser.ul(id: 'no_such_id')).not_to exist
26
+ expect(browser.ul(id: /no_such_id/)).not_to exist
27
+ expect(browser.ul(text: 'no_such_text')).not_to exist
28
+ expect(browser.ul(text: /no_such_text/)).not_to exist
29
+ expect(browser.ul(class: 'no_such_class')).not_to exist
30
+ expect(browser.ul(class: /no_such_class/)).not_to exist
31
+ expect(browser.ul(index: 1337)).not_to exist
32
+ expect(browser.ul(xpath: "//ul[@id='no_such_id']")).not_to exist
33
+ end
34
+
35
+ it "raises TypeError when 'what' argument is invalid" do
36
+ expect { browser.ul(id: 3.14).exists? }.to raise_error(TypeError)
37
+ end
38
+ end
39
+
40
+ # Attribute methods
41
+ describe '#id' do
42
+ it 'returns the id attribute' do
43
+ expect(browser.ul(class: 'navigation').id).to eq 'navbar'
44
+ end
45
+
46
+ it "returns an empty string if the element exists and the attribute doesn't" do
47
+ expect(browser.ul(index: 1).id).to eq ''
48
+ end
49
+
50
+ it "raises UnknownObjectException if the ul doesn't exist" do
51
+ expect { browser.ul(id: 'no_such_id').id }.to raise_unknown_object_exception
52
+ expect { browser.ul(index: 1337).id }.to raise_unknown_object_exception
53
+ end
54
+ end
55
+
56
+ describe '#respond_to?' do
57
+ it 'returns true for all attribute methods' do
58
+ expect(browser.ul(index: 0)).to respond_to(:class_name)
59
+ expect(browser.ul(index: 0)).to respond_to(:id)
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe UListCollection do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
9
+ end
10
+
11
+ describe 'with selectors' do
12
+ it 'returns the matching elements' do
13
+ expect(browser.uls(class: 'navigation').to_a).to eq [browser.ul(class: 'navigation')]
14
+ end
15
+ end
16
+
17
+ describe '#length' do
18
+ it 'returns the number of uls' do
19
+ expect(browser.uls.length).to eq 2
20
+ end
21
+ end
22
+
23
+ describe '#[]' do
24
+ it 'returns the ul at the given index' do
25
+ expect(browser.uls[0].id).to eq 'navbar'
26
+ end
27
+ end
28
+
29
+ describe '#each' do
30
+ it 'iterates through uls correctly' do
31
+ count = 0
32
+
33
+ browser.uls.each_with_index do |ul, index|
34
+ expect(ul.id).to eq browser.ul(index: index).id
35
+ count += 1
36
+ end
37
+
38
+ expect(count).to be > 0
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Alerts</title>
5
+ </head>
6
+ <body>
7
+ <input id=alert type=button onclick="alert('ok')" value=Alert>
8
+ <input id=confirm type=button onclick="this.value = confirm('set the value')" value=Confirm>
9
+ <input id=prompt type=button onclick='this.value = prompt("enter your name", "John Doe")' value=Prompt>
10
+ <input id=timeout-alert type=button onclick="setTimeout('alert(\'ok\')', 3000)" value=Timeout-Alert>
11
+ </body>
12
+ </html>
@@ -0,0 +1,9 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>aria-* attributes</title>
5
+ </head>
6
+ <body>
7
+ <p aria-label=ruby-library>watir</p>
8
+ </body>
9
+ </html>
@@ -0,0 +1,29 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Child frame</title>
5
+ <meta name="author" content="Software Freedom Conservancy">
6
+ <link rel="author" href="https://github.com/SeleniumHQ/selenium/blob/selenium-4.2.0/common/src/web/scrolling_tests/frame_with_height_above_200.html">
7
+ <link rel="license" href="https://github.com/SeleniumHQ/selenium/blob/trunk/LICENSE">
8
+ </head>
9
+ <body>
10
+ <h1>This is a scrolling frame test</h1>
11
+ <div>
12
+ <table>
13
+ <tr height="50px">
14
+ <td>First row</td>
15
+ </tr>
16
+ <tr height="50px">
17
+ <td>Second row</td>
18
+ </tr>
19
+ <tr height="50px">
20
+ <td>Third row</td>
21
+ </tr>
22
+ <tr height="50px">
23
+ <td>Fourth row</td>
24
+ </tr>
25
+ </table>
26
+ </div>
27
+ <input type='checkbox' name='scroll_checkbox' />
28
+ </body>
29
+ </html>
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <body>
4
+ <div class="a">a</div>
5
+ <div class="a b c">a b c</div>
6
+ <div class="a b">a b</div>
7
+ <div class="abc">abc</div>
8
+ <div class="first
9
+ newline tabbed last">tab</div>
10
+ </body>
11
+ </html>
@@ -0,0 +1,19 @@
1
+ <html>
2
+ <head>
3
+ <script src="javascript/jquery-1.7.1.min.js" type="text/javascript" charset="utf-8"></script>
4
+ </head>
5
+ <script>
6
+ $(document).ready(function() {
7
+ $("#click-logger").click(function(evt) {
8
+ $("#log").append("<p>shift=" + evt.shiftKey + " alt=" + evt.altKey + "</p>");
9
+ });
10
+ });
11
+ </script>
12
+ <body>
13
+ <div id="click-logger">click me</div>
14
+ <div id="log"></div>
15
+ <div>
16
+ <div onclick="this.innerHTML = 'You Clicked It!'" style="color: red; text-decoration: underline; cursor: pointer;">Can You Click This?</div>
17
+ </div>
18
+ </body>
19
+ </html>
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE HTML>
2
+ <html>
3
+ <head>
4
+ <title>closeable window</title>
5
+ <script>
6
+ function closeDelayed(timeout) {
7
+ setTimeout(function() {
8
+ window.close();
9
+ }, timeout);
10
+ }
11
+ </script>
12
+ </head>
13
+
14
+ <body>
15
+ <p>
16
+ Click <a id="close" href="#" onclick="window.close()">here</a> to close this window.
17
+ Click <a id="close-delay" href="#" onclick="closeDelayed(500)">here</a> to close this window with a delay.
18
+ </p>
19
+ </body>
20
+
21
+ </html>
@@ -0,0 +1,15 @@
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>Collections</title>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
+ </head>
7
+ <body>
8
+ <span id="a_span">
9
+ <div>first_div</div>
10
+ <div>second_div</div>
11
+ <span>first_span</span>
12
+ <span>second_span</span>
13
+ </span>
14
+ </body>
15
+ </html>