watir 7.0.0 → 7.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (258) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/chrome.yml +29 -16
  3. data/.github/workflows/edge.yml +19 -11
  4. data/.github/workflows/firefox.yml +28 -16
  5. data/.github/workflows/ie.yml +13 -7
  6. data/.github/workflows/safari.yml +22 -11
  7. data/.github/workflows/unit.yml +31 -23
  8. data/.rubocop.yml +33 -13
  9. data/.rubocop_todo.yml +7 -26
  10. data/CHANGES.md +33 -0
  11. data/Gemfile +6 -1
  12. data/LICENSE +2 -2
  13. data/README.md +15 -11
  14. data/Rakefile +9 -7
  15. data/lib/watir/adjacent.rb +3 -1
  16. data/lib/watir/after_hooks.rb +5 -3
  17. data/lib/watir/alert.rb +2 -0
  18. data/lib/watir/aliases.rb +2 -0
  19. data/lib/watir/attribute_helper.rb +4 -2
  20. data/lib/watir/browser.rb +10 -14
  21. data/lib/watir/capabilities.rb +53 -33
  22. data/lib/watir/cell_container.rb +2 -0
  23. data/lib/watir/container.rb +2 -0
  24. data/lib/watir/cookies.rb +5 -5
  25. data/lib/watir/element_collection.rb +3 -1
  26. data/lib/watir/elements/button.rb +2 -0
  27. data/lib/watir/elements/cell.rb +2 -0
  28. data/lib/watir/elements/checkbox.rb +2 -0
  29. data/lib/watir/elements/date_field.rb +2 -0
  30. data/lib/watir/elements/date_time_field.rb +2 -0
  31. data/lib/watir/elements/dlist.rb +3 -1
  32. data/lib/watir/elements/element.rb +68 -118
  33. data/lib/watir/elements/file_field.rb +2 -0
  34. data/lib/watir/elements/font.rb +2 -0
  35. data/lib/watir/elements/form.rb +2 -0
  36. data/lib/watir/elements/hidden.rb +2 -0
  37. data/lib/watir/elements/iframe.rb +2 -0
  38. data/lib/watir/elements/image.rb +2 -0
  39. data/lib/watir/elements/input.rb +2 -0
  40. data/lib/watir/elements/link.rb +2 -0
  41. data/lib/watir/elements/list.rb +2 -0
  42. data/lib/watir/elements/option.rb +2 -0
  43. data/lib/watir/elements/radio.rb +2 -0
  44. data/lib/watir/elements/row.rb +2 -0
  45. data/lib/watir/elements/select.rb +2 -0
  46. data/lib/watir/elements/table.rb +3 -1
  47. data/lib/watir/elements/table_cell.rb +2 -0
  48. data/lib/watir/elements/table_row.rb +2 -0
  49. data/lib/watir/elements/table_section.rb +2 -0
  50. data/lib/watir/elements/text_area.rb +2 -0
  51. data/lib/watir/elements/text_field.rb +2 -0
  52. data/lib/watir/exception.rb +2 -0
  53. data/lib/watir/extensions/nokogiri.rb +2 -0
  54. data/lib/watir/generator/base/generator.rb +2 -0
  55. data/lib/watir/generator/base/idl_sorter.rb +3 -1
  56. data/lib/watir/generator/base/spec_extractor.rb +6 -4
  57. data/lib/watir/generator/base/util.rb +2 -0
  58. data/lib/watir/generator/base/visitor.rb +5 -5
  59. data/lib/watir/generator/base.rb +2 -1
  60. data/lib/watir/generator/html/generator.rb +2 -0
  61. data/lib/watir/generator/html/spec_extractor.rb +2 -0
  62. data/lib/watir/generator/html/visitor.rb +2 -0
  63. data/lib/watir/generator/html.rb +2 -0
  64. data/lib/watir/generator/svg/generator.rb +2 -0
  65. data/lib/watir/generator/svg/spec_extractor.rb +2 -0
  66. data/lib/watir/generator/svg/visitor.rb +2 -0
  67. data/lib/watir/generator/svg.rb +2 -0
  68. data/lib/watir/generator.rb +2 -0
  69. data/lib/watir/has_window.rb +3 -1
  70. data/lib/watir/http_client.rb +2 -0
  71. data/lib/watir/js_execution.rb +2 -0
  72. data/lib/watir/js_snippets/isElementInViewport.js +20 -0
  73. data/lib/watir/js_snippets.rb +2 -0
  74. data/lib/watir/locators/anchor/selector_builder.rb +5 -0
  75. data/lib/watir/locators/button/matcher.rb +2 -0
  76. data/lib/watir/locators/button/selector_builder/xpath.rb +15 -19
  77. data/lib/watir/locators/button/selector_builder.rb +2 -0
  78. data/lib/watir/locators/cell/selector_builder/xpath.rb +2 -0
  79. data/lib/watir/locators/cell/selector_builder.rb +2 -0
  80. data/lib/watir/locators/element/locator.rb +2 -0
  81. data/lib/watir/locators/element/matcher.rb +4 -1
  82. data/lib/watir/locators/element/selector_builder/regexp_disassembler.rb +4 -1
  83. data/lib/watir/locators/element/selector_builder/xpath.rb +16 -15
  84. data/lib/watir/locators/element/selector_builder/xpath_support.rb +4 -2
  85. data/lib/watir/locators/element/selector_builder.rb +16 -6
  86. data/lib/watir/locators/option/matcher.rb +2 -0
  87. data/lib/watir/locators/option/selector_builder/xpath.rb +2 -0
  88. data/lib/watir/locators/option/selector_builder.rb +2 -0
  89. data/lib/watir/locators/row/selector_builder/xpath.rb +2 -0
  90. data/lib/watir/locators/row/selector_builder.rb +2 -0
  91. data/lib/watir/locators/text_area/selector_builder/xpath.rb +2 -0
  92. data/lib/watir/locators/text_area/selector_builder.rb +2 -0
  93. data/lib/watir/locators/text_field/matcher.rb +2 -4
  94. data/lib/watir/locators/text_field/selector_builder/xpath.rb +2 -0
  95. data/lib/watir/locators/text_field/selector_builder.rb +2 -0
  96. data/lib/watir/locators.rb +2 -0
  97. data/lib/watir/logger.rb +2 -0
  98. data/lib/watir/navigation.rb +3 -1
  99. data/lib/watir/radio_set.rb +2 -0
  100. data/lib/watir/row_container.rb +2 -0
  101. data/lib/watir/screenshot.rb +2 -0
  102. data/lib/watir/scroll.rb +29 -3
  103. data/lib/watir/search_context.rb +96 -0
  104. data/lib/watir/shadow_root.rb +60 -0
  105. data/lib/watir/user_editable.rb +3 -1
  106. data/lib/watir/version.rb +3 -1
  107. data/lib/watir/wait/timer.rb +3 -1
  108. data/lib/watir/wait.rb +5 -5
  109. data/lib/watir/window.rb +7 -3
  110. data/lib/watir/window_collection.rb +4 -1
  111. data/lib/watir.rb +4 -0
  112. data/lib/watirspec/guards.rb +2 -0
  113. data/lib/watirspec/implementation.rb +14 -10
  114. data/lib/watirspec/rake_tasks.rb +4 -4
  115. data/lib/watirspec/remote_server.rb +5 -3
  116. data/lib/watirspec/runner.rb +3 -1
  117. data/lib/watirspec/server/app.rb +2 -0
  118. data/lib/watirspec/server.rb +2 -0
  119. data/lib/watirspec.rb +7 -4
  120. data/spec/locator_spec_helper.rb +2 -8
  121. data/spec/spec_helper.rb +2 -0
  122. data/spec/unit/capabilities_spec.rb +561 -550
  123. data/spec/unit/element_locator_spec.rb +71 -58
  124. data/spec/unit/match_elements/button_spec.rb +58 -49
  125. data/spec/unit/match_elements/element_spec.rb +305 -309
  126. data/spec/unit/match_elements/text_field_spec.rb +78 -73
  127. data/spec/unit/selector_builder/anchor_spec.rb +41 -33
  128. data/spec/unit/selector_builder/button_spec.rb +211 -201
  129. data/spec/unit/selector_builder/cell_spec.rb +50 -42
  130. data/spec/unit/selector_builder/element_spec.rb +636 -628
  131. data/spec/unit/selector_builder/row_spec.rb +121 -104
  132. data/spec/unit/selector_builder/text_field_spec.rb +197 -182
  133. data/spec/unit/selector_builder/textarea_spec.rb +24 -14
  134. data/spec/unit/unit_helper.rb +2 -0
  135. data/spec/unit/wait_spec.rb +77 -71
  136. data/spec/watirspec/adjacent_spec.rb +251 -247
  137. data/spec/watirspec/after_hooks_spec.rb +160 -162
  138. data/spec/watirspec/alert_spec.rb +63 -58
  139. data/spec/watirspec/browser_spec.rb +411 -407
  140. data/spec/watirspec/capabilities_spec.rb +566 -0
  141. data/spec/watirspec/cookies_spec.rb +122 -118
  142. data/spec/watirspec/drag_and_drop_spec.rb +30 -14
  143. data/spec/watirspec/element_hidden_spec.rb +68 -60
  144. data/spec/watirspec/elements/area_spec.rb +51 -47
  145. data/spec/watirspec/elements/areas_spec.rb +29 -25
  146. data/spec/watirspec/elements/button_spec.rb +255 -251
  147. data/spec/watirspec/elements/buttons_spec.rb +38 -34
  148. data/spec/watirspec/elements/checkbox_spec.rb +50 -36
  149. data/spec/watirspec/elements/checkboxes_spec.rb +31 -27
  150. data/spec/watirspec/elements/collections_spec.rb +128 -119
  151. data/spec/watirspec/elements/date_field_spec.rb +187 -183
  152. data/spec/watirspec/elements/date_fields_spec.rb +31 -27
  153. data/spec/watirspec/elements/date_time_field_spec.rb +199 -195
  154. data/spec/watirspec/elements/date_time_fields_spec.rb +32 -28
  155. data/spec/watirspec/elements/dd_spec.rb +89 -85
  156. data/spec/watirspec/elements/dds_spec.rb +29 -25
  157. data/spec/watirspec/elements/del_spec.rb +108 -104
  158. data/spec/watirspec/elements/dels_spec.rb +28 -24
  159. data/spec/watirspec/elements/div_spec.rb +227 -211
  160. data/spec/watirspec/elements/divs_spec.rb +39 -35
  161. data/spec/watirspec/elements/dl_spec.rb +112 -110
  162. data/spec/watirspec/elements/dls_spec.rb +30 -26
  163. data/spec/watirspec/elements/dt_spec.rb +88 -84
  164. data/spec/watirspec/elements/dts_spec.rb +29 -25
  165. data/spec/watirspec/elements/element_spec.rb +815 -715
  166. data/spec/watirspec/elements/elements_spec.rb +42 -38
  167. data/spec/watirspec/elements/em_spec.rb +64 -60
  168. data/spec/watirspec/elements/ems_spec.rb +30 -26
  169. data/spec/watirspec/elements/filefield_spec.rb +100 -96
  170. data/spec/watirspec/elements/filefields_spec.rb +30 -26
  171. data/spec/watirspec/elements/font_spec.rb +22 -18
  172. data/spec/watirspec/elements/form_spec.rb +53 -49
  173. data/spec/watirspec/elements/forms_spec.rb +31 -27
  174. data/spec/watirspec/elements/frame_spec.rb +91 -87
  175. data/spec/watirspec/elements/frames_spec.rb +29 -25
  176. data/spec/watirspec/elements/hidden_spec.rb +81 -77
  177. data/spec/watirspec/elements/hiddens_spec.rb +30 -26
  178. data/spec/watirspec/elements/hn_spec.rb +61 -57
  179. data/spec/watirspec/elements/hns_spec.rb +28 -24
  180. data/spec/watirspec/elements/iframe_spec.rb +197 -191
  181. data/spec/watirspec/elements/iframes_spec.rb +33 -29
  182. data/spec/watirspec/elements/image_spec.rb +146 -142
  183. data/spec/watirspec/elements/images_spec.rb +28 -24
  184. data/spec/watirspec/elements/input_spec.rb +11 -7
  185. data/spec/watirspec/elements/ins_spec.rb +108 -104
  186. data/spec/watirspec/elements/inses_spec.rb +28 -24
  187. data/spec/watirspec/elements/label_spec.rb +58 -54
  188. data/spec/watirspec/elements/labels_spec.rb +28 -24
  189. data/spec/watirspec/elements/li_spec.rb +76 -72
  190. data/spec/watirspec/elements/link_spec.rb +175 -179
  191. data/spec/watirspec/elements/links_spec.rb +47 -43
  192. data/spec/watirspec/elements/lis_spec.rb +29 -25
  193. data/spec/watirspec/elements/list_spec.rb +46 -42
  194. data/spec/watirspec/elements/map_spec.rb +59 -55
  195. data/spec/watirspec/elements/maps_spec.rb +29 -25
  196. data/spec/watirspec/elements/meta_spec.rb +18 -14
  197. data/spec/watirspec/elements/metas_spec.rb +28 -24
  198. data/spec/watirspec/elements/ol_spec.rb +58 -65
  199. data/spec/watirspec/elements/ols_spec.rb +28 -24
  200. data/spec/watirspec/elements/option_spec.rb +93 -89
  201. data/spec/watirspec/elements/p_spec.rb +79 -75
  202. data/spec/watirspec/elements/pre_spec.rb +77 -73
  203. data/spec/watirspec/elements/pres_spec.rb +28 -24
  204. data/spec/watirspec/elements/ps_spec.rb +28 -24
  205. data/spec/watirspec/elements/radio_spec.rb +253 -249
  206. data/spec/watirspec/elements/radios_spec.rb +30 -26
  207. data/spec/watirspec/elements/select_list_spec.rb +539 -522
  208. data/spec/watirspec/elements/select_lists_spec.rb +34 -30
  209. data/spec/watirspec/elements/span_spec.rb +114 -110
  210. data/spec/watirspec/elements/spans_spec.rb +28 -24
  211. data/spec/watirspec/elements/strong_spec.rb +60 -58
  212. data/spec/watirspec/elements/strongs_spec.rb +30 -26
  213. data/spec/watirspec/elements/table_spec.rb +194 -139
  214. data/spec/watirspec/elements/tables_spec.rb +30 -26
  215. data/spec/watirspec/elements/tbody_spec.rb +71 -67
  216. data/spec/watirspec/elements/tbodys_spec.rb +42 -38
  217. data/spec/watirspec/elements/td_spec.rb +68 -64
  218. data/spec/watirspec/elements/tds_spec.rb +43 -39
  219. data/spec/watirspec/elements/text_field_spec.rb +208 -204
  220. data/spec/watirspec/elements/text_fields_spec.rb +32 -28
  221. data/spec/watirspec/elements/textarea_spec.rb +22 -18
  222. data/spec/watirspec/elements/textareas_spec.rb +20 -16
  223. data/spec/watirspec/elements/tfoot_spec.rb +67 -63
  224. data/spec/watirspec/elements/tfoots_spec.rb +44 -40
  225. data/spec/watirspec/elements/thead_spec.rb +67 -63
  226. data/spec/watirspec/elements/theads_spec.rb +44 -40
  227. data/spec/watirspec/elements/tr_spec.rb +50 -46
  228. data/spec/watirspec/elements/trs_spec.rb +44 -40
  229. data/spec/watirspec/elements/ul_spec.rb +58 -54
  230. data/spec/watirspec/elements/uls_spec.rb +28 -24
  231. data/spec/watirspec/html/child_frame.html +29 -0
  232. data/spec/watirspec/html/class_locator.html +2 -0
  233. data/spec/watirspec/html/scroll.html +8 -25
  234. data/spec/watirspec/html/scroll_nested.html +17 -0
  235. data/spec/watirspec/html/scroll_nested_offscreen.html +18 -0
  236. data/spec/watirspec/html/shadow_dom.html +28 -0
  237. data/spec/watirspec/html/sticky_elements.html +10 -0
  238. data/spec/watirspec/radio_set_spec.rb +271 -267
  239. data/spec/watirspec/screenshot_spec.rb +22 -18
  240. data/spec/watirspec/scroll_spec.rb +179 -77
  241. data/spec/watirspec/shadow_root_spec.rb +106 -0
  242. data/spec/watirspec/support/rspec_matchers.rb +35 -32
  243. data/spec/watirspec/user_editable_spec.rb +202 -198
  244. data/spec/watirspec/wait_spec.rb +291 -295
  245. data/spec/watirspec/window_switching_spec.rb +426 -428
  246. data/spec/watirspec_helper.rb +25 -42
  247. data/support/doctest_helper.rb +2 -0
  248. data/support/version_differ.rb +2 -0
  249. data/watir.gemspec +14 -10
  250. metadata +91 -240
  251. data/.github/actions/enable-safari/action.yml +0 -11
  252. data/.github/actions/install-chrome/action.yml +0 -12
  253. data/.github/actions/setup-linux/action.yml +0 -8
  254. data/lib/watir-webdriver.rb +0 -2
  255. data/spec/watirspec/attributes_spec.rb +0 -16
  256. data/spec/watirspec/elements/table_nesting_spec.rb +0 -49
  257. data/spec/watirspec/html/hover.html +0 -12
  258. data/spec/watirspec/special_chars_spec.rb +0 -21
