watir 7.2.0 → 7.2.1

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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/chrome.yml +1 -1
  3. data/.github/workflows/edge.yml +1 -1
  4. data/.github/workflows/firefox.yml +1 -1
  5. data/.github/workflows/ie.yml +1 -1
  6. data/.github/workflows/safari.yml +1 -1
  7. data/.github/workflows/unit.yml +1 -1
  8. data/.rubocop.yml +25 -12
  9. data/.rubocop_todo.yml +8 -1
  10. data/CHANGES.md +6 -1
  11. data/LICENSE +2 -2
  12. data/lib/watir/capabilities.rb +1 -1
  13. data/lib/watir/locators/anchor/selector_builder.rb +3 -0
  14. data/lib/watir/locators/element/matcher.rb +2 -1
  15. data/lib/watir/locators/element/selector_builder/regexp_disassembler.rb +2 -1
  16. data/lib/watir/locators/text_field/matcher.rb +0 -4
  17. data/lib/watir/version.rb +1 -1
  18. data/spec/locator_spec_helper.rb +0 -8
  19. data/spec/unit/capabilities_spec.rb +553 -561
  20. data/spec/unit/element_locator_spec.rb +89 -78
  21. data/spec/unit/match_elements/button_spec.rb +69 -62
  22. data/spec/unit/match_elements/element_spec.rb +303 -309
  23. data/spec/unit/match_elements/text_field_spec.rb +76 -73
  24. data/spec/unit/selector_builder/anchor_spec.rb +39 -33
  25. data/spec/unit/selector_builder/button_spec.rb +209 -202
  26. data/spec/unit/selector_builder/cell_spec.rb +48 -42
  27. data/spec/unit/selector_builder/element_spec.rb +634 -627
  28. data/spec/unit/selector_builder/row_spec.rb +119 -113
  29. data/spec/unit/selector_builder/text_field_spec.rb +195 -188
  30. data/spec/unit/selector_builder/textarea_spec.rb +22 -14
  31. data/spec/unit/wait_spec.rb +85 -81
  32. data/spec/watirspec/adjacent_spec.rb +249 -247
  33. data/spec/watirspec/after_hooks_spec.rb +161 -159
  34. data/spec/watirspec/alert_spec.rb +61 -58
  35. data/spec/watirspec/browser_spec.rb +409 -409
  36. data/spec/watirspec/capabilities_spec.rb +89 -99
  37. data/spec/watirspec/cookies_spec.rb +120 -118
  38. data/spec/watirspec/drag_and_drop_spec.rb +26 -24
  39. data/spec/watirspec/element_hidden_spec.rb +66 -60
  40. data/spec/watirspec/elements/area_spec.rb +49 -47
  41. data/spec/watirspec/elements/areas_spec.rb +27 -25
  42. data/spec/watirspec/elements/button_spec.rb +253 -251
  43. data/spec/watirspec/elements/buttons_spec.rb +36 -34
  44. data/spec/watirspec/elements/checkbox_spec.rb +48 -36
  45. data/spec/watirspec/elements/checkboxes_spec.rb +29 -27
  46. data/spec/watirspec/elements/collections_spec.rb +126 -119
  47. data/spec/watirspec/elements/date_field_spec.rb +185 -183
  48. data/spec/watirspec/elements/date_fields_spec.rb +29 -27
  49. data/spec/watirspec/elements/date_time_field_spec.rb +197 -195
  50. data/spec/watirspec/elements/date_time_fields_spec.rb +30 -28
  51. data/spec/watirspec/elements/dd_spec.rb +87 -85
  52. data/spec/watirspec/elements/dds_spec.rb +27 -25
  53. data/spec/watirspec/elements/del_spec.rb +106 -104
  54. data/spec/watirspec/elements/dels_spec.rb +26 -24
  55. data/spec/watirspec/elements/div_spec.rb +225 -221
  56. data/spec/watirspec/elements/divs_spec.rb +37 -35
  57. data/spec/watirspec/elements/dl_spec.rb +110 -108
  58. data/spec/watirspec/elements/dls_spec.rb +28 -26
  59. data/spec/watirspec/elements/dt_spec.rb +86 -84
  60. data/spec/watirspec/elements/dts_spec.rb +27 -25
  61. data/spec/watirspec/elements/element_spec.rb +794 -775
  62. data/spec/watirspec/elements/elements_spec.rb +40 -38
  63. data/spec/watirspec/elements/em_spec.rb +62 -60
  64. data/spec/watirspec/elements/ems_spec.rb +28 -26
  65. data/spec/watirspec/elements/filefield_spec.rb +116 -114
  66. data/spec/watirspec/elements/filefields_spec.rb +28 -26
  67. data/spec/watirspec/elements/font_spec.rb +20 -18
  68. data/spec/watirspec/elements/form_spec.rb +51 -49
  69. data/spec/watirspec/elements/forms_spec.rb +29 -27
  70. data/spec/watirspec/elements/frame_spec.rb +89 -87
  71. data/spec/watirspec/elements/frames_spec.rb +27 -25
  72. data/spec/watirspec/elements/hidden_spec.rb +81 -79
  73. data/spec/watirspec/elements/hiddens_spec.rb +28 -26
  74. data/spec/watirspec/elements/hn_spec.rb +59 -57
  75. data/spec/watirspec/elements/hns_spec.rb +26 -24
  76. data/spec/watirspec/elements/iframe_spec.rb +195 -191
  77. data/spec/watirspec/elements/iframes_spec.rb +31 -29
  78. data/spec/watirspec/elements/image_spec.rb +148 -146
  79. data/spec/watirspec/elements/images_spec.rb +26 -24
  80. data/spec/watirspec/elements/input_spec.rb +9 -7
  81. data/spec/watirspec/elements/ins_spec.rb +106 -104
  82. data/spec/watirspec/elements/inses_spec.rb +26 -24
  83. data/spec/watirspec/elements/label_spec.rb +56 -54
  84. data/spec/watirspec/elements/labels_spec.rb +26 -24
  85. data/spec/watirspec/elements/li_spec.rb +76 -74
  86. data/spec/watirspec/elements/link_spec.rb +173 -177
  87. data/spec/watirspec/elements/links_spec.rb +45 -43
  88. data/spec/watirspec/elements/lis_spec.rb +27 -25
  89. data/spec/watirspec/elements/list_spec.rb +44 -42
  90. data/spec/watirspec/elements/map_spec.rb +57 -55
  91. data/spec/watirspec/elements/maps_spec.rb +27 -25
  92. data/spec/watirspec/elements/meta_spec.rb +16 -14
  93. data/spec/watirspec/elements/metas_spec.rb +26 -24
  94. data/spec/watirspec/elements/ol_spec.rb +56 -65
  95. data/spec/watirspec/elements/ols_spec.rb +26 -24
  96. data/spec/watirspec/elements/option_spec.rb +91 -89
  97. data/spec/watirspec/elements/p_spec.rb +81 -79
  98. data/spec/watirspec/elements/pre_spec.rb +77 -75
  99. data/spec/watirspec/elements/pres_spec.rb +26 -24
  100. data/spec/watirspec/elements/ps_spec.rb +26 -24
  101. data/spec/watirspec/elements/radio_spec.rb +251 -249
  102. data/spec/watirspec/elements/radios_spec.rb +28 -26
  103. data/spec/watirspec/elements/select_list_spec.rb +537 -526
  104. data/spec/watirspec/elements/select_lists_spec.rb +32 -30
  105. data/spec/watirspec/elements/span_spec.rb +112 -110
  106. data/spec/watirspec/elements/spans_spec.rb +26 -24
  107. data/spec/watirspec/elements/strong_spec.rb +58 -58
  108. data/spec/watirspec/elements/strongs_spec.rb +28 -26
  109. data/spec/watirspec/elements/table_spec.rb +192 -139
  110. data/spec/watirspec/elements/tables_spec.rb +28 -26
  111. data/spec/watirspec/elements/tbody_spec.rb +74 -72
  112. data/spec/watirspec/elements/tbodys_spec.rb +40 -38
  113. data/spec/watirspec/elements/td_spec.rb +66 -64
  114. data/spec/watirspec/elements/tds_spec.rb +41 -39
  115. data/spec/watirspec/elements/text_field_spec.rb +206 -204
  116. data/spec/watirspec/elements/text_fields_spec.rb +30 -28
  117. data/spec/watirspec/elements/textarea_spec.rb +20 -18
  118. data/spec/watirspec/elements/textareas_spec.rb +18 -16
  119. data/spec/watirspec/elements/tfoot_spec.rb +65 -63
  120. data/spec/watirspec/elements/tfoots_spec.rb +42 -40
  121. data/spec/watirspec/elements/thead_spec.rb +65 -63
  122. data/spec/watirspec/elements/theads_spec.rb +42 -40
  123. data/spec/watirspec/elements/tr_spec.rb +48 -46
  124. data/spec/watirspec/elements/trs_spec.rb +42 -40
  125. data/spec/watirspec/elements/ul_spec.rb +56 -54
  126. data/spec/watirspec/elements/uls_spec.rb +26 -24
  127. data/spec/watirspec/radio_set_spec.rb +269 -267
  128. data/spec/watirspec/screenshot_spec.rb +20 -18
  129. data/spec/watirspec/scroll_spec.rb +152 -148
  130. data/spec/watirspec/shadow_root_spec.rb +86 -83
  131. data/spec/watirspec/user_editable_spec.rb +200 -198
  132. data/spec/watirspec/wait_spec.rb +289 -295
  133. data/spec/watirspec/window_switching_spec.rb +422 -434
  134. data/spec/watirspec_helper.rb +1 -23
  135. data/watir.gemspec +5 -4
  136. metadata +44 -33
  137. data/spec/watirspec/attributes_spec.rb +0 -18
  138. data/spec/watirspec/elements/table_nesting_spec.rb +0 -51
  139. data/spec/watirspec/special_chars_spec.rb +0 -23
