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
@@ -2,204 +2,206 @@
2
2
 
3
3
  require 'watirspec_helper'
4
4
 
5
- describe Watir::UserEditable do
6
- before :each do
7
- browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
8
- end
9
-
10
- describe '#append' do
11
- it 'appends the text to the text field', except: {browser: :safari, reason: 'incorrectly clears first'} do
12
- browser.text_field(name: 'new_user_occupation').append(' Append This')
13
- expect(browser.text_field(name: 'new_user_occupation').value).to eq 'Developer Append This'
14
- end
15
-
16
- it 'appends multi-byte characters', except: {browser: :safari, reason: 'incorrectly clears first'} do
17
- browser.text_field(name: 'new_user_occupation').append(' ijij')
18
- expect(browser.text_field(name: 'new_user_occupation').value).to eq 'Developer ijij'
19
- end
20
-
21
- it 'raises NotImplementedError if the object is content editable element' do
22
- msg = '#append method is not supported with contenteditable element'
23
- expect { browser.div(id: 'contenteditable').append('bar') }.to raise_exception(NotImplementedError, msg)
24
- end
25
-
26
- it 'raises ObjectReadOnlyException if the object is read only' do
27
- expect { browser.text_field(id: 'new_user_code').append('Append This') }.to raise_object_read_only_exception
28
- end
29
-
30
- it 'raises ObjectDisabledException if the object is disabled' do
31
- expect { browser.text_field(name: 'new_user_species').append('Append This') }.to raise_object_disabled_exception
32
- end
33
-
34
- it "raises UnknownObjectException if the object doesn't exist" do
35
- expect { browser.text_field(name: 'no_such_name').append('Append This') }.to raise_unknown_object_exception
36
- end
37
- end
38
-
39
- describe '#clear' do
40
- it 'removes all text from the text field' do
41
- browser.text_field(name: 'new_user_occupation').clear
42
- expect(browser.text_field(name: 'new_user_occupation').value).to be_empty
43
- browser.textarea(id: 'delete_user_comment').clear
44
- expect(browser.textarea(id: 'delete_user_comment').value).to be_empty
45
- end
46
-
47
- it 'removes all text from the content editable element' do
48
- browser.div(id: 'contenteditable').clear
49
- expect(browser.div(id: 'contenteditable').text).to eq ''
50
- end
51
-
52
- it "raises UnknownObjectException if the text field doesn't exist" do
53
- expect { browser.text_field(id: 'no_such_id').clear }.to raise_unknown_object_exception
54
- end
55
-
56
- it 'raises ObjectReadOnlyException if the object is read only' do
57
- expect { browser.text_field(id: 'new_user_code').clear }.to raise_object_read_only_exception
58
- end
59
- end
60
-
61
- describe '#value=' do
62
- it 'sets the value of the element' do
63
- browser.text_field(id: 'new_user_email').value = 'Hello Cruel World'
64
- expect(browser.text_field(id: 'new_user_email').value).to eq 'Hello Cruel World'
65
- end
66
-
67
- it 'is able to set multi-byte characters' do
68
- browser.text_field(name: 'new_user_occupation').value = 'ijij'
69
- expect(browser.text_field(name: 'new_user_occupation').value).to eq 'ijij'
70
- end
71
-
72
- it 'sets the value of a textarea element' do
73
- browser.textarea(id: 'delete_user_comment').value = 'Hello Cruel World'
74
- expect(browser.textarea(id: 'delete_user_comment').value).to eq 'Hello Cruel World'
75
- end
76
-
77
- it "raises UnknownObjectException if the text field doesn't exist" do
78
- expect { browser.text_field(name: 'no_such_name').value = 'yo' }.to raise_unknown_object_exception
79
- end
80
- end
81
-
82
- describe '#set' do
83
- it 'sets the value of the element' do
84
- browser.text_field(id: 'new_user_email').set('Bye Cruel World')
85
- expect(browser.text_field(id: 'new_user_email').value).to eq 'Bye Cruel World'
86
- end
87
-
88
- it 'sets the value of a textarea element' do
89
- browser.textarea(id: 'delete_user_comment').set('Hello Cruel World')
90
- expect(browser.textarea(id: 'delete_user_comment').value).to eq 'Hello Cruel World'
91
- end
92
-
93
- it 'sets the value of a content editable element' do
94
- browser.div(id: 'contenteditable').set('Bar')
95
- expect(browser.div(id: 'contenteditable').text).to eq 'Bar'
96
- end
97
-
98
- it 'fires events' do
99
- browser.text_field(id: 'new_user_username').set('Hello World')
100
- expect(browser.span(id: 'current_length').text).to eq '11'
101
- end
102
-
103
- it 'sets the value of a password field' do
104
- browser.text_field(name: 'new_user_password').set('secret')
105
- expect(browser.text_field(name: 'new_user_password').value).to eq 'secret'
106
- end
107
-
108
- it 'sets the value when accessed through the enclosing Form' do
109
- browser.form(id: 'new_user').text_field(name: 'new_user_password').set('secret')
110
- expect(browser.form(id: 'new_user').text_field(name: 'new_user_password').value).to eq 'secret'
111
- end
112
-
113
- it 'is able to set multi-byte characters' do
114
- browser.text_field(name: 'new_user_occupation').set('ijij')
115
- expect(browser.text_field(name: 'new_user_occupation').value).to eq 'ijij'
116
- end
117
-
118
- it 'sets the value to a concatenation of multiple arguments' do
119
- browser.text_field(id: 'new_user_email').set('Bye', 'Cruel', 'World')
120
- expect(browser.text_field(id: 'new_user_email').value).to eq 'ByeCruelWorld'
121
- end
122
-
123
- it 'sets the value to blank when no arguments are provided' do
124
- browser.text_field(id: 'new_user_email').set
125
- expect(browser.text_field(id: 'new_user_email').value).to eq ''
126
- end
127
-
128
- it "raises UnknownObjectException if the text field doesn't exist" do
129
- expect { browser.text_field(id: 'no_such_id').set('secret') }.to raise_unknown_object_exception
130
- end
131
-
132
- it 'raises ObjectReadOnlyException if the object is read only' do
133
- expect { browser.text_field(id: 'new_user_code').set('Foo') }.to raise_object_read_only_exception
134
- end
135
- end
136
-
137
- describe '#set!' do
138
- it 'sets the value of the element' do
139
- browser.text_field(id: 'new_user_email').set!('Bye Cruel World')
140
- expect(browser.text_field(id: 'new_user_email').value).to eq 'Bye Cruel World'
141
- end
142
-
143
- it 'sets the value of a textarea element' do
144
- browser.textarea(id: 'delete_user_comment').set!('Hello Cruel World')
145
- expect(browser.textarea(id: 'delete_user_comment').value).to eq 'Hello Cruel World'
146
- end
147
-
148
- it 'sets the value of a content editable element' do
149
- browser.div(id: 'contenteditable').set!('foo')
150
- expect(browser.div(id: 'contenteditable').text).to eq 'foo'
151
- end
152
-
153
- it 'fires events' do
154
- browser.text_field(id: 'new_user_username').set!('Hello World')
155
- expect(browser.span(id: 'current_length').text).to eq '11'
156
- end
157
-
158
- it 'sets the value of a password field' do
159
- browser.text_field(name: 'new_user_password').set!('secret')
160
- expect(browser.text_field(name: 'new_user_password').value).to eq 'secret'
161
- end
162
-
163
- it 'sets the value when accessed through the enclosing Form' do
164
- browser.form(id: 'new_user').text_field(name: 'new_user_password').set!('secret')
165
- expect(browser.form(id: 'new_user').text_field(name: 'new_user_password').value).to eq 'secret'
166
- end
167
-
168
- it 'is able to set multi-byte characters' do
169
- browser.text_field(name: 'new_user_occupation').set!('ijij')
170
- expect(browser.text_field(name: 'new_user_occupation').value).to eq 'ijij'
171
- end
172
-
173
- it 'sets the value to a concatenation of multiple arguments' do
174
- browser.text_field(id: 'new_user_email').set!('Bye', 'Cruel', 'World')
175
- expect(browser.text_field(id: 'new_user_email').value).to eq 'ByeCruelWorld'
176
- end
177
-
178
- it 'sets the value to blank when no arguments are provided' do
179
- browser.text_field(id: 'new_user_email').set!
180
- expect(browser.text_field(id: 'new_user_email').value).to eq ''
181
- end
182
-
183
- it 'raises ArgumentError for special keys' do
184
- expect { browser.text_field(id: 'new_user_email').set!('a', :tab) }.to raise_error(ArgumentError)
185
- end
186
-
187
- it "raises UnknownObjectException if the text field doesn't exist" do
188
- expect { browser.text_field(id: 'no_such_id').set!('secret') }.to raise_unknown_object_exception
189
- end
190
-
191
- it "raises Exception if the value of text field doesn't match" do
192
- element = browser.text_field(id: 'new_user_password')
193
- allow(element).to receive(:value).and_return('wrong')
194
- msg = "#set! value: 'wrong' does not match expected input: 'secret'"
195
- expect { element.set!('secret') }.to raise_exception(Watir::Exception::Error, msg)
196
- end
197
-
198
- it "raises Exception if the text of content editable element doesn't match" do
199
- element = browser.div(id: 'contenteditable')
200
- allow(element).to receive(:text).and_return('wrong')
201
- msg = "#set! text: 'wrong' does not match expected input: 'secret'"
202
- expect { element.set!('secret') }.to raise_exception(Watir::Exception::Error, msg)
5
+ module Watir
6
+ describe UserEditable do
7
+ before do
8
+ browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
9
+ end
10
+
11
+ describe '#append' do
12
+ it 'appends the text to the text field', except: {browser: :safari, reason: 'incorrectly clears first'} do
13
+ browser.text_field(name: 'new_user_occupation').append(' Append This')
14
+ expect(browser.text_field(name: 'new_user_occupation').value).to eq 'Developer Append This'
15
+ end
16
+
17
+ it 'appends multi-byte characters', except: {browser: :safari, reason: 'incorrectly clears first'} do
18
+ browser.text_field(name: 'new_user_occupation').append(' ijij')
19
+ expect(browser.text_field(name: 'new_user_occupation').value).to eq 'Developer ijij'
20
+ end
21
+
22
+ it 'raises NotImplementedError if the object is content editable element' do
23
+ msg = '#append method is not supported with contenteditable element'
24
+ expect { browser.div(id: 'contenteditable').append('bar') }.to raise_exception(NotImplementedError, msg)
25
+ end
26
+
27
+ it 'raises ObjectReadOnlyException if the object is read only' do
28
+ expect { browser.text_field(id: 'new_user_code').append('Append This') }.to raise_object_read_only_exception
29
+ end
30
+
31
+ it 'raises ObjectDisabledException if the object is disabled' do
32
+ expect { browser.text_field(name: 'new_user_species').append('Append This') }.to raise_object_disabled_exception
33
+ end
34
+
35
+ it "raises UnknownObjectException if the object doesn't exist" do
36
+ expect { browser.text_field(name: 'no_such_name').append('Append This') }.to raise_unknown_object_exception
37
+ end
38
+ end
39
+
40
+ describe '#clear' do
41
+ it 'removes all text from the text field' do
42
+ browser.text_field(name: 'new_user_occupation').clear
43
+ expect(browser.text_field(name: 'new_user_occupation').value).to be_empty
44
+ browser.textarea(id: 'delete_user_comment').clear
45
+ expect(browser.textarea(id: 'delete_user_comment').value).to be_empty
46
+ end
47
+
48
+ it 'removes all text from the content editable element' do
49
+ browser.div(id: 'contenteditable').clear
50
+ expect(browser.div(id: 'contenteditable').text).to eq ''
51
+ end
52
+
53
+ it "raises UnknownObjectException if the text field doesn't exist" do
54
+ expect { browser.text_field(id: 'no_such_id').clear }.to raise_unknown_object_exception
55
+ end
56
+
57
+ it 'raises ObjectReadOnlyException if the object is read only' do
58
+ expect { browser.text_field(id: 'new_user_code').clear }.to raise_object_read_only_exception
59
+ end
60
+ end
61
+
62
+ describe '#value=' do
63
+ it 'sets the value of the element' do
64
+ browser.text_field(id: 'new_user_email').value = 'Hello Cruel World'
65
+ expect(browser.text_field(id: 'new_user_email').value).to eq 'Hello Cruel World'
66
+ end
67
+
68
+ it 'is able to set multi-byte characters' do
69
+ browser.text_field(name: 'new_user_occupation').value = 'ijij'
70
+ expect(browser.text_field(name: 'new_user_occupation').value).to eq 'ijij'
71
+ end
72
+
73
+ it 'sets the value of a textarea element' do
74
+ browser.textarea(id: 'delete_user_comment').value = 'Hello Cruel World'
75
+ expect(browser.textarea(id: 'delete_user_comment').value).to eq 'Hello Cruel World'
76
+ end
77
+
78
+ it "raises UnknownObjectException if the text field doesn't exist" do
79
+ expect { browser.text_field(name: 'no_such_name').value = 'yo' }.to raise_unknown_object_exception
80
+ end
81
+ end
82
+
83
+ describe '#set' do
84
+ it 'sets the value of the element' do
85
+ browser.text_field(id: 'new_user_email').set('Bye Cruel World')
86
+ expect(browser.text_field(id: 'new_user_email').value).to eq 'Bye Cruel World'
87
+ end
88
+
89
+ it 'sets the value of a textarea element' do
90
+ browser.textarea(id: 'delete_user_comment').set('Hello Cruel World')
91
+ expect(browser.textarea(id: 'delete_user_comment').value).to eq 'Hello Cruel World'
92
+ end
93
+
94
+ it 'sets the value of a content editable element' do
95
+ browser.div(id: 'contenteditable').set('Bar')
96
+ expect(browser.div(id: 'contenteditable').text).to eq 'Bar'
97
+ end
98
+
99
+ it 'fires events' do
100
+ browser.text_field(id: 'new_user_username').set('Hello World')
101
+ expect(browser.span(id: 'current_length').text).to eq '11'
102
+ end
103
+
104
+ it 'sets the value of a password field' do
105
+ browser.text_field(name: 'new_user_password').set('secret')
106
+ expect(browser.text_field(name: 'new_user_password').value).to eq 'secret'
107
+ end
108
+
109
+ it 'sets the value when accessed through the enclosing Form' do
110
+ browser.form(id: 'new_user').text_field(name: 'new_user_password').set('secret')
111
+ expect(browser.form(id: 'new_user').text_field(name: 'new_user_password').value).to eq 'secret'
112
+ end
113
+
114
+ it 'is able to set multi-byte characters' do
115
+ browser.text_field(name: 'new_user_occupation').set('ijij')
116
+ expect(browser.text_field(name: 'new_user_occupation').value).to eq 'ijij'
117
+ end
118
+
119
+ it 'sets the value to a concatenation of multiple arguments' do
120
+ browser.text_field(id: 'new_user_email').set('Bye', 'Cruel', 'World')
121
+ expect(browser.text_field(id: 'new_user_email').value).to eq 'ByeCruelWorld'
122
+ end
123
+
124
+ it 'sets the value to blank when no arguments are provided' do
125
+ browser.text_field(id: 'new_user_email').set
126
+ expect(browser.text_field(id: 'new_user_email').value).to eq ''
127
+ end
128
+
129
+ it "raises UnknownObjectException if the text field doesn't exist" do
130
+ expect { browser.text_field(id: 'no_such_id').set('secret') }.to raise_unknown_object_exception
131
+ end
132
+
133
+ it 'raises ObjectReadOnlyException if the object is read only' do
134
+ expect { browser.text_field(id: 'new_user_code').set('Foo') }.to raise_object_read_only_exception
135
+ end
136
+ end
137
+
138
+ describe '#set!' do
139
+ it 'sets the value of the element' do
140
+ browser.text_field(id: 'new_user_email').set!('Bye Cruel World')
141
+ expect(browser.text_field(id: 'new_user_email').value).to eq 'Bye Cruel World'
142
+ end
143
+
144
+ it 'sets the value of a textarea element' do
145
+ browser.textarea(id: 'delete_user_comment').set!('Hello Cruel World')
146
+ expect(browser.textarea(id: 'delete_user_comment').value).to eq 'Hello Cruel World'
147
+ end
148
+
149
+ it 'sets the value of a content editable element' do
150
+ browser.div(id: 'contenteditable').set!('foo')
151
+ expect(browser.div(id: 'contenteditable').text).to eq 'foo'
152
+ end
153
+
154
+ it 'fires events' do
155
+ browser.text_field(id: 'new_user_username').set!('Hello World')
156
+ expect(browser.span(id: 'current_length').text).to eq '11'
157
+ end
158
+
159
+ it 'sets the value of a password field' do
160
+ browser.text_field(name: 'new_user_password').set!('secret')
161
+ expect(browser.text_field(name: 'new_user_password').value).to eq 'secret'
162
+ end
163
+
164
+ it 'sets the value when accessed through the enclosing Form' do
165
+ browser.form(id: 'new_user').text_field(name: 'new_user_password').set!('secret')
166
+ expect(browser.form(id: 'new_user').text_field(name: 'new_user_password').value).to eq 'secret'
167
+ end
168
+
169
+ it 'is able to set multi-byte characters' do
170
+ browser.text_field(name: 'new_user_occupation').set!('ijij')
171
+ expect(browser.text_field(name: 'new_user_occupation').value).to eq 'ijij'
172
+ end
173
+
174
+ it 'sets the value to a concatenation of multiple arguments' do
175
+ browser.text_field(id: 'new_user_email').set!('Bye', 'Cruel', 'World')
176
+ expect(browser.text_field(id: 'new_user_email').value).to eq 'ByeCruelWorld'
177
+ end
178
+
179
+ it 'sets the value to blank when no arguments are provided' do
180
+ browser.text_field(id: 'new_user_email').set!
181
+ expect(browser.text_field(id: 'new_user_email').value).to eq ''
182
+ end
183
+
184
+ it 'raises ArgumentError for special keys' do
185
+ expect { browser.text_field(id: 'new_user_email').set!('a', :tab) }.to raise_error(ArgumentError)
186
+ end
187
+
188
+ it "raises UnknownObjectException if the text field doesn't exist" do
189
+ expect { browser.text_field(id: 'no_such_id').set!('secret') }.to raise_unknown_object_exception
190
+ end
191
+
192
+ it "raises Exception if the value of text field doesn't match" do
193
+ element = browser.text_field(id: 'new_user_password')
194
+ allow(element).to receive(:value).and_return('wrong')
195
+ msg = "#set! value: 'wrong' does not match expected input: 'secret'"
196
+ expect { element.set!('secret') }.to raise_exception(Watir::Exception::Error, msg)
197
+ end
198
+
199
+ it "raises Exception if the text of content editable element doesn't match" do
200
+ element = browser.div(id: 'contenteditable')
201
+ allow(element).to receive(:text).and_return('wrong')
202
+ msg = "#set! text: 'wrong' does not match expected input: 'secret'"
203
+ expect { element.set!('secret') }.to raise_exception(Watir::Exception::Error, msg)
204
+ end
203
205
  end
204
206
  end
205
207
  end