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.
- checksums.yaml +4 -4
- data/.github/workflows/chrome.yml +1 -1
- data/.github/workflows/edge.yml +1 -1
- data/.github/workflows/firefox.yml +1 -1
- data/.github/workflows/ie.yml +1 -1
- data/.github/workflows/safari.yml +1 -1
- data/.github/workflows/unit.yml +1 -1
- data/.rubocop.yml +25 -12
- data/.rubocop_todo.yml +8 -1
- data/CHANGES.md +6 -1
- data/LICENSE +2 -2
- data/lib/watir/capabilities.rb +1 -1
- data/lib/watir/locators/anchor/selector_builder.rb +3 -0
- data/lib/watir/locators/element/matcher.rb +2 -1
- data/lib/watir/locators/element/selector_builder/regexp_disassembler.rb +2 -1
- data/lib/watir/locators/text_field/matcher.rb +0 -4
- data/lib/watir/version.rb +1 -1
- data/spec/locator_spec_helper.rb +0 -8
- data/spec/unit/capabilities_spec.rb +553 -561
- data/spec/unit/element_locator_spec.rb +89 -78
- data/spec/unit/match_elements/button_spec.rb +69 -62
- data/spec/unit/match_elements/element_spec.rb +303 -309
- data/spec/unit/match_elements/text_field_spec.rb +76 -73
- data/spec/unit/selector_builder/anchor_spec.rb +39 -33
- data/spec/unit/selector_builder/button_spec.rb +209 -202
- data/spec/unit/selector_builder/cell_spec.rb +48 -42
- data/spec/unit/selector_builder/element_spec.rb +634 -627
- data/spec/unit/selector_builder/row_spec.rb +119 -113
- data/spec/unit/selector_builder/text_field_spec.rb +195 -188
- data/spec/unit/selector_builder/textarea_spec.rb +22 -14
- data/spec/unit/wait_spec.rb +85 -81
- data/spec/watirspec/adjacent_spec.rb +249 -247
- data/spec/watirspec/after_hooks_spec.rb +161 -159
- data/spec/watirspec/alert_spec.rb +61 -58
- data/spec/watirspec/browser_spec.rb +409 -409
- data/spec/watirspec/capabilities_spec.rb +89 -99
- data/spec/watirspec/cookies_spec.rb +120 -118
- data/spec/watirspec/drag_and_drop_spec.rb +26 -24
- data/spec/watirspec/element_hidden_spec.rb +66 -60
- data/spec/watirspec/elements/area_spec.rb +49 -47
- data/spec/watirspec/elements/areas_spec.rb +27 -25
- data/spec/watirspec/elements/button_spec.rb +253 -251
- data/spec/watirspec/elements/buttons_spec.rb +36 -34
- data/spec/watirspec/elements/checkbox_spec.rb +48 -36
- data/spec/watirspec/elements/checkboxes_spec.rb +29 -27
- data/spec/watirspec/elements/collections_spec.rb +126 -119
- data/spec/watirspec/elements/date_field_spec.rb +185 -183
- data/spec/watirspec/elements/date_fields_spec.rb +29 -27
- data/spec/watirspec/elements/date_time_field_spec.rb +197 -195
- data/spec/watirspec/elements/date_time_fields_spec.rb +30 -28
- data/spec/watirspec/elements/dd_spec.rb +87 -85
- data/spec/watirspec/elements/dds_spec.rb +27 -25
- data/spec/watirspec/elements/del_spec.rb +106 -104
- data/spec/watirspec/elements/dels_spec.rb +26 -24
- data/spec/watirspec/elements/div_spec.rb +225 -221
- data/spec/watirspec/elements/divs_spec.rb +37 -35
- data/spec/watirspec/elements/dl_spec.rb +110 -108
- data/spec/watirspec/elements/dls_spec.rb +28 -26
- data/spec/watirspec/elements/dt_spec.rb +86 -84
- data/spec/watirspec/elements/dts_spec.rb +27 -25
- data/spec/watirspec/elements/element_spec.rb +794 -775
- data/spec/watirspec/elements/elements_spec.rb +40 -38
- data/spec/watirspec/elements/em_spec.rb +62 -60
- data/spec/watirspec/elements/ems_spec.rb +28 -26
- data/spec/watirspec/elements/filefield_spec.rb +116 -114
- data/spec/watirspec/elements/filefields_spec.rb +28 -26
- data/spec/watirspec/elements/font_spec.rb +20 -18
- data/spec/watirspec/elements/form_spec.rb +51 -49
- data/spec/watirspec/elements/forms_spec.rb +29 -27
- data/spec/watirspec/elements/frame_spec.rb +89 -87
- data/spec/watirspec/elements/frames_spec.rb +27 -25
- data/spec/watirspec/elements/hidden_spec.rb +81 -79
- data/spec/watirspec/elements/hiddens_spec.rb +28 -26
- data/spec/watirspec/elements/hn_spec.rb +59 -57
- data/spec/watirspec/elements/hns_spec.rb +26 -24
- data/spec/watirspec/elements/iframe_spec.rb +195 -191
- data/spec/watirspec/elements/iframes_spec.rb +31 -29
- data/spec/watirspec/elements/image_spec.rb +148 -146
- data/spec/watirspec/elements/images_spec.rb +26 -24
- data/spec/watirspec/elements/input_spec.rb +9 -7
- data/spec/watirspec/elements/ins_spec.rb +106 -104
- data/spec/watirspec/elements/inses_spec.rb +26 -24
- data/spec/watirspec/elements/label_spec.rb +56 -54
- data/spec/watirspec/elements/labels_spec.rb +26 -24
- data/spec/watirspec/elements/li_spec.rb +76 -74
- data/spec/watirspec/elements/link_spec.rb +173 -177
- data/spec/watirspec/elements/links_spec.rb +45 -43
- data/spec/watirspec/elements/lis_spec.rb +27 -25
- data/spec/watirspec/elements/list_spec.rb +44 -42
- data/spec/watirspec/elements/map_spec.rb +57 -55
- data/spec/watirspec/elements/maps_spec.rb +27 -25
- data/spec/watirspec/elements/meta_spec.rb +16 -14
- data/spec/watirspec/elements/metas_spec.rb +26 -24
- data/spec/watirspec/elements/ol_spec.rb +56 -65
- data/spec/watirspec/elements/ols_spec.rb +26 -24
- data/spec/watirspec/elements/option_spec.rb +91 -89
- data/spec/watirspec/elements/p_spec.rb +81 -79
- data/spec/watirspec/elements/pre_spec.rb +77 -75
- data/spec/watirspec/elements/pres_spec.rb +26 -24
- data/spec/watirspec/elements/ps_spec.rb +26 -24
- data/spec/watirspec/elements/radio_spec.rb +251 -249
- data/spec/watirspec/elements/radios_spec.rb +28 -26
- data/spec/watirspec/elements/select_list_spec.rb +537 -526
- data/spec/watirspec/elements/select_lists_spec.rb +32 -30
- data/spec/watirspec/elements/span_spec.rb +112 -110
- data/spec/watirspec/elements/spans_spec.rb +26 -24
- data/spec/watirspec/elements/strong_spec.rb +58 -58
- data/spec/watirspec/elements/strongs_spec.rb +28 -26
- data/spec/watirspec/elements/table_spec.rb +192 -139
- data/spec/watirspec/elements/tables_spec.rb +28 -26
- data/spec/watirspec/elements/tbody_spec.rb +74 -72
- data/spec/watirspec/elements/tbodys_spec.rb +40 -38
- data/spec/watirspec/elements/td_spec.rb +66 -64
- data/spec/watirspec/elements/tds_spec.rb +41 -39
- data/spec/watirspec/elements/text_field_spec.rb +206 -204
- data/spec/watirspec/elements/text_fields_spec.rb +30 -28
- data/spec/watirspec/elements/textarea_spec.rb +20 -18
- data/spec/watirspec/elements/textareas_spec.rb +18 -16
- data/spec/watirspec/elements/tfoot_spec.rb +65 -63
- data/spec/watirspec/elements/tfoots_spec.rb +42 -40
- data/spec/watirspec/elements/thead_spec.rb +65 -63
- data/spec/watirspec/elements/theads_spec.rb +42 -40
- data/spec/watirspec/elements/tr_spec.rb +48 -46
- data/spec/watirspec/elements/trs_spec.rb +42 -40
- data/spec/watirspec/elements/ul_spec.rb +56 -54
- data/spec/watirspec/elements/uls_spec.rb +26 -24
- data/spec/watirspec/radio_set_spec.rb +269 -267
- data/spec/watirspec/screenshot_spec.rb +20 -18
- data/spec/watirspec/scroll_spec.rb +152 -148
- data/spec/watirspec/shadow_root_spec.rb +86 -83
- data/spec/watirspec/user_editable_spec.rb +200 -198
- data/spec/watirspec/wait_spec.rb +289 -295
- data/spec/watirspec/window_switching_spec.rb +422 -434
- data/spec/watirspec_helper.rb +1 -23
- data/watir.gemspec +5 -4
- metadata +44 -33
- data/spec/watirspec/attributes_spec.rb +0 -18
- data/spec/watirspec/elements/table_nesting_spec.rb +0 -51
- 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
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
40
|
-
|
|
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')).
|
|
54
|
-
expect(browser.checkbox(id: /no_such_id/)).
|
|
55
|
-
expect(browser.checkbox(name: 'no_such_name')).
|
|
56
|
-
expect(browser.checkbox(name: /no_such_name/)).
|
|
57
|
-
expect(browser.checkbox(value: 'no_such_value')).
|
|
58
|
-
expect(browser.checkbox(value: /no_such_value/)).
|
|
59
|
-
expect(browser.checkbox(text: 'no_such_text')).
|
|
60
|
-
expect(browser.checkbox(text: /no_such_text/)).
|
|
61
|
-
expect(browser.checkbox(class: 'no_such_class')).
|
|
62
|
-
expect(browser.checkbox(class: /no_such_class/)).
|
|
63
|
-
expect(browser.checkbox(index: 1337)).
|
|
64
|
-
expect(browser.checkbox(xpath: "//input[@id='no_such_id']")).
|
|
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')).
|
|
69
|
-
expect(browser.checkbox(xpath: "//input[@name='new_user_interests' and @value='no_such_value']")).
|
|
70
|
-
expect(browser.checkbox(name: 'no_such_name', value: 'cars')).
|
|
71
|
-
expect(browser.checkbox(xpath: "//input[@name='no_such_name' and @value='cars']")).
|
|
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')).
|
|
172
|
-
expect(browser.checkbox(xpath: "//input[@id='new_user_interests_dentistry']")).
|
|
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')).
|
|
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')).
|
|
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')).
|
|
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']")).
|
|
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')).
|
|
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')).
|
|
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')).
|
|
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')).
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
describe '#each' do
|
|
30
|
+
it 'iterates through checkboxes correctly' do
|
|
31
|
+
count = 0
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
39
|
-
|
|
39
|
+
count += 1
|
|
40
|
+
end
|
|
40
41
|
|
|
41
|
-
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|