@@ -3,7 +3,7 @@
3
3
  require 'watirspec_helper'
4
4
 
5
5
  describe 'CheckBox' do
6
- before :each do
6
+ before do
7
7
  browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
8
8
  end
9
9
 
@@ -28,16 +28,17 @@ describe 'CheckBox' do
28
28
  expect(browser.checkbox(xpath: "//input[@id='new_user_interests_books']")).to exist
29
29
  end
30
30
 
31
- # TODO: More of this for text & labels somewhere central
32
- it 'handles text_regexp deprecations for label locators' do
33
- expect(browser.checkbox(label: /some visible/)).to exist
34
- expect(browser.checkbox(label: /some (visible|Jeff)/)).to exist
35
- expect(browser.checkbox(label: /none visible/)).to exist
36
- expect(browser.checkbox(label: /this will not match/)).to_not exist
37
- end
31
+ context 'when some text hidden' do
32
+ it 'locates matching hidden text' do
33
+ expect(browser.checkbox(label: /some visible/)).to exist
34
+ expect(browser.checkbox(label: /some (visible|Jeff)/)).to exist
35
+ expect(browser.checkbox(label: /none visible/)).to exist
36
+ expect(browser.checkbox(label: /some visible some hidden/)).to exist
37
+ end
38
38
 
