Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/rb/spec/integration/selenium/webdriver/target_locator_spec.rb
1864 views
1
# frozen_string_literal: true
2
3
# Licensed to the Software Freedom Conservancy (SFC) under one
4
# or more contributor license agreements. See the NOTICE file
5
# distributed with this work for additional information
6
# regarding copyright ownership. The SFC licenses this file
7
# to you under the Apache License, Version 2.0 (the
8
# "License"); you may not use this file except in compliance
9
# with the License. You may obtain a copy of the License at
10
#
11
# http://www.apache.org/licenses/LICENSE-2.0
12
#
13
# Unless required by applicable law or agreed to in writing,
14
# software distributed under the License is distributed on an
15
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16
# KIND, either express or implied. See the License for the
17
# specific language governing permissions and limitations
18
# under the License.
19
20
require_relative 'spec_helper'
21
22
module Selenium
23
module WebDriver
24
describe TargetLocator, exclusive: {bidi: false, reason: 'Not yet implemented with BiDi'} do
25
before { @original_window = driver.window_handle }
26
27
after do
28
if GlobalTestEnv.rbe? && GlobalTestEnv.browser == :chrome
29
reset_driver!
30
else
31
handles = driver.window_handles
32
driver.switch_to.window(@original_window) if handles.include?(@original_window)
33
34
(handles - [driver.window_handle]).each do |handle|
35
driver.switch_to.window(handle) { driver.close }
36
end
37
end
38
end
39
40
let(:new_window) { driver.window_handles.find { |handle| handle != driver.window_handle } }
41
42
it 'finds the active element' do
43
driver.navigate.to url_for('xhtmlTest.html')
44
expect(driver.switch_to.active_element).to be_an_instance_of(WebDriver::Element)
45
end
46
47
# Doesn't switch to frame by id directly
48
it 'switches to a frame directly' do
49
driver.navigate.to url_for('iframes.html')
50
driver.switch_to.frame('iframe1')
51
52
expect(driver.find_element(name: 'login')).to be_a(WebDriver::Element)
53
end
54
55
it 'switches to a frame by Element' do
56
driver.navigate.to url_for('iframes.html')
57
58
iframe = driver.find_element(tag_name: 'iframe')
59
driver.switch_to.frame(iframe)
60
61
expect(driver.find_element(name: 'login')).to be_a(WebDriver::Element)
62
end
63
64
it 'switches to parent frame' do
65
driver.navigate.to url_for('iframes.html')
66
67
iframe = driver.find_element(tag_name: 'iframe')
68
driver.switch_to.frame(iframe)
69
70
expect(driver.find_element(name: 'login')).to be_a(WebDriver::Element)
71
72
driver.switch_to.parent_frame
73
expect(driver.find_element(id: 'iframe_page_heading')).to be_a(WebDriver::Element)
74
end
75
76
context 'when switching windows' do
77
describe '#new_window' do
78
it 'switches to a new window' do
79
driver.switch_to.new_window(:window)
80
81
expect(driver.window_handles.size).to eq 2
82
expect(driver.window_handle).not_to eq @original_window
83
end
84
85
it 'switches to a new tab' do
86
driver.switch_to.new_window(:tab)
87
88
expect(driver.window_handles.size).to eq 2
89
expect(driver.window_handle).not_to eq @original_window
90
end
91
92
it 'raises exception when the new window type is not recognized' do
93
expect {
94
driver.switch_to.new_window(:unknown)
95
}.to raise_error(ArgumentError)
96
end
97
98
it 'switches to the new window then close it when given a block' do
99
driver.switch_to.new_window do
100
expect(driver.window_handles.size).to eq 2
101
end
102
103
expect(driver.window_handles.size).to eq 1
104
expect(driver.window_handle).to eq @original_window
105
end
106
107
it 'does not error if switching to a new window with a block that closes window' do
108
expect {
109
driver.switch_to.new_window { driver.close }
110
}.not_to raise_exception
111
end
112
end
113
114
it 'switches to a window and back when given a block' do
115
driver.navigate.to url_for('xhtmlTest.html')
116
117
driver.find_element(link: 'Open new window').click
118
wait.until { driver.window_handles.size == 2 }
119
expect(driver.title).to eq('XHTML Test Page')
120
121
driver.switch_to.window(new_window) do
122
wait.until { driver.title == 'We Arrive Here' }
123
end
124
125
wait.until { driver.title == 'XHTML Test Page' }
126
end
127
128
it 'handles exceptions inside the block' do
129
driver.navigate.to url_for('xhtmlTest.html')
130
131
driver.find_element(link: 'Open new window').click
132
wait.until { driver.window_handles.size == 2 }
133
expect(driver.title).to eq('XHTML Test Page')
134
135
expect {
136
driver.switch_to.window(new_window) { raise 'foo' }
137
}.to raise_error(RuntimeError, 'foo')
138
139
expect(driver.title).to eq('XHTML Test Page')
140
end
141
142
it 'switches to a window without a block' do
143
driver.navigate.to url_for('xhtmlTest.html')
144
145
driver.find_element(link: 'Open new window').click
146
wait.until { driver.window_handles.size == 2 }
147
expect(driver.title).to eq('XHTML Test Page')
148
149
driver.switch_to.window(new_window)
150
wait.until { driver.title == 'We Arrive Here' }
151
expect(driver.title).to eq('We Arrive Here')
152
end
153
154
it 'uses the original window if the block closes the popup' do
155
driver.navigate.to url_for('xhtmlTest.html')
156
157
driver.find_element(link: 'Open new window').click
158
wait.until { driver.window_handles.size == 2 }
159
expect(driver.title).to eq('XHTML Test Page')
160
161
driver.switch_to.window(new_window) do
162
wait.until { driver.title == 'We Arrive Here' }
163
driver.close
164
end
165
166
expect(driver.current_url).to include('xhtmlTest.html')
167
expect(driver.title).to eq('XHTML Test Page')
168
end
169
end
170
171
context 'with more than two windows', except: [{browser: %i[safari safari_preview]},
172
{driver: :remote, browser: :ie}] do
173
it 'closes current window via block' do
174
driver.navigate.to url_for('xhtmlTest.html')
175
wait_for_element(link: 'Create a new anonymous window')
176
driver.find_element(link: 'Create a new anonymous window').click
177
wait.until { driver.window_handles.size == 2 }
178
driver.find_element(link: 'Open new window').click
179
wait.until { driver.window_handles.size == 3 }
180
driver.switch_to.window(new_window)
181
182
driver.switch_to.window(driver.window_handle) { driver.close }
183
expect(driver.window_handles.size).to eq 2
184
end
185
186
it 'closes another window' do
187
driver.navigate.to url_for('xhtmlTest.html')
188
wait_for_element(link: 'Create a new anonymous window')
189
driver.find_element(link: 'Create a new anonymous window').click
190
wait.until { driver.window_handles.size == 2 }
191
driver.find_element(link: 'Open new window').click
192
wait.until { driver.window_handles.size == 3 }
193
194
window_to_close = driver.window_handles.last
195
196
driver.switch_to.window(window_to_close) { driver.close }
197
expect(driver.window_handles.size).to eq 2
198
end
199
200
it 'iterates over open windows when current window is not closed' do
201
driver.navigate.to url_for('xhtmlTest.html')
202
wait_for_element(link: 'Create a new anonymous window')
203
driver.find_element(link: 'Create a new anonymous window').click
204
wait.until { driver.window_handles.size == 2 }
205
driver.find_element(link: 'Open new window').click
206
wait.until { driver.window_handles.size == 3 }
207
208
titles = {}
209
driver.window_handles.each do |wh|
210
driver.switch_to.window(wh) { titles[driver.title] = driver.window_handle }
211
end
212
213
handle = titles['We Arrive Here']
214
215
driver.switch_to.window(handle)
216
expect(driver.title).to eq('We Arrive Here')
217
end
218
219
it 'iterates over open windows when current window is closed' do
220
driver.navigate.to url_for('xhtmlTest.html')
221
wait_for_element(link: 'Create a new anonymous window')
222
driver.find_element(link: 'Create a new anonymous window').click
223
wait.until { driver.window_handles.size == 2 }
224
driver.find_element(link: 'Open new window').click
225
wait.until { driver.window_handles.size == 3 }
226
227
driver.close
228
229
titles = {}
230
driver.window_handles.each do |wh|
231
driver.switch_to.window(wh) { titles[driver.title] = wh }
232
end
233
234
handle = titles['We Arrive Here']
235
driver.switch_to.window(handle)
236
expect(driver.title).to eq('We Arrive Here')
237
end
238
end
239
240
it 'switches to a window and execute a block when current window is closed' do
241
driver.navigate.to url_for('xhtmlTest.html')
242
driver.find_element(link: 'Open new window').click
243
wait.until { driver.window_handles.size == 2 }
244
245
driver.switch_to.window(new_window)
246
wait.until { driver.title == 'We Arrive Here' }
247
248
driver.close
249
250
driver.switch_to.window(driver.window_handles.first) do
251
wait.until { driver.title == 'XHTML Test Page' }
252
end
253
254
expect(driver.title).to eq('XHTML Test Page')
255
end
256
257
it 'switches to default content' do
258
driver.navigate.to url_for('iframes.html')
259
260
driver.switch_to.frame 0
261
driver.switch_to.default_content
262
263
expect(driver.find_elements(id: 'iframe_page_heading').size).to be_positive
264
end
265
266
# Edge BUG - https://connect.microsoft.com/IE/feedback/details/1850030
267
describe 'alerts' do
268
it 'allows the user to accept an alert' do
269
driver.navigate.to url_for('alerts.html')
270
driver.find_element(id: 'alert').click
271
272
alert = wait_for_alert
273
alert.accept
274
wait_for_no_alert
275
276
expect(driver.title).to eq('Testing Alerts')
277
end
278
279
it 'allows the user to dismiss an alert' do
280
driver.navigate.to url_for('alerts.html')
281
driver.find_element(id: 'alert').click
282
283
alert = wait_for_alert
284
alert.dismiss
285
wait_for_no_alert
286
287
expect(driver.title).to eq('Testing Alerts')
288
end
289
290
it 'allows the user to set the value of a prompt' do
291
driver.navigate.to url_for('alerts.html')
292
driver.find_element(id: 'prompt').click
293
294
alert = wait_for_alert
295
alert.send_keys 'cheese'
296
alert.accept
297
298
text = driver.find_element(id: 'text').text
299
expect(text).to eq('cheese')
300
end
301
302
it 'allows the user to get the text of an alert' do
303
driver.navigate.to url_for('alerts.html')
304
driver.find_element(id: 'alert').click
305
306
alert = wait_for_alert
307
text = alert.text
308
alert.accept
309
310
expect(text).to eq('cheese')
311
wait_for_no_alert
312
end
313
314
it 'raises when calling #text on a closed alert' do
315
driver.navigate.to url_for('alerts.html')
316
wait_for_element(id: 'alert')
317
318
driver.find_element(id: 'alert').click
319
320
alert = wait_for_alert
321
alert.accept
322
323
wait_for_no_alert
324
expect { alert.text }.to raise_error(Selenium::WebDriver::Error::NoSuchAlertError)
325
end
326
327
it 'raises NoAlertOpenError if no alert is present' do
328
expect { driver.switch_to.alert }.to raise_error(Selenium::WebDriver::Error::NoSuchAlertError)
329
end
330
331
describe 'unhandled alert error' do
332
it 'raises an UnexpectedAlertOpenError if an alert has not been dealt with' do
333
driver.navigate.to url_for('alerts.html')
334
driver.find_element(id: 'alert').click
335
wait_for_alert
336
337
expect { driver.title }.to raise_error(Selenium::WebDriver::Error::UnexpectedAlertOpenError)
338
end
339
end
340
end
341
end
342
end # WebDriver
343
end # Selenium
344
345