Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
SeleniumHQ
GitHub Repository: SeleniumHQ/Selenium
Path: blob/trunk/py/test/selenium/webdriver/common/frame_switching_tests.py
1865 views
1
# Licensed to the Software Freedom Conservancy (SFC) under one
2
# or more contributor license agreements. See the NOTICE file
3
# distributed with this work for additional information
4
# regarding copyright ownership. The SFC licenses this file
5
# to you under the Apache License, Version 2.0 (the
6
# "License"); you may not use this file except in compliance
7
# with the License. You may obtain a copy of the License at
8
#
9
# http://www.apache.org/licenses/LICENSE-2.0
10
#
11
# Unless required by applicable law or agreed to in writing,
12
# software distributed under the License is distributed on an
13
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
# KIND, either express or implied. See the License for the
15
# specific language governing permissions and limitations
16
# under the License.
17
18
import pytest
19
20
from selenium.common.exceptions import NoSuchElementException, NoSuchFrameException, WebDriverException
21
from selenium.webdriver.common.by import By
22
from selenium.webdriver.support import expected_conditions as EC
23
from selenium.webdriver.support.ui import WebDriverWait
24
25
# ----------------------------------------------------------------------------------------------
26
#
27
# Tests that WebDriver doesn't do anything fishy when it navigates to a page with frames.
28
#
29
# ----------------------------------------------------------------------------------------------
30
31
32
@pytest.fixture(autouse=True)
33
def restore_default_context(driver):
34
yield
35
driver.switch_to.default_content()
36
37
38
def test_should_always_focus_on_the_top_most_frame_after_anavigation_event(driver, pages):
39
pages.load("frameset.html")
40
driver.find_element(By.TAG_NAME, "frameset") # Test passes if this does not throw.
41
42
43
def test_should_not_automatically_switch_focus_to_an_iframe_when_apage_containing_them_is_loaded(driver, pages):
44
pages.load("iframes.html")
45
driver.find_element(By.ID, "iframe_page_heading")
46
47
48
def test_should_open_page_with_broken_frameset(driver, pages):
49
pages.load("framesetPage3.html")
50
51
frame1 = driver.find_element(By.ID, "first")
52
driver.switch_to.frame(frame1)
53
driver.switch_to.default_content()
54
55
frame2 = driver.find_element(By.ID, "second")
56
driver.switch_to.frame(frame2) # IE9 can not switch to this broken frame - it has no window.
57
58
59
# ----------------------------------------------------------------------------------------------
60
#
61
# Tests that WebDriver can switch to frames as expected.
62
#
63
# ----------------------------------------------------------------------------------------------
64
65
66
def test_should_be_able_to_switch_to_aframe_by_its_index(driver, pages):
67
pages.load("frameset.html")
68
driver.switch_to.frame(1)
69
assert driver.find_element(By.ID, "pageNumber").text == "2"
70
71
72
def test_should_be_able_to_switch_to_an_iframe_by_its_index(driver, pages):
73
pages.load("iframes.html")
74
driver.switch_to.frame(0)
75
assert driver.find_element(By.NAME, "id-name1").get_attribute("value") == "name"
76
77
78
def test_should_be_able_to_switch_to_aframe_by_its_name(driver, pages):
79
pages.load("frameset.html")
80
driver.switch_to.frame("fourth")
81
assert driver.find_element(By.TAG_NAME, "frame").get_attribute("name") == "child1"
82
83
84
def test_should_be_able_to_switch_to_an_iframe_by_its_name(driver, pages):
85
pages.load("iframes.html")
86
driver.switch_to.frame("iframe1-name")
87
assert driver.find_element(By.NAME, "id-name1").get_attribute("value") == "name"
88
89
90
def test_should_be_able_to_switch_to_aframe_by_its_id(driver, pages):
91
pages.load("frameset.html")
92
driver.switch_to.frame("fifth")
93
assert driver.find_element(By.NAME, "windowOne").text == "Open new window"
94
95
96
def test_should_be_able_to_switch_to_an_iframe_by_its_id(driver, pages):
97
pages.load("iframes.html")
98
driver.switch_to.frame("iframe1")
99
assert driver.find_element(By.NAME, "id-name1").get_attribute("value") == "name"
100
101
102
def test_should_be_able_to_switch_to_frame_with_name_containing_dot(driver, pages):
103
pages.load("frameset.html")
104
driver.switch_to.frame("sixth.iframe1")
105
assert "Page number 3" in driver.find_element(By.TAG_NAME, "body").text
106
107
108
def test_should_be_able_to_switch_to_aframe_using_apreviously_located_web_element(driver, pages):
109
pages.load("frameset.html")
110
frame = driver.find_element(By.TAG_NAME, "frame")
111
driver.switch_to.frame(frame)
112
assert driver.find_element(By.ID, "pageNumber").text == "1"
113
114
115
def test_should_be_able_to_switch_to_an_iframe_using_apreviously_located_web_element(driver, pages):
116
pages.load("iframes.html")
117
frame = driver.find_element(By.TAG_NAME, "iframe")
118
driver.switch_to.frame(frame)
119
120
element = driver.find_element(By.NAME, "id-name1")
121
assert element.get_attribute("value") == "name"
122
123
124
def test_should_ensure_element_is_aframe_before_switching(driver, pages):
125
pages.load("frameset.html")
126
frame = driver.find_element(By.TAG_NAME, "frameset")
127
with pytest.raises(NoSuchFrameException):
128
driver.switch_to.frame(frame)
129
130
131
def test_frame_searches_should_be_relative_to_the_currently_selected_frame(driver, pages):
132
pages.load("frameset.html")
133
driver.switch_to.frame("second")
134
assert driver.find_element(By.ID, "pageNumber").text == "2"
135
136
with pytest.raises(NoSuchElementException):
137
driver.switch_to.frame(driver.find_element(By.NAME, "third"))
138
139
driver.switch_to.default_content()
140
driver.switch_to.frame(driver.find_element(By.NAME, "third"))
141
142
with pytest.raises(NoSuchFrameException):
143
driver.switch_to.frame("second")
144
145
driver.switch_to.default_content()
146
driver.switch_to.frame(driver.find_element(By.NAME, "second"))
147
assert driver.find_element(By.ID, "pageNumber").text == "2"
148
149
150
def test_should_select_child_frames_by_chained_calls(driver, pages):
151
pages.load("frameset.html")
152
driver.switch_to.frame(driver.find_element(By.NAME, "fourth"))
153
driver.switch_to.frame(driver.find_element(By.NAME, "child2"))
154
assert driver.find_element(By.ID, "pageNumber").text == "11"
155
156
157
def test_should_throw_frame_not_found_exception_looking_up_sub_frames_with_super_frame_names(driver, pages):
158
pages.load("frameset.html")
159
driver.switch_to.frame(driver.find_element(By.NAME, "fourth"))
160
with pytest.raises(NoSuchElementException):
161
driver.switch_to.frame(driver.find_element(By.NAME, "second"))
162
163
164
def test_should_throw_an_exception_when_aframe_cannot_be_found(driver, pages):
165
pages.load("xhtmlTest.html")
166
with pytest.raises(NoSuchElementException):
167
driver.switch_to.frame(driver.find_element(By.NAME, "Nothing here"))
168
169
170
def test_should_throw_an_exception_when_aframe_cannot_be_found_by_index(driver, pages):
171
pages.load("xhtmlTest.html")
172
with pytest.raises(NoSuchFrameException):
173
driver.switch_to.frame(27)
174
175
176
def test_should_be_able_to_switch_to_parent_frame(driver, pages):
177
pages.load("frameset.html")
178
driver.switch_to.frame(driver.find_element(By.NAME, "fourth"))
179
driver.switch_to.parent_frame()
180
driver.switch_to.frame(driver.find_element(By.NAME, "first"))
181
assert driver.find_element(By.ID, "pageNumber").text == "1"
182
183
184
@pytest.mark.xfail_safari
185
def test_should_be_able_to_switch_to_parent_frame_from_asecond_level_frame(driver, pages):
186
pages.load("frameset.html")
187
driver.switch_to.frame(driver.find_element(By.NAME, "fourth"))
188
driver.switch_to.frame(driver.find_element(By.NAME, "child1"))
189
driver.switch_to.parent_frame()
190
driver.switch_to.frame(driver.find_element(By.NAME, "child2"))
191
assert driver.find_element(By.ID, "pageNumber").text == "11"
192
193
194
def test_switching_to_parent_frame_from_default_context_is_no_op(driver, pages):
195
pages.load("xhtmlTest.html")
196
driver.switch_to.parent_frame()
197
assert driver.title == "XHTML Test Page"
198
199
200
def test_should_be_able_to_switch_to_parent_from_an_iframe(driver, pages):
201
pages.load("iframes.html")
202
driver.switch_to.frame(0)
203
driver.switch_to.parent_frame()
204
driver.find_element(By.ID, "iframe_page_heading")
205
206
207
# ----------------------------------------------------------------------------------------------
208
#
209
# General frame handling behavior tests
210
#
211
# ----------------------------------------------------------------------------------------------
212
213
214
def test_should_continue_to_refer_to_the_same_frame_once_it_has_been_selected(driver, pages):
215
pages.load("frameset.html")
216
driver.switch_to.frame(2)
217
checkbox = driver.find_element(By.XPATH, "//input[@name='checky']")
218
checkbox.click()
219
checkbox.submit()
220
221
# TODO(simon): this should not be needed, and is only here because IE's submit returns too
222
# soon.
223
224
WebDriverWait(driver, 3).until(EC.text_to_be_present_in_element((By.XPATH, "//p"), "Success!"))
225
226
227
@pytest.mark.xfail_firefox(raises=WebDriverException, reason="https://github.com/mozilla/geckodriver/issues/610")
228
@pytest.mark.xfail_remote(raises=WebDriverException, reason="https://github.com/mozilla/geckodriver/issues/610")
229
@pytest.mark.xfail_safari
230
@pytest.mark.xfail_chrome
231
@pytest.mark.xfail_edge
232
def test_should_focus_on_the_replacement_when_aframe_follows_alink_to_a_top_targeted_page(driver, pages):
233
pages.load("frameset.html")
234
driver.switch_to.frame(0)
235
driver.find_element(By.LINK_TEXT, "top").click()
236
237
expectedTitle = "XHTML Test Page"
238
239
WebDriverWait(driver, 3).until(EC.title_is(expectedTitle))
240
WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, "only-exists-on-xhtmltest")))
241
242
243
def test_should_allow_auser_to_switch_from_an_iframe_back_to_the_main_content_of_the_page(driver, pages):
244
pages.load("iframes.html")
245
driver.switch_to.frame(0)
246
driver.switch_to.default_content()
247
driver.find_element(By.ID, "iframe_page_heading")
248
249
250
def test_should_allow_the_user_to_switch_to_an_iframe_and_remain_focused_on_it(driver, pages):
251
pages.load("iframes.html")
252
driver.switch_to.frame(0)
253
driver.find_element(By.ID, "submitButton").click()
254
assert get_text_of_greeting_element(driver) == "Success!"
255
256
257
def get_text_of_greeting_element(driver):
258
return WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, "greeting"))).text
259
260
261
def test_should_be_able_to_click_in_aframe(driver, pages):
262
pages.load("frameset.html")
263
driver.switch_to.frame("third")
264
265
# This should replace frame "third" ...
266
driver.find_element(By.ID, "submitButton").click()
267
# driver should still be focused on frame "third" ...
268
assert get_text_of_greeting_element(driver) == "Success!"
269
# Make sure it was really frame "third" which was replaced ...
270
driver.switch_to.default_content()
271
driver.switch_to.frame("third")
272
assert get_text_of_greeting_element(driver) == "Success!"
273
274
275
def test_should_be_able_to_click_in_aframe_that_rewrites_top_window_location(driver, pages):
276
pages.load("click_tests/issue5237.html")
277
driver.switch_to.frame(driver.find_element(By.ID, "search"))
278
driver.find_element(By.ID, "submit").click()
279
driver.switch_to.default_content()
280
WebDriverWait(driver, 3).until(EC.title_is("Target page for issue 5237"))
281
282
283
def test_should_be_able_to_click_in_asub_frame(driver, pages):
284
pages.load("frameset.html")
285
driver.switch_to.frame(driver.find_element(By.ID, "sixth"))
286
driver.switch_to.frame(driver.find_element(By.ID, "iframe1"))
287
288
# This should replace frame "iframe1" inside frame "sixth" ...
289
driver.find_element(By.ID, "submitButton").click()
290
# driver should still be focused on frame "iframe1" inside frame "sixth" ...
291
assert get_text_of_greeting_element(driver), "Success!"
292
# Make sure it was really frame "iframe1" inside frame "sixth" which was replaced ...
293
driver.switch_to.default_content()
294
driver.switch_to.frame(driver.find_element(By.ID, "sixth"))
295
driver.switch_to.frame(driver.find_element(By.ID, "iframe1"))
296
assert driver.find_element(By.ID, "greeting").text == "Success!"
297
298
299
def test_should_be_able_to_find_elements_in_iframes_by_xpath(driver, pages):
300
pages.load("iframes.html")
301
driver.switch_to.frame(driver.find_element(By.ID, "iframe1"))
302
element = driver.find_element(By.XPATH, "//*[@id = 'changeme']")
303
assert element is not None
304
305
306
def test_get_current_url_returns_top_level_browsing_context_url(driver, pages):
307
pages.load("frameset.html")
308
assert "frameset.html" in driver.current_url
309
driver.switch_to.frame(driver.find_element(By.NAME, "second"))
310
assert "frameset.html" in driver.current_url
311
312
313
def test_get_current_url_returns_top_level_browsing_context_url_for_iframes(driver, pages):
314
pages.load("iframes.html")
315
assert "iframes.html" in driver.current_url
316
driver.switch_to.frame(driver.find_element(By.ID, "iframe1"))
317
assert "iframes.html" in driver.current_url
318
319
320
def test_should_be_able_to_switch_to_the_top_if_the_frame_is_deleted_from_under_us(driver, pages):
321
pages.load("frame_switching_tests/deletingFrame.html")
322
driver.switch_to.frame(driver.find_element(By.ID, "iframe1"))
323
324
killIframe = driver.find_element(By.ID, "killIframe")
325
killIframe.click()
326
driver.switch_to.default_content()
327
WebDriverWait(driver, 3).until_not(EC.presence_of_element_located((By.ID, "iframe1")))
328
329
addIFrame = driver.find_element(By.ID, "addBackFrame")
330
addIFrame.click()
331
WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, "iframe1")))
332
driver.switch_to.frame(driver.find_element(By.ID, "iframe1"))
333
WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, "success")))
334
335
336
def test_should_be_able_to_switch_to_the_top_if_the_frame_is_deleted_from_under_us_with_frame_index(driver, pages):
337
pages.load("frame_switching_tests/deletingFrame.html")
338
iframe = 0
339
WebDriverWait(driver, 3).until(EC.frame_to_be_available_and_switch_to_it(iframe))
340
# we should be in the frame now
341
killIframe = driver.find_element(By.ID, "killIframe")
342
killIframe.click()
343
driver.switch_to.default_content()
344
345
addIFrame = driver.find_element(By.ID, "addBackFrame")
346
addIFrame.click()
347
WebDriverWait(driver, 3).until(EC.frame_to_be_available_and_switch_to_it(iframe))
348
WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, "success")))
349
350
351
def test_frame_to_be_available_and_switch_to_it_using_string_inputs(driver, pages):
352
# Similar to above test, but using `iframe = "iframe1"` instead of `iframe = 0`
353
pages.load("frame_switching_tests/deletingFrame.html")
354
iframe = "iframe1"
355
WebDriverWait(driver, 3).until(EC.frame_to_be_available_and_switch_to_it(iframe))
356
# we should be in the frame now
357
killIframe = driver.find_element(By.ID, "killIframe")
358
killIframe.click()
359
driver.switch_to.default_content()
360
361
addIFrame = driver.find_element(By.ID, "addBackFrame")
362
addIFrame.click()
363
WebDriverWait(driver, 3).until(EC.frame_to_be_available_and_switch_to_it(iframe))
364
WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, "success")))
365
366
367
def test_should_be_able_to_switch_to_the_top_if_the_frame_is_deleted_from_under_us_with_webelement(driver, pages):
368
pages.load("frame_switching_tests/deletingFrame.html")
369
iframe = driver.find_element(By.ID, "iframe1")
370
WebDriverWait(driver, 3).until(EC.frame_to_be_available_and_switch_to_it(iframe))
371
# we should be in the frame now
372
killIframe = driver.find_element(By.ID, "killIframe")
373
killIframe.click()
374
driver.switch_to.default_content()
375
376
addIFrame = driver.find_element(By.ID, "addBackFrame")
377
addIFrame.click()
378
379
iframe = driver.find_element(By.ID, "iframe1")
380
WebDriverWait(driver, 3).until(EC.frame_to_be_available_and_switch_to_it(iframe))
381
WebDriverWait(driver, 3).until(EC.presence_of_element_located((By.ID, "success")))
382
383
384
# @pytest.mark.xfail_chrome(raises=NoSuchElementException)
385
# @pytest.mark.xfail_edge(raises=NoSuchElementException)
386
# @pytest.mark.xfail_firefox(raises=WebDriverException,
387
# reason='https://github.com/mozilla/geckodriver/issues/614')
388
# @pytest.mark.xfail_remote(raises=WebDriverException,
389
# reason='https://github.com/mozilla/geckodriver/issues/614')
390
# @pytest.mark.xfail_webkitgtk(raises=NoSuchElementException)
391
# @pytest.mark.xfail_safari
392
# def test_should_not_be_able_to_do_anything_the_frame_is_deleted_from_under_us(driver, pages):
393
# pages.load("frame_switching_tests/deletingFrame.html")
394
# driver.switch_to.frame(driver.find_element(By.ID, "iframe1"))
395
396
# killIframe = driver.find_element(By.ID, "killIframe")
397
# killIframe.click()
398
399
# with pytest.raises(NoSuchFrameException):
400
# driver.find_element(By.ID, "killIframe").click()
401
402
403
def test_should_return_window_title_in_aframeset(driver, pages):
404
pages.load("frameset.html")
405
driver.switch_to.frame(driver.find_element(By.NAME, "third"))
406
assert "Unique title" == driver.title
407
408
409
def test_java_script_should_execute_in_the_context_of_the_current_frame(driver, pages):
410
pages.load("frameset.html")
411
assert driver.execute_script("return window == window.top")
412
driver.switch_to.frame(driver.find_element(By.NAME, "third"))
413
assert driver.execute_script("return window != window.top")
414
415
416
def test_get_should_switch_to_default_context(driver, pages):
417
pages.load("iframes.html")
418
driver.find_element(By.ID, "iframe1")
419
driver.switch_to.frame(driver.find_element(By.ID, "iframe1"))
420
driver.find_element(By.ID, "cheese") # Found on formPage.html but not on iframes.html.
421
pages.load("iframes.html") # This must effectively switch_to.default_content(), too.
422
driver.find_element(By.ID, "iframe1")
423
424