39
- it 'handles text_regexp deprecation in spite of hidden text' do
40
- expect(browser.checkbox(label: /some visible some hidden/)).to exist
39
+ it 'does not locate when matches without hidden text' do
40
+ expect(browser.checkbox(label: /some visible$/)).not_to exist
41
+ end
41
42
  end
42
43
 
43
44
  it 'returns true if the checkbox button exists (search by name and value)' do
@@ -50,25 +51,25 @@ describe 'CheckBox' do
50
51
  end
51
52
 
52
53
  it 'returns false if the checkbox button does not exist' do
53
- expect(browser.checkbox(id: 'no_such_id')).to_not exist
54
- expect(browser.checkbox(id: /no_such_id/)).to_not exist
55
- expect(browser.checkbox(name: 'no_such_name')).to_not exist
56
- expect(browser.checkbox(name: /no_such_name/)).to_not exist
57
- expect(browser.checkbox(value: 'no_such_value')).to_not exist
58
- expect(browser.checkbox(value: /no_such_value/)).to_not exist
59
- expect(browser.checkbox(text: 'no_such_text')).to_not exist
60
- expect(browser.checkbox(text: /no_such_text/)).to_not exist
61
- expect(browser.checkbox(class: 'no_such_class')).to_not exist
62
- expect(browser.checkbox(class: /no_such_class/)).to_not exist
63
- expect(browser.checkbox(index: 1337)).to_not exist
64
- expect(browser.checkbox(xpath: "//input[@id='no_such_id']")).to_not exist
54
+ expect(browser.checkbox(id: 'no_such_id')).not_to exist
55
+ expect(browser.checkbox(id: /no_such_id/)).not_to exist
56
+ expect(browser.checkbox(name: 'no_such_name')).not_to exist
57
+ expect(browser.checkbox(name: /no_such_name/)).not_to exist
58
+ expect(browser.checkbox(value: 'no_such_value')).not_to exist
59
+ expect(browser.checkbox(value: /no_such_value/)).not_to exist
60
+ expect(browser.checkbox(text: 'no_such_text')).not_to exist
61
+ expect(browser.checkbox(text: /no_such_text/)).not_to exist
62
+ expect(browser.checkbox(class: 'no_such_class')).not_to exist
63
+ expect(browser.checkbox(class: /no_such_class/)).not_to exist
64
+ expect(browser.checkbox(index: 1337)).not_to exist
65
+ expect(browser.checkbox(xpath: "//input[@id='no_such_id']")).not_to exist
65
66
  end