@@ -1,530 +1,534 @@
1
- require 'watirspec_helper'
2
-
3
- describe 'Browser' do
4
- describe '#exists?' do
5
- it 'returns true if we are at a page' do
6
- browser.goto(WatirSpec.url_for('non_control_elements.html'))
7
- expect(browser).to exist
8
- end
9
-
10
- it 'returns false if window is closed',
11
- except: {browser: :safari,
12
- reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'} do
13
- browser.goto WatirSpec.url_for('window_switching.html')
14
- browser.a(id: 'open').click
15
- browser.windows.wait_until(size: 2)
16
- browser.window(title: 'closeable window').use
17
- browser.a(id: 'close').click
18
- browser.windows.wait_until(size: 1)
19
- expect(browser.exists?).to be false
20
- ensure
21
- browser.windows.restore!
22
- end
23
-
24
- it 'returns false after Browser#close' do
25
- browser.close
26
- expect(browser).to_not exist
27
- end
28
- end
29
-
30
- describe '#closed?' do
31
- it 'returns false if not closed' do
32
- expect(browser).to_not be_closed
33
- end
34
-
35
- it 'returns false if window is closed but browser is not',
36
- except: {browser: :safari,
37
- reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'} do
38
- browser.goto WatirSpec.url_for('window_switching.html')
39
- browser.a(id: 'open').click
40
- browser.windows.wait_until(size: 2)
41
- browser.window(title: 'closeable window').use
42
- browser.a(id: 'close').click
43
- browser.windows.wait_until(size: 1)
44
- expect(browser).to_not be_closed
45
- ensure
46
- browser.windows.restore!
47
- end
1
+ # frozen_string_literal: true
48
2
 
49
- it 'returns false after Browser#close' do
50
- browser.close
51
- expect(browser).to be_closed
52
- end
53
- end
3
+ require 'watirspec_helper'
54
4
 
55
- describe '#html' do
56
- it 'returns the DOM of the page as an HTML string' do
57
- browser.goto(WatirSpec.url_for('right_click.html'))
58
- html = browser.html.downcase # varies between browsers
5
+ module Watir
6
+ describe Browser do
7
+ describe '#exists?' do
8
+ it 'returns true if we are at a page' do
9
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
10
+ expect(browser).to exist
11
+ end
59
12
 
60
- expect(html).to match(/^<html/)
61
- expect(html).to include('<meta ')
62
- expect(html).to include(' content="text/html; charset=utf-8"')
63
- expect(html).to match(/http-equiv=("|)content-type/)
64
- end
65
- end
13
+ it 'returns false if window is closed',
14
+ except: {browser: :safari,
15
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'},
16
+ exclude: {browser: :ie,
17
+ reason: 'IE does not like switching windows'} do
18
+ browser.goto WatirSpec.url_for('window_switching.html')
19
+ browser.a(id: 'open').click
20
+ browser.windows.wait_until(size: 2)
21
+ browser.window(title: 'closeable window').use
22
+ browser.a(id: 'close').click
23
+ browser.windows.wait_until(size: 1)
24
+ expect(browser.exists?).to be false
25
+ ensure
26
+ browser.windows.restore!
27
+ end
66
28
 
67
- describe '#title' do
68
- it 'returns the current page title' do
69
- browser.goto(WatirSpec.url_for('non_control_elements.html'))
70
- expect(browser.title).to eq 'Non-control elements'
29
+ it 'returns false after Browser#close' do
30
+ browser.close
31
+ expect(browser).not_to exist
32
+ end
71
33
  end
72
- end
73
34
 
74
- describe '#status' do
75
- it 'returns the current value of window.status',
76
- except: {browser: :ie, reason: 'Status bar not enabled by default'} do
77
- browser.goto(WatirSpec.url_for('non_control_elements.html'))
35
+ describe '#closed?' do
36
+ it 'returns false if not closed' do
37
+ expect(browser).not_to be_closed
38
+ end
78
39
 
79
- browser.execute_script "window.status = 'All done!';"
80
- expect(browser.status).to eq 'All done!'
81
- end
82
- end
40
+ it 'returns false if window is closed but browser is not',
41
+ except: {browser: :safari,
42
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'},
43
+ exclude: {browser: :ie,
44
+ reason: 'IE Mode does not like closed windows'} do
45
+ browser.goto WatirSpec.url_for('window_switching.html')
46
+ browser.a(id: 'open').click
47
+ browser.windows.wait_until(size: 2)
48
+ browser.window(title: 'closeable window').use
49
+ browser.a(id: 'close').click
50
+ browser.windows.wait_until(size: 1)
51
+ expect(browser).not_to be_closed
52
+ ensure
53
+ browser.windows.restore!
54
+ end
83
55
 
84
- describe '#name' do
85
- it 'returns browser name' do
86
- expect(browser.name).to eq(WatirSpec.implementation.browser_name)
56
+ it 'returns false after Browser#close' do
57
+ browser.close
58
+ expect(browser).to be_closed
59
+ end
87
60
  end
88
- end
89
61
 
90
- describe '#send_key{,s}' do
91
- it 'sends keystrokes to the active element' do
92
- browser.goto WatirSpec.url_for 'forms_with_input_elements.html'
62
+ describe '#html' do
63
+ it 'returns the DOM of the page as an HTML string' do
64
+ browser.goto(WatirSpec.url_for('right_click.html'))
65
+ html = browser.html.downcase # varies between browsers
93
66
 
94
- browser.send_keys 'hello'
95
- expect(browser.text_field(id: 'new_user_first_name').value).to eq 'hello'
67
+ expect(html).to match(/^<html/)
68
+ expect(html).to include('<meta ')
69
+ expect(html).to include(' content="text/html; charset=utf-8"')
70
+ expect(html).to match(/http-equiv=("|)content-type/)
71
+ end
96
72
  end
97
73
 
98
- it 'sends keys to a frame' do
99
- browser.goto WatirSpec.url_for 'frames.html'
100
- tf = browser.frame.text_field(id: 'senderElement')
101
- tf.clear
102
- tf.click
103
-
104
- browser.frame.send_keys 'hello'
105
-
106
- expect(tf.value).to eq 'hello'
107
- end
108
- end
74
+ describe '#status' do
75
+ it 'returns the current value of window.status',
76
+ except: {browser: :ie, reason: 'Status bar not enabled by default'} do
77
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
109
78
 
110
- describe '#text' do
111
- it 'returns the text of the page' do
112
- browser.goto(WatirSpec.url_for('non_control_elements.html'))
113
- expect(browser.text).to include('Dubito, ergo cogito, ergo sum.')
79
+ browser.execute_script "window.status = 'All done!';"
80
+ expect(browser.status).to eq 'All done!'
81
+ end
114
82
  end
115
83
 
116
- it 'returns the text also if the content-type is text/plain' do
117
- # more specs for text/plain? what happens if we call other methods?
118
- browser.goto(WatirSpec.url_for('plain_text'))
119
- expect(browser.text.strip).to eq 'This is text/plain'
84
+ describe '#name' do
85
+ it 'returns browser name' do
86
+ expect(browser.name).to eq(WatirSpec.implementation.browser_name)
87
+ end
120
88
  end
121
89
 
122
- it 'returns text of top most browsing context', except: {browser: :safari,
123
- reason: 'Safari does not strip text'} do
124
- browser.goto(WatirSpec.url_for('nested_iframes.html'))
125
- browser.iframe(id: 'two').h3.exists?
126
- expect(browser.text).to eq 'Top Layer'
127
- end
128
- end
90
+ describe '#send_key{,s}' do
91
+ it 'sends keystrokes to the active element' do
92
+ browser.goto WatirSpec.url_for 'forms_with_input_elements.html'
129
93
 
130
- describe '#url' do
131
- it 'returns the current url' do
132
- browser.goto(WatirSpec.url_for('non_control_elements.html'))
133
- expect(browser.url.casecmp(WatirSpec.url_for('non_control_elements.html'))).to eq 0
134
- end
94
+ browser.send_keys 'hello'
95
+ expect(browser.text_field(id: 'new_user_first_name').value).to eq 'hello'
96
+ end
135
97
 
136
- it 'always returns top url' do
137
- browser.goto(WatirSpec.url_for('frames.html'))
138
- browser.frame.body.exists? # switches to frame
139
- expect(browser.url.casecmp(WatirSpec.url_for('frames.html'))).to eq 0
140
- end
141
- end
98
+ it 'sends keys to a frame' do
99
+ browser.goto WatirSpec.url_for 'frames.html'
100
+ tf = browser.frame.text_field(id: 'senderElement')
101
+ tf.clear
102
+ tf.click
142
103
 
143
- describe '#title' do
144
- it 'returns the current title' do
145
- browser.goto(WatirSpec.url_for('non_control_elements.html'))
146
- expect(browser.title).to eq 'Non-control elements'
147
- end
104
+ browser.frame.send_keys 'hello'
148
105
 
149
- it 'always returns top title' do
150
- browser.goto(WatirSpec.url_for('frames.html'))
151
- browser.element(tag_name: 'title').text
152
- browser.frame.body.exists? # switches to frame
153
- expect(browser.title).to eq 'Frames'
106
+ expect(tf.value).to eq 'hello'
107
+ end
154
108
  end
155
- end
156
-
157
- # TODO: Temporarily disabling this before moving it to unit tests
158
- xdescribe '#new' do
159
- context 'with parameters', except: {remote: true} do
160
- let(:url) { 'http://localhost:4544/wd/hub/' }
161
-
162
- before(:all) do
163
- @original = WatirSpec.implementation.clone
164
109
 
165
- require 'watirspec/remote_server'
166
- args = ["-Dwebdriver.chrome.driver=#{Webdrivers::Chromedriver.driver_path}",
167
- "-Dwebdriver.gecko.driver=#{Webdrivers::Geckodriver.driver_path}"]
168
- WatirSpec::RemoteServer.new.start(4544, args: args)
169
- browser.close
110
+ describe '#text' do
111
+ it 'returns the text of the page' do
112
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
113
+ expect(browser.text).to include('Dubito, ergo cogito, ergo sum.')
170
114
  end
171
115
 
172
- before(:each) do
173
- @opts = WatirSpec.implementation.browser_args.last
116
+ it 'returns the text also if the content-type is text/plain' do
117
+ # more specs for text/plain? what happens if we call other methods?
118
+ browser.goto(WatirSpec.url_for('plain_text'))
119
+ expect(browser.text.strip).to eq 'This is text/plain'
174
120
  end
175
121
 
176
- after(:each) do
177
- @new_browser.close
178
- WatirSpec.implementation = @original.clone
122
+ it 'returns text of top most browsing context', except: {browser: :safari,
123
+ reason: 'Safari does not strip text'} do
124
+ browser.goto(WatirSpec.url_for('nested_iframes.html'))
125
+ browser.iframe(id: 'two').h3.exists?
126
+ expect(browser.text).to eq 'Top Layer'
179
127
  end
128
+ end
180
129
 
181
- it 'uses remote client based on provided url' do
182
- @opts[:url] = url
183
- @new_browser = WatirSpec.new_browser
184
-
185
- server_url = @new_browser.driver.instance_variable_get('@bridge').http.instance_variable_get('@server_url')
186
- expect(server_url).to eq URI.parse(url)
130
+ describe '#url' do
131
+ it 'returns the current url' do
132
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
133
+ expect(browser.url.casecmp(WatirSpec.url_for('non_control_elements.html'))).to eq 0
187
134
  end
188
135
 
189
- it 'sets client timeout' do
190
- @opts.merge!(url: url, open_timeout: 44, read_timeout: 47)
191
- @new_browser = WatirSpec.new_browser
136
+ it 'always returns top url' do
137
+ browser.goto(WatirSpec.url_for('frames.html'))
138
+ browser.frame.body.exists? # switches to frame
139
+ expect(browser.url.casecmp(WatirSpec.url_for('frames.html'))).to eq 0
140
+ end
141
+ end
192
142
 
193
- http = @new_browser.driver.instance_variable_get('@bridge').http
143
+ describe '#title' do
144
+ it 'returns the current title' do
145
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
146
+ expect(browser.title).to eq 'Non-control elements'
147
+ end
194
148
 
195
- expect(http.open_timeout).to eq 44
196
- expect(http.read_timeout).to eq 47
149
+ it 'always returns top title' do
150
+ browser.goto(WatirSpec.url_for('frames.html'))
151
+ browser.element(tag_name: 'title').text
152
+ browser.frame.body.exists? # switches to frame
153
+ expect(browser.title).to eq 'Frames'
197
154
  end
155
+ end
198
156
 
199
- it 'accepts http_client' do
200
- http_client = Selenium::WebDriver::Remote::Http::Default.new
201
- @opts[:url] = url
202
- @opts[:http_client] = http_client
203
- @new_browser = WatirSpec.new_browser
157
+ # TODO: Temporarily disabling this before moving it to unit tests
158
+ xdescribe '#new' do
159
+ context 'when using parameters', except: {remote: true} do
160
+ let(:url) { 'http://localhost:4544/wd/hub/' }
204
161
 
205
- expect(@new_browser.driver.instance_variable_get('@bridge').http).to eq http_client
206
- end
162
+ before(:all) do
163
+ @original = WatirSpec.implementation.clone
207
164
 
208
- it 'accepts Remote::Capabilities instance as :desired_capabilities', only: {browser: :firefox} do
209
- caps = Selenium::WebDriver::Remote::Capabilities.firefox(accept_insecure_certs: true)
210
- @opts[:url] = url
211
- @opts[:desired_capabilities] = caps
165
+ require 'watirspec/remote_server'
166
+ args = ["-Dwebdriver.chrome.driver=#{Webdrivers::Chromedriver.driver_path}",
167
+ "-Dwebdriver.gecko.driver=#{Webdrivers::Geckodriver.driver_path}"]
168
+ WatirSpec::RemoteServer.new.start(4544, args: args)
169
+ browser.close
170
+ end
212
171
 
213
- msg = /You can pass values directly into Watir::Browser opt without needing to use :desired_capabilities/
214
- expect { @new_browser = WatirSpec.new_browser }.to output(msg).to_stdout_from_any_process
215
- expect(@new_browser.driver.capabilities.accept_insecure_certs).to eq true
216
- end
172
+ before do
173
+ @opts = WatirSpec.implementation.browser_args.last
174
+ end
217
175
 
218
- it 'accepts individual driver capabilities', only: {browser: :firefox} do
219
- @opts[:accept_insecure_certs] = true
220
- @new_browser = WatirSpec.new_browser
176
+ after do
177
+ @new_browser.close
178
+ WatirSpec.implementation = @original.clone
179
+ end
221
180
 
222
- expect(@new_browser.driver.capabilities[:accept_insecure_certs]).to eq true
223
- end
181
+ it 'uses remote client based on provided url' do
182
+ @opts[:url] = url
183
+ @new_browser = WatirSpec.new_browser
224
184
 
225
- it 'accepts profile', only: {browser: :firefox} do
226
- home_page = WatirSpec.url_for('special_chars.html')
227
- profile = Selenium::WebDriver::Firefox::Profile.new
228
- profile['browser.startup.homepage'] = home_page
229
- profile['browser.startup.page'] = 1
230
- @opts[:profile] = profile
185
+ server_url = @new_browser.driver.instance_variable_get(:@bridge).http.instance_variable_get(:@server_url)
186
+ expect(server_url).to eq URI.parse(url)
187
+ end
231
188
 
232
- @new_browser = WatirSpec.new_browser
189
+ it 'sets client timeout' do
190
+ @opts.merge!(url: url, open_timeout: 44, read_timeout: 47)
191
+ @new_browser = WatirSpec.new_browser
233
192
 
234
- expect(@new_browser.url).to eq home_page
235
- end
193
+ http = @new_browser.driver.instance_variable_get(:@bridge).http
236
194
 
237
- context 'chrome arguments', only: {browser: :chrome} do
238
- it 'accepts browser options' do
239
- @opts[:options] = {emulation: {userAgent: 'foo;bar'}}
195
+ expect(http.open_timeout).to eq 44
196
+ expect(http.read_timeout).to eq 47
197
+ end
240
198
 
199
+ it 'accepts http_client' do
200
+ http_client = Selenium::WebDriver::Remote::Http::Default.new
201
+ @opts[:url] = url
202
+ @opts[:http_client] = http_client
241
203
  @new_browser = WatirSpec.new_browser
242
204
 
243
- ua = @new_browser.execute_script 'return window.navigator.userAgent'
244
- expect(ua).to eq('foo;bar')
205
+ expect(@new_browser.driver.instance_variable_get(:@bridge).http).to eq http_client
245
206
  end
246
207
 
247
- it 'uses remote client when specifying remote' do
248
- opts = {desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome,
249
- url: url}
250
- WatirSpec.implementation.browser_args = [:remote, opts]
208
+ it 'accepts Remote::Capabilities instance as :desired_capabilities', only: {browser: :firefox} do
209
+ caps = Selenium::WebDriver::Remote::Capabilities.firefox(accept_insecure_certs: true)
210
+ @opts[:url] = url
211
+ @opts[:desired_capabilities] = caps
212
+
251
213
  msg = /You can pass values directly into Watir::Browser opt without needing to use :desired_capabilities/
252
214
  expect { @new_browser = WatirSpec.new_browser }.to output(msg).to_stdout_from_any_process
253
- server_url = @new_browser.driver.instance_variable_get('@bridge').http.instance_variable_get('@server_url')
254
- expect(server_url).to eq URI.parse(url)
215
+ expect(@new_browser.driver.capabilities.accept_insecure_certs).to be true
255
216
  end
256
217
 
257
- it 'accepts switches argument' do
258
- @opts.delete :args
259
- @opts[:switches] = ['--window-size=600,700']
260
-
218
+ it 'accepts individual driver capabilities', only: {browser: :firefox} do
219
+ @opts[:accept_insecure_certs] = true
261
220
  @new_browser = WatirSpec.new_browser
262
- size = @new_browser.window.size
263
- expect(size['height']).to eq 700
264
- expect(size['width']).to eq 600
221
+
222
+ expect(@new_browser.driver.capabilities[:accept_insecure_certs]).to be true
265
223
  end
266
224
 
267
- it 'accepts Chrome::Options instance as :options', except: {headless: true} do
268
- chrome_opts = Selenium::WebDriver::Chrome::Options.new(emulation: {userAgent: 'foo;bar'})
269
- @opts.delete :args
270
- @opts[:options] = chrome_opts
225
+ it 'accepts profile', only: {browser: :firefox} do
226
+ home_page = WatirSpec.url_for('special_chars.html')
227
+ profile = Selenium::WebDriver::Firefox::Profile.new
228
+ profile['browser.startup.homepage'] = home_page
229
+ profile['browser.startup.page'] = 1
230
+ @opts[:profile] = profile
271
231
 
272
232
  @new_browser = WatirSpec.new_browser
273
233
 
274
- ua = @new_browser.execute_script 'return window.navigator.userAgent'
275
- expect(ua).to eq('foo;bar')
234
+ expect(@new_browser.url).to eq home_page
235
+ end
236
+
237
+ context 'when using chrome arguments', only: {browser: :chrome} do
238
+ it 'accepts browser options' do
239
+ @opts[:options] = {emulation: {userAgent: 'foo;bar'}}
240
+
241
+ @new_browser = WatirSpec.new_browser
242
+
243
+ ua = @new_browser.execute_script 'return window.navigator.userAgent'
244
+ expect(ua).to eq('foo;bar')
245
+ end
246
+
247
+ it 'uses remote client when specifying remote' do
248
+ opts = {desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome,
249
+ url: url}
250
+ WatirSpec.implementation.browser_args = [:remote, opts]
251
+ msg = /You can pass values directly into Watir::Browser opt without needing to use :desired_capabilities/
252
+ expect { @new_browser = WatirSpec.new_browser }.to output(msg).to_stdout_from_any_process
253
+ server_url = @new_browser.driver.instance_variable_get(:@bridge).http.instance_variable_get(:@server_url)
254
+ expect(server_url).to eq URI.parse(url)
255
+ end
256
+
257
+ it 'accepts switches argument' do
258
+ @opts.delete :args
259
+ @opts[:switches] = ['--window-size=600,700']
260
+
261
+ @new_browser = WatirSpec.new_browser
262
+ size = @new_browser.window.size
263
+ expect(size['height']).to eq 700
264
+ expect(size['width']).to eq 600
265
+ end
266
+
267
+ it 'accepts Chrome::Options instance as :options', except: {headless: true} do
268
+ chrome_opts = Selenium::WebDriver::Chrome::Options.new(emulation: {userAgent: 'foo;bar'})
269
+ @opts.delete :args
270
+ @opts[:options] = chrome_opts
271
+
272
+ @new_browser = WatirSpec.new_browser
273
+
274
+ ua = @new_browser.execute_script 'return window.navigator.userAgent'
275
+ expect(ua).to eq('foo;bar')
276
+ end
276
277
  end
277
278
  end
278
- end
279
279
 
280
- it 'takes service as argument', only: {browser: :chrome} do
281
- @original = WatirSpec.implementation.clone
282
- browser.close
283
- @opts = WatirSpec.implementation.browser_args.last
284
- browser_name = WatirSpec.implementation.browser_args.first
280
+ it 'takes service as argument', only: {browser: :chrome} do
281
+ @original = WatirSpec.implementation.clone
282
+ browser.close
283
+ @opts = WatirSpec.implementation.browser_args.last
284
+ browser_name = WatirSpec.implementation.browser_args.first
285
285
 
286
- service = Selenium::WebDriver::Service.send(browser_name, port: '2314', args: ['foo'])
286
+ service = Selenium::WebDriver::Service.send(browser_name, port: '2314', args: ['foo'])
287
287
 
288
- @opts.merge!(service: service,
289
- listener: LocalConfig::SelectorListener.new)
288
+ @opts[:service] = service
289
+ @opts[:listener] = LocalConfig::SelectorListener.new
290
290
 
291
- @new_browser = WatirSpec.new_browser
291
+ @new_browser = WatirSpec.new_browser
292
292
 
293
- bridge = @new_browser.wd.instance_variable_get('@bridge')
294
- expect(bridge).to be_a Selenium::WebDriver::Support::EventFiringBridge
295
- service = @new_browser.wd.instance_variable_get('@service')
296
- expect(service.instance_variable_get('@extra_args')).to eq ['foo']
297
- expect(service.instance_variable_get('@port')).to eq 2314
293
+ bridge = @new_browser.wd.instance_variable_get(:@bridge)
294
+ expect(bridge).to be_a Selenium::WebDriver::Support::EventFiringBridge
295
+ service = @new_browser.wd.instance_variable_get(:@service)
296
+ expect(service.instance_variable_get(:@extra_args)).to eq ['foo']
297
+ expect(service.instance_variable_get(:@port)).to eq 2314
298
298
 
299
- @new_browser.close
300
- ensure
301
- WatirSpec.implementation = @original.clone
302
- end
299
+ @new_browser.close
300
+ ensure
301
+ WatirSpec.implementation = @original.clone
302
+ end
303
303
 
304
- it 'takes a driver instance as argument' do
305
- mock_driver = double(Selenium::WebDriver::Driver)
306
- expect(Selenium::WebDriver::Driver).to receive(:===).with(mock_driver).and_return(true)
307
- expect { Watir::Browser.new(mock_driver) }.to_not raise_error
308
- end
304
+ it 'takes a driver instance as argument' do
305
+ mock_driver = instance_double(Selenium::WebDriver::Driver)
306
+ allow(Selenium::WebDriver::Driver).to receive(:===).and_return(true)
307
+ expect { described_class.new(mock_driver) }.not_to raise_error
308
+ expect(Selenium::WebDriver::Driver).to have_received(:===).with(mock_driver)
309
+ end
309
310
 
310
- it 'raises ArgumentError for invalid args' do
311
- expect { Watir::Browser.new(Object.new) }.to raise_error(ArgumentError)
311
+ it 'raises ArgumentError for invalid args' do
312
+ expect { described_class.new(Struct.new) }.to raise_error(ArgumentError)
313
+ end
312
314
  end
313
- end
314
315
 
315
- describe '.start' do
316
- it 'goes to the given URL and return an instance of itself' do
317
- browser.close
318
- sleep 1
319
- driver, args = WatirSpec.implementation.browser_args
320
- b = Watir::Browser.start(WatirSpec.url_for('non_control_elements.html'), driver, args.dup)
316
+ describe '.start' do
317
+ it 'goes to the given URL and return an instance of itself' do
318
+ browser.close
319
+ sleep 1
320
+ driver, args = WatirSpec.implementation.browser_args
321
+ b = described_class.start(WatirSpec.url_for('non_control_elements.html'), driver, args.dup)
321
322
 
322
- expect(b).to be_instance_of(Watir::Browser)
323
- expect(b.title).to eq 'Non-control elements'
324
- b.close
323
+ expect(b).to be_instance_of(described_class)
324
+ expect(b.title).to eq 'Non-control elements'
325
+ b.close
326
+ end
325
327
  end
326
- end
327
328
 
328
- describe '#goto' do
329
- it 'adds http:// to URLs with no URL scheme specified' do
330
- url = WatirSpec.host[%r{http://(.*)}, 1]
331
- expect(url).to_not be_nil
332
- browser.goto(url)
333
- expect(browser.url).to match(%r{http://#{url}/?})
334
- end
329
+ describe '#goto' do
330
+ it 'adds http:// to URLs with no URL scheme specified' do
331
+ url = WatirSpec.host[%r{http://(.*)}, 1]
332
+ expect(url).not_to be_nil
333
+ browser.goto(url)
334
+ expect(browser.url).to match(%r{http://#{url}/?})
335
+ end
335
336
 
336
- it 'goes to the given url without raising errors' do
337
- expect { browser.goto(WatirSpec.url_for('non_control_elements.html')) }.to_not raise_error
338
- end
337
+ it 'goes to the given url without raising errors' do
338
+ expect { browser.goto(WatirSpec.url_for('non_control_elements.html')) }.not_to raise_error
339
+ end
339
340
 
340
- it "goes to the url 'about:blank' without raising errors" do
341
- expect { browser.goto('about:blank') }.to_not raise_error
342
- end
341
+ it "goes to the url 'about:blank' without raising errors" do
342
+ expect { browser.goto('about:blank') }.not_to raise_error
343
+ end
343
344
 
344
- it 'goes to a data URL scheme address without raising errors' do
345
- expect { browser.goto('data:text/html;content-type=utf-8,foobar') }.to_not raise_error
346
- end
345
+ it 'goes to a data URL scheme address without raising errors' do
346
+ expect { browser.goto('data:text/html;content-type=utf-8,foobar') }.not_to raise_error
347
+ end
347
348
 
348
- it "goes to internal Chrome URL 'chrome://settings/browser' without raising errors",
349
- exclusive: {browser: %i[chrome edge]} do
350
- expect { browser.goto('chrome://settings/browser') }.to_not raise_error
351
- end
349
+ it "goes to internal Chrome URL 'chrome://settings/browser' without raising errors",
350
+ exclusive: {browser: %i[chrome edge]} do
351
+ expect { browser.goto('chrome://settings/browser') }.not_to raise_error
352
+ end
352
353
 
353
- it 'updates the page when location is changed with setTimeout + window.location' do
354
- browser.goto(WatirSpec.url_for('timeout_window_location.html'))
355
- browser.wait_while { |b| b.url.include? 'timeout_window_location.html' }
356
- expect(browser.url).to include('non_control_elements.html')
354
+ it 'updates the page when location is changed with setTimeout + window.location' do
355
+ browser.goto(WatirSpec.url_for('timeout_window_location.html'))
356
+ browser.wait_while { |b| b.url.include? 'timeout_window_location.html' }
357
+ expect(browser.url).to include('non_control_elements.html')
358
+ end
357
359
  end
358
- end
359
360
 
360
- describe '#refresh' do
361
- it 'refreshes the page' do
362
- browser.goto(WatirSpec.url_for('non_control_elements.html'))
361
+ describe '#refresh' do
362
+ it 'refreshes the page' do
363
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
363
364
 
364
- browser.div(id: 'best_language').scroll.to
365
- browser.div(id: 'best_language').click
366
- expect(browser.div(id: 'best_language').text).to include('Ruby!')
367
- browser.refresh
368
- browser.div(id: 'best_language').wait_until(&:present?)
369
- expect(browser.div(id: 'best_language').text).to_not include('Ruby!')
365
+ browser.div(id: 'best_language').scroll.to
366
+ browser.div(id: 'best_language').click
367
+ expect(browser.div(id: 'best_language').text).to include('Ruby!')
368
+ browser.refresh
369
+ browser.div(id: 'best_language').wait_until(&:present?)
370
+ expect(browser.div(id: 'best_language').text).not_to include('Ruby!')
371
+ end
370
372
  end
371
- end
372
373
 
373
- describe '#execute_script' do
374
- before { browser.goto(WatirSpec.url_for('non_control_elements.html')) }
374
+ describe '#execute_script' do
375
+ before { browser.goto(WatirSpec.url_for('non_control_elements.html')) }
375
376
 
376
- it 'executes the given JavaScript on the current page' do
377
- expect(browser.pre(id: 'rspec').text).to_not eq 'javascript text'
378
- browser.execute_script("document.getElementById('rspec').innerHTML = 'javascript text'")
379
- expect(browser.pre(id: 'rspec').text).to eq 'javascript text'
380
- end
377
+ it 'executes the given JavaScript on the current page' do
378
+ expect(browser.pre(id: 'rspec').text).not_to eq 'javascript text'
379
+ browser.execute_script("document.getElementById('rspec').innerHTML = 'javascript text'")
380
+ expect(browser.pre(id: 'rspec').text).to eq 'javascript text'
381
+ end
381
382
 
382
- it 'executes the given JavaScript in the context of an anonymous function' do
383
- expect(browser.execute_script('1 + 1')).to be_nil
384
- expect(browser.execute_script('return 1 + 1')).to eq 2
385
- end
383
+ it 'executes the given JavaScript in the context of an anonymous function' do
384
+ expect(browser.execute_script('1 + 1')).to be_nil
385
+ expect(browser.execute_script('return 1 + 1')).to eq 2
386
+ end
386
387
 
387
- it 'returns correct Ruby objects' do
388
- expect(browser.execute_script('return {a: 1, "b": 2}')).to eq Hash['a' => 1, 'b' => 2]
389
- expect(browser.execute_script('return [1, 2, "3"]')).to match_array([1, 2, '3'])
390
- expect(browser.execute_script('return 1.2 + 1.3')).to eq 2.5
391
- expect(browser.execute_script('return 2 + 2')).to eq 4
392
- expect(browser.execute_script('return "hello"')).to eq 'hello'
393
- expect(browser.execute_script('return')).to be_nil
394
- expect(browser.execute_script('return null')).to be_nil
395
- expect(browser.execute_script('return undefined')).to be_nil
396
- expect(browser.execute_script('return true')).to be true
397
- expect(browser.execute_script('return false')).to be false
398
- end
388
+ it 'returns correct Ruby objects' do
389
+ expect(browser.execute_script('return {a: 1, "b": 2}')).to eq({'a' => 1, 'b' => 2})
390
+ expect(browser.execute_script('return [1, 2, "3"]')).to match_array([1, 2, '3'])
391
+ expect(browser.execute_script('return 1.2 + 1.3')).to eq 2.5
392
+ expect(browser.execute_script('return 2 + 2')).to eq 4
393
+ expect(browser.execute_script('return "hello"')).to eq 'hello'
394
+ expect(browser.execute_script('return')).to be_nil
395
+ expect(browser.execute_script('return null')).to be_nil
396
+ expect(browser.execute_script('return undefined')).to be_nil
397
+ expect(browser.execute_script('return true')).to be true
398
+ expect(browser.execute_script('return false')).to be false
399
+ end
399
400
 
400
- it 'works correctly with multi-line strings and special characters' do
401
- expect(browser.execute_script("//multiline rocks!
401
+ it 'works correctly with multi-line strings and special characters' do
402
+ expect(browser.execute_script("//multiline rocks!
402
403
  var a = 22; // comment on same line
403
404
  /* more
404
405
  comments */
405
406
  var b = '33';
406
407
  var c = \"44\";
407
408
  return a + b + c")).to eq '223344'
408
- end
409
-
410
- it 'wraps elements as Watir objects' do
411
- returned = browser.execute_script('return document.body')
412
- expect(returned).to be_kind_of(Watir::Body)
413
- end
409
+ end
414
410
 
415
- it 'wraps elements in an array' do
416
- list = browser.execute_script('return [document.body];')
417
- expect(list.size).to eq 1
418
- expect(list.first).to be_kind_of(Watir::Body)
419
- end
411
+ it 'wraps elements as Watir objects' do
412
+ returned = browser.execute_script('return document.body')
413
+ expect(returned).to be_a(Watir::Body)
414
+ end
420
415
 
421
- it 'wraps elements in a Hash' do
422
- hash = browser.execute_script('return {element: document.body};')
423
- expect(hash['element']).to be_kind_of(Watir::Body)
424
- end
416
+ it 'wraps elements in an array' do
417
+ list = browser.execute_script('return [document.body];')
418
+ expect(list.size).to eq 1
419
+ expect(list.first).to be_a(Watir::Body)
420
+ end
425
421
 
426
- it 'wraps elements in a deep object' do
427
- hash = browser.execute_script('return {elements: [document.body], body: {element: document.body }}')
422
+ it 'wraps elements in a Hash' do
423
+ hash = browser.execute_script('return {element: document.body};')
424
+ expect(hash['element']).to be_a(Watir::Body)
425
+ end
428
426
 
429
- expect(hash['elements'].first).to be_kind_of(Watir::Body)
430
- expect(hash['body']['element']).to be_kind_of(Watir::Body)
431
- end
432
- end
427
+ it 'wraps elements in a deep object' do
428
+ hash = browser.execute_script('return {elements: [document.body], body: {element: document.body }}')
433
429
 
434
- describe '#back and #forward' do
435
- it 'goes to the previous page' do
436
- browser.goto WatirSpec.url_for('non_control_elements.html')
437
- orig_url = browser.url
438
- browser.goto WatirSpec.url_for('tables.html')
439
- new_url = browser.url
440
- expect(orig_url).to_not eq new_url
441
- browser.back
442
- expect(orig_url).to eq browser.url
430
+ expect(hash['elements'].first).to be_a(Watir::Body)
431
+ expect(hash['body']['element']).to be_a(Watir::Body)
432
+ end
443
433
  end
444
434
 
445
- it 'goes to the next page' do
446
- urls = []
447
- browser.goto WatirSpec.url_for('non_control_elements.html')
448
- urls << browser.url
449
- browser.goto WatirSpec.url_for('tables.html')
450
- urls << browser.url
451
-
452
- browser.back
453
- expect(browser.url).to eq urls.first
454
- browser.forward
455
- expect(browser.url).to eq urls.last
456
- end
435
+ describe '#back and #forward' do
436
+ it 'goes to the previous page' do
437
+ browser.goto WatirSpec.url_for('non_control_elements.html')
438
+ orig_url = browser.url
439
+ browser.goto WatirSpec.url_for('tables.html')
440
+ new_url = browser.url
441
+ expect(orig_url).not_to eq new_url
442
+ browser.back
443
+ expect(orig_url).to eq browser.url
444
+ end
457
445
 
458
- it 'navigates between several history items' do
459
- urls = ['non_control_elements.html',
460
- 'tables.html',
461
- 'forms_with_input_elements.html',
462
- 'definition_lists.html'].map do |page|
463
- browser.goto WatirSpec.url_for(page)
464
- browser.url
446
+ it 'goes to the next page' do
447
+ urls = []
448
+ browser.goto WatirSpec.url_for('non_control_elements.html')
449
+ urls << browser.url
450
+ browser.goto WatirSpec.url_for('tables.html')
451
+ urls << browser.url
452
+
453
+ browser.back
454
+ expect(browser.url).to eq urls.first
455
+ browser.forward
456
+ expect(browser.url).to eq urls.last
465
457
  end
466
458
 
467
- 3.times { browser.back }
468
- expect(browser.url).to eq urls.first
469
- 2.times { browser.forward }
470
- expect(browser.url).to eq urls[2]
459
+ it 'navigates between several history items' do
460
+ urls = ['non_control_elements.html',
461
+ 'tables.html',
462
+ 'forms_with_input_elements.html',
463
+ 'definition_lists.html'].map do |page|
464
+ browser.goto WatirSpec.url_for(page)
465
+ browser.url
466
+ end
467
+
468
+ 3.times { browser.back }
469
+ expect(browser.url).to eq urls.first
470
+ 2.times { browser.forward }
471
+ expect(browser.url).to eq urls[2]
472
+ end
471
473
  end
472
- end
473
474
 
474
- it 'raises UnknownObjectException when trying to access DOM elements on plain/text-page' do
475
- browser.goto(WatirSpec.url_for('plain_text'))
476
- expect { browser.div(id: 'foo').id }.to raise_unknown_object_exception
477
- end
475
+ it 'raises UnknownObjectException when trying to access DOM elements on plain/text-page' do
476
+ browser.goto(WatirSpec.url_for('plain_text'))
477
+ expect { browser.div(id: 'foo').id }.to raise_unknown_object_exception
478
+ end
478
479
 
479
- it 'raises an error when trying to interact with a closed browser' do
480
- browser.goto WatirSpec.url_for 'definition_lists.html'
481
- browser.close
480
+ it 'raises an error when trying to interact with a closed browser' do
481
+ browser.goto WatirSpec.url_for 'definition_lists.html'
482
+ browser.close
482
483
 
483
- expect { browser.dl(id: 'experience-list').id }.to raise_error(Watir::Exception::Error, 'browser was closed')
484
- end
484
+ expect { browser.dl(id: 'experience-list').id }.to raise_error(Watir::Exception::Error, 'browser was closed')
485
+ end
485
486
 
486
- describe '#ready_state' do
487
- it "gets the document's readyState property" do
488
- expect(browser).to receive(:execute_script).with('return document.readyState')
489
- browser.ready_state
487
+ describe '#ready_state' do
488
+ it "gets the document's readyState property" do
489
+ allow(browser).to receive(:execute_script)
490
+ browser.ready_state
491
+ expect(browser).to have_received(:execute_script).with('return document.readyState')
492
+ end
490
493
  end
491
- end
492
494
 
493
- describe '#wait' do
494
- # The only way to get engage this method is with page load strategy set to "none"
495
- # This spec is both mocking out the response and demonstrating the necessary settings for it to be meaningful
496
- it 'waits for document ready state to be complete' do
497
- @original = WatirSpec.implementation.clone
498
- browser.close
499
- @opts = WatirSpec.implementation.browser_args.last
495
+ describe '#wait' do
496
+ # The only way to get engage this method is with page load strategy set to "none"
497
+ # This spec is both mocking out the response and demonstrating the necessary settings for it to be meaningful
498
+ it 'waits for document ready state to be complete' do
499
+ @original = WatirSpec.implementation.clone
500
+ browser.close
501
+ @opts = WatirSpec.implementation.browser_args.last
500
502
 
501
- @opts[:options] = {page_load_strategy: :none}
502
- browser = WatirSpec.new_browser
503
+ @opts[:options] = {page_load_strategy: :none}
504
+ browser = WatirSpec.new_browser
503
505
 
504
- start_time = Time.now
505
- allow(browser).to receive(:ready_state) { Time.now < start_time + 3 ? 'loading' : 'complete' }
506
- expect(browser.ready_state).to eq 'loading'
506
+ start_time = ::Time.now
507
+ allow(browser).to receive(:ready_state) { ::Time.now < start_time + 3 ? 'loading' : 'complete' }
508
+ expect(browser.ready_state).to eq 'loading'
507
509
 
508
- browser.wait(20)
509
- expect(Time.now - start_time).to be > 3
510
- expect(browser.ready_state).to eq 'complete'
510
+ browser.wait(20)
511
+ expect(::Time.now - start_time).to be > 3
512
+ expect(browser.ready_state).to eq 'complete'
511
513
 
512
- browser.close
513
- ensure
514
- WatirSpec.implementation = @original.clone
514
+ browser.close
515
+ ensure
516
+ WatirSpec.implementation = @original.clone
517
+ end
515
518
  end
516
- end
517
519
 
518
- describe '#inspect' do
519
- it 'works even if browser is closed' do
520
- expect(browser).to receive(:url).and_raise(Errno::ECONNREFUSED)
521
- expect { browser.inspect }.to_not raise_error
520
+ describe '#inspect' do
521
+ it 'works even if browser is closed' do
522
+ allow(browser).to receive(:url).and_raise(Errno::ECONNREFUSED)
523
+ expect { browser.inspect }.not_to raise_error
524
+ expect(browser).to have_received(:url).once
525
+ end
522
526
  end
523
- end
524
527
 
525
- describe '#screenshot' do
526
- it 'returns an instance of of Watir::Screenshot' do
527
- expect(browser.screenshot).to be_kind_of(Watir::Screenshot)
528
+ describe '#screenshot' do
529
+ it 'returns an instance of of Watir::Screenshot' do
530
+ expect(browser.screenshot).to be_a(Watir::Screenshot)
531
+ end
528
532
  end
529
533
  end
530
534
  end