66
67
 
67
68
  it 'returns false if the checkbox button does not exist (search by name and value)' do
68
- expect(browser.checkbox(name: 'new_user_interests', value: 'no_such_value')).to_not exist
69
- expect(browser.checkbox(xpath: "//input[@name='new_user_interests' and @value='no_such_value']")).to_not exist
70
- expect(browser.checkbox(name: 'no_such_name', value: 'cars')).to_not exist
71
- expect(browser.checkbox(xpath: "//input[@name='no_such_name' and @value='cars']")).to_not exist
69
+ expect(browser.checkbox(name: 'new_user_interests', value: 'no_such_value')).not_to exist
70
+ expect(browser.checkbox(xpath: "//input[@name='new_user_interests' and @value='no_such_value']")).not_to exist
71
+ expect(browser.checkbox(name: 'no_such_name', value: 'cars')).not_to exist
72
+ expect(browser.checkbox(xpath: "//input[@name='no_such_name' and @value='cars']")).not_to exist
72
73
  end
73
74
 
74
75
  it 'returns true for checkboxes with a string value' do
@@ -159,6 +160,17 @@ describe 'CheckBox' do
159
160
  end
160
161
  end
161
162
 
163
+ describe '#tabindex' do
164
+ it 'finds tab index' do
165
+ expect(browser.checkbox(tabindex: '4').tabindex).to eq 4
166
+ end
167
+
168
+ it 'finds element with boolean' do
169
+ expect(browser.checkbox(tabindex: false).id).to eq 'toggle_button_checkbox'
170
+ expect(browser.checkbox(tabindex: true).id).to eq 'new_user_interests_books'
171
+ end
172
+ end
173
+
162
174
  # Access methods
163
175
 
164
176
  describe '#enabled?' do
@@ -168,8 +180,8 @@ describe 'CheckBox' do
168
180
  end
169
181
 
170
182
  it 'returns false if the checkbox button is disabled' do
171
- expect(browser.checkbox(id: 'new_user_interests_dentistry')).to_not be_enabled
172
- expect(browser.checkbox(xpath: "//input[@id='new_user_interests_dentistry']")).to_not be_enabled
183
+ expect(browser.checkbox(id: 'new_user_interests_dentistry')).not_to be_enabled
184
+ expect(browser.checkbox(xpath: "//input[@id='new_user_interests_dentistry']")).not_to be_enabled
173
185
  end
174
186
 
175
187
  it "raises UnknownObjectException if the checkbox button doesn't exist" do
@@ -184,7 +196,7 @@ describe 'CheckBox' do
184
196
  end
185
197
 
186
198
  it 'returns false if the checkbox is enabled' do
187
- expect(browser.checkbox(id: 'new_user_interests_books')).to_not be_disabled
199
+ expect(browser.checkbox(id: 'new_user_interests_books')).not_to be_disabled
188
200
  end
189
201
 
190
202
  it "raises UnknownObjectException if the checkbox doesn't exist" do
@@ -196,7 +208,7 @@ describe 'CheckBox' do
196
208
 
197
209
  describe '#clear' do
198
210
  it 'raises ObjectDisabledException if the checkbox is disabled' do
199
- expect(browser.checkbox(id: 'new_user_interests_dentistry')).to_not be_set
211
+ expect(browser.checkbox(id: 'new_user_interests_dentistry')).not_to be_set
200
212
  expect { browser.checkbox(id: 'new_user_interests_dentistry').clear }
201
213
  .to raise_object_disabled_exception
202
214
  expect { browser.checkbox(xpath: "//input[@id='new_user_interests_dentistry']").clear }
@@ -205,12 +217,12 @@ describe 'CheckBox' do
205
217
 
206
218
  it 'clears the checkbox button if it is set' do
207
219
  browser.checkbox(id: 'new_user_interests_books').clear
208
- expect(browser.checkbox(id: 'new_user_interests_books')).to_not be_set
220
+ expect(browser.checkbox(id: 'new_user_interests_books')).not_to be_set
209
221
  end
210
222
 
211
223
  it 'clears the checkbox button when found by :xpath' do
212
224
  browser.checkbox(xpath: "//input[@id='new_user_interests_books']").clear
213
- expect(browser.checkbox(xpath: "//input[@id='new_user_interests_books']")).to_not be_set
225
+ expect(browser.checkbox(xpath: "//input[@id='new_user_interests_books']")).not_to be_set
214
226
  end
215
227
 
216
228
  it "raises UnknownObjectException if the checkbox button doesn't exist" do
@@ -233,7 +245,7 @@ describe 'CheckBox' do
233
245
  it 'fires the onclick event' do
234
246
  expect(browser.button(id: 'disabled_button')).to be_disabled
235
247
  browser.checkbox(id: 'toggle_button_checkbox').set
236
- expect(browser.button(id: 'disabled_button')).to_not be_disabled
248
+ expect(browser.button(id: 'disabled_button')).not_to be_disabled
237
249
  browser.checkbox(id: 'toggle_button_checkbox').clear
238
250
  expect(browser.button(id: 'disabled_button')).to be_disabled
239
251
  end
@@ -259,15 +271,15 @@ describe 'CheckBox' do
259
271
  end
260
272
 
261
273
  it 'returns false if the checkbox button unset' do
262
- expect(browser.checkbox(id: 'new_user_interests_cars')).to_not be_set
274
+ expect(browser.checkbox(id: 'new_user_interests_cars')).not_to be_set
263
275
  end
264
276
 
265
277
  it 'returns the state for checkboxes with string values' do
266
- expect(browser.checkbox(name: 'new_user_interests', value: 'cars')).to_not be_set
278
+ expect(browser.checkbox(name: 'new_user_interests', value: 'cars')).not_to be_set
267
279
  browser.checkbox(name: 'new_user_interests', value: 'cars').set
268
280
  expect(browser.checkbox(name: 'new_user_interests', value: 'cars')).to be_set
269
281
  browser.checkbox(name: 'new_user_interests', value: 'cars').clear
270
- expect(browser.checkbox(name: 'new_user_interests', value: 'cars')).to_not be_set
282
+ expect(browser.checkbox(name: 'new_user_interests', value: 'cars')).not_to be_set
271
283
  end
272
284
 
273
285
  it "raises UnknownObjectException if the checkbox button doesn't exist" do
@@ -2,43 +2,45 @@
2
2
 
3
3
  require 'watirspec_helper'
4
4
 
5
- describe 'CheckBoxes' do
6
- before :each do
7
- browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
8
- end
5
+ module Watir
6
+ describe CheckBoxCollection do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
9
+ end
9
10
 
10
- describe 'with selectors' do
11
- it 'returns the matching elements' do
12
- expect(browser.checkboxes(value: 'books').to_a).to eq [browser.checkbox(value: 'books')]
11
+ describe 'with selectors' do
12
+ it 'returns the matching elements' do
13
+ expect(browser.checkboxes(value: 'books').to_a).to eq [browser.checkbox(value: 'books')]
14
+ end
13
15
  end
14
- end
15
16
 
16
- describe '#length' do
17
- it 'returns the number of checkboxes' do
18
- expect(browser.checkboxes.length).to eq 11
17
+ describe '#length' do
18
+ it 'returns the number of checkboxes' do
19
+ expect(browser.checkboxes.length).to eq 11
20
+ end
19
21
  end
20
- end
21
22
 
22
- describe '#[]' do
23
- it 'returns the checkbox at the given index' do
24
- expect(browser.checkboxes[0].id).to eq 'new_user_interests_books'
23
+ describe '#[]' do
24
+ it 'returns the checkbox at the given index' do
25
+ expect(browser.checkboxes[0].id).to eq 'new_user_interests_books'
26
+ end
25
27
  end
26
- end
27
28
 
28
- describe '#each' do
29
- it 'iterates through checkboxes correctly' do
30
- count = 0
29
+ describe '#each' do
30
+ it 'iterates through checkboxes correctly' do
31
+ count = 0
31
32
 
32
- browser.checkboxes.each_with_index do |c, index|
33
- expect(c).to be_instance_of(Watir::CheckBox)
34
- expect(c.name).to eq browser.checkbox(index: index).name
35
- expect(c.id).to eq browser.checkbox(index: index).id
36
- expect(c.value).to eq browser.checkbox(index: index).value
33
+ browser.checkboxes.each_with_index do |c, index|
34
+ expect(c).to be_instance_of(CheckBox)
35
+ expect(c.name).to eq browser.checkbox(index: index).name
36
+ expect(c.id).to eq browser.checkbox(index: index).id
37
+ expect(c.value).to eq browser.checkbox(index: index).value
37
38
 
38
- count += 1
39
- end
39
+ count += 1
40
+ end
40
41
 
41
- expect(count).to be > 0
42
+ expect(count).to be > 0
43
+ end
42
44
  end
43
45
  end
44
46
  end
@@ -2,124 +2,131 @@
2
2
 
3
3
  require 'watirspec_helper'
4
4
 
5
- describe 'Collections' do
6
- it 'returns inner elements of parent element having different html tag' do
7
- browser.goto(WatirSpec.url_for('collections.html'))
8
- expect(browser.span(id: 'a_span').divs.size).to eq 2
9
- end
10
-
11
- it 'returns inner elements of parent element having same html tag' do
12
- browser.goto(WatirSpec.url_for('collections.html'))
13
- expect(browser.span(id: 'a_span').spans.size).to eq 2
14
- end
15
-
16
- it 'returns correct subtype of elements' do
17
- browser.goto(WatirSpec.url_for('collections.html'))
18
- collection = browser.span(id: 'a_span').spans
19
- expect(collection.all?(Watir::Span)).to eq true
20
- end
21
-
22
- it 'returns correct subtype of elements without tag_name' do
23
- browser.goto(WatirSpec.url_for('collections.html'))
24
- collection = browser.span(id: 'a_span').elements
25
- collection.locate
26
- expect(collection.first).to be_a Watir::Div
27
- expect(collection.last).to be_a Watir::Span
28
- end
29
-
30
- it 'can contain more than one type of element' do
31
- browser.goto(WatirSpec.url_for('nested_elements.html'))
32
- collection = browser.div(id: 'parent').children
33
- expect(collection.any?(Watir::Span)).to eq true
34
- expect(collection.any?(Watir::Div)).to eq true
35
- end
36
-
37
- it 'relocates the same element' do
38
- browser.goto(WatirSpec.url_for('nested_elements.html'))
39
- collection = browser.div(id: 'parent').children
40
- tag = collection[3].tag_name
41
- browser.refresh
42
- expect(collection[3].tag_name).to eq tag
43
- end
44
-
45
- it 'returns value for #empty?' do
46
- browser.goto(WatirSpec.url_for('collections.html'))
47
- expect(browser.span(id: 'a_span').options.empty?).to eq true
48
- end
49
-
50
- it 'returns value for #any?' do
51
- browser.goto(WatirSpec.url_for('collections.html'))
52
- expect(browser.span(id: 'a_span').spans.any?).to eq true
53
- end
54
-
55
- it 'locates elements' do
56
- browser.goto(WatirSpec.url_for('collections.html'))
57
- spans = browser.span(id: 'a_span').spans
58
- expect(spans).to receive(:elements).and_return([])
59
- expect(spans.locate).to be_a Watir::SpanCollection
60
- end
61
-
62
- it 'lazy loads collections referenced with #[]' do
63
- browser.goto(WatirSpec.url_for('collections.html'))
64
- expect(browser.wd).to_not receive(:find_elements)
65
- browser.spans[3]
66
- end
67
-
68
- it 'does not relocate collections when previously evaluated' do
69
- browser.goto(WatirSpec.url_for('collections.html'))
70
- elements = browser.spans.tap(&:to_a)
71
-
72
- expect(browser.wd).to_not receive(:find_elements)
73
- elements[1].id
74
- end
75
-
76
- it 'relocates cached elements that go stale' do
77
- browser.goto(WatirSpec.url_for('collections.html'))
78
- elements = browser.spans.tap(&:to_a)
79
-
80
- browser.refresh
81
- expect(elements[1]).to be_stale
82
- expect { elements[1] }.to_not raise_unknown_object_exception
83
- end
84
-
85
- it 'does not retrieve tag_name on elements when specifying tag_name' do
86
- browser.goto(WatirSpec.url_for('collections.html'))
87
- collection = browser.span(id: 'a_span').spans
88
-
89
- expect_any_instance_of(Selenium::WebDriver::Element).to_not receive(:tag_name)
90
- collection.locate
91
- end
92
-
93
- it 'does not retrieve tag_name on elements without specifying tag_name' do
94
- browser.goto(WatirSpec.url_for('collections.html'))
95
- collection = browser.span(id: 'a_span').elements
96
-
97
- expect_any_instance_of(Selenium::WebDriver::Element).to_not receive(:tag_name)
98
- collection.locate
99
- end
100
-
101
- it 'does not execute_script to retrieve tag_names when specifying tag_name' do
102
- browser.goto(WatirSpec.url_for('collections.html'))
103
- collection = browser.span(id: 'a_span').spans
104
-
105
- expect(browser.wd).to_not receive(:execute_script)
106
- collection.locate
107
- end
108
-
109
- it 'returns correct containers without specifying tag_name' do
110
- browser.goto(WatirSpec.url_for('collections.html'))
111
- elements = browser.span(id: 'a_span').elements.to_a
112
- expect(elements[0]).to be_a(Watir::Div)
113
- expect(elements[-1]).to be_a(Watir::Span)
114
- end
115
-
116
- it 'Raises Exception if any element in collection continues to go stale' do
117
- browser.goto(WatirSpec.url_for('collections.html'))
118
-
119
- stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
120
- expect(browser.wd).to receive(:execute_script).and_raise(stale_exception).exactly(3).times
121
-
122
- msg = 'Unable to locate element collection from {:xpath=>".//span"} due to changing page'
123
- expect { browser.span.elements(xpath: './/span').to_a }.to raise_exception Watir::Exception::LocatorException, msg
5
+ module Watir
6
+ describe ElementCollection do
7
+ it 'returns inner elements of parent element having different html tag' do
8
+ browser.goto(WatirSpec.url_for('collections.html'))
9
+ expect(browser.span(id: 'a_span').divs.size).to eq 2
10
+ end
11
+
12
+ it 'returns inner elements of parent element having same html tag' do
13
+ browser.goto(WatirSpec.url_for('collections.html'))
14
+ expect(browser.span(id: 'a_span').spans.size).to eq 2
15
+ end
16
+
17
+ it 'returns correct subtype of elements' do
18
+ browser.goto(WatirSpec.url_for('collections.html'))
19
+ collection = browser.span(id: 'a_span').spans
20
+ expect(collection.all?(Span)).to be true
21
+ end
22
+
23
+ it 'returns correct subtype of elements without tag_name' do
24
+ browser.goto(WatirSpec.url_for('collections.html'))
25
+ collection = browser.span(id: 'a_span').elements
26
+ collection.locate
27
+ expect(collection.first).to be_a Div
28
+ expect(collection.last).to be_a Span
29
+ end
30
+
31
+ it 'can contain more than one type of element' do
32
+ browser.goto(WatirSpec.url_for('nested_elements.html'))
33
+ collection = browser.div(id: 'parent').children
34
+ expect(collection.any?(Span)).to be true
35
+ expect(collection.any?(Div)).to be true
36
+ end
37
+
38
+ it 'relocates the same element' do
39
+ browser.goto(WatirSpec.url_for('nested_elements.html'))
40
+ collection = browser.div(id: 'parent').children
41
+ tag = collection[3].tag_name
42
+ browser.refresh
43
+ expect(collection[3].tag_name).to eq tag
44
+ end
45
+
46
+ it 'returns value for #empty?' do
47
+ browser.goto(WatirSpec.url_for('collections.html'))
48
+ expect(browser.span(id: 'a_span').options.empty?).to be true
49
+ end
50
+
51
+ it 'returns value for #any?' do
52
+ browser.goto(WatirSpec.url_for('collections.html'))
53
+ expect(browser.span(id: 'a_span').spans.any?).to be true
54
+ end
55
+
56
+ it 'locates elements' do
57
+ browser.goto(WatirSpec.url_for('collections.html'))
58
+ spans = browser.span(id: 'a_span').spans
59
+ allow(spans).to receive(:elements).and_return([])
60
+ expect(spans.locate).to be_a SpanCollection
61
+ expect(spans).to have_received(:elements).once
62
+ end
63
+
64
+ it 'lazy loads collections referenced with #[]' do
65
+ browser.goto(WatirSpec.url_for('collections.html'))
66
+ allow(browser.wd).to receive(:find_elements)
67
+ browser.spans[3]
68
+ expect(browser.wd).not_to have_received(:find_elements)
69
+ end
70
+
71
+ it 'does not relocate collections when previously evaluated' do
72
+ browser.goto(WatirSpec.url_for('collections.html'))
73
+ elements = browser.spans.tap(&:to_a)
74
+
75
+ allow(browser.wd).to receive(:find_elements)
76
+ elements[1].id
77
+ expect(browser.wd).not_to have_received(:find_elements)
78
+ end
79
+
80
+ it 'relocates cached elements that go stale' do
81
+ browser.goto(WatirSpec.url_for('collections.html'))
82
+ elements = browser.spans.tap(&:to_a)
83
+
84
+ browser.refresh
85
+ expect(elements[1]).to be_stale
86
+ expect { elements[1] }.not_to raise_unknown_object_exception
87
+ end
88
+
89
+ it 'does not retrieve tag_name on elements when specifying tag_name' do
90
+ browser.goto(WatirSpec.url_for('collections.html'))
91
+ collection = browser.span(id: 'a_span').spans
92
+
93
+ expect_any_instance_of(Selenium::WebDriver::Element).not_to receive(:tag_name)
94
+ collection.locate
95
+ end
96
+
97
+ it 'does not retrieve tag_name on elements without specifying tag_name' do
98
+ browser.goto(WatirSpec.url_for('collections.html'))
99
+ collection = browser.span(id: 'a_span').elements
100
+
101
+ expect_any_instance_of(Selenium::WebDriver::Element).not_to receive(:tag_name)
102
+ collection.locate
103
+ end
104
+
105
+ it 'does not execute_script to retrieve tag_names when specifying tag_name' do
106
+ browser.goto(WatirSpec.url_for('collections.html'))
107
+ collection = browser.span(id: 'a_span').spans
108
+
109
+ allow(browser.wd).to receive(:execute_script)
110
+ collection.locate
111
+ expect(browser.wd).not_to have_received(:execute_script)
112
+ end
113
+
114
+ it 'returns correct containers without specifying tag_name' do
115
+ browser.goto(WatirSpec.url_for('collections.html'))
116
+ elements = browser.span(id: 'a_span').elements.to_a
117
+ expect(elements[0]).to be_a(Div)
118
+ expect(elements[-1]).to be_a(Span)
119
+ end
120
+
121
+ it 'Raises Exception if any element in collection continues to go stale' do
122
+ browser.goto(WatirSpec.url_for('collections.html'))
123
+
124
+ stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
125
+ allow(browser.wd).to receive(:execute_script).and_raise(stale_exception)
126
+
127
+ msg = 'Unable to locate element collection from {:xpath=>".//span"} due to changing page'
128
+ expect { browser.span.elements(xpath: './/span').to_a }.to raise_exception Exception::LocatorException, msg
129
+ expect(browser.wd).to have_received(:execute_script).exactly(3).times
130
+ end
124
131
  end
125
132
  end