switch.py (3826B)
1 import pytest 2 3 import webdriver.protocol as protocol 4 5 from webdriver import NoSuchElementException 6 from webdriver.transport import Response 7 8 from tests.support.asserts import assert_error, assert_same_element, assert_success 9 10 11 def switch_to_frame(session, frame): 12 return session.transport.send( 13 "POST", "session/{session_id}/frame".format(**vars(session)), 14 {"id": frame}, 15 encoder=protocol.Encoder, decoder=protocol.Decoder, 16 session=session) 17 18 19 def test_null_parameter_value(session, http): 20 path = "/session/{session_id}/frame".format(**vars(session)) 21 with http.post(path, None) as response: 22 assert_error(Response.from_http(response), "invalid argument") 23 24 25 def test_null_response_value(session, inline, iframe): 26 session.url = inline(iframe("<p>foo")) 27 frame = session.find.css("iframe", all=False) 28 29 response = switch_to_frame(session, frame) 30 value = assert_success(response) 31 assert value is None 32 33 34 @pytest.mark.parametrize("id", [ 35 None, 36 0, 37 {"element-6066-11e4-a52e-4f735466cecf": "foo"}, 38 ]) 39 def test_no_top_browsing_context(session, url, id): 40 session.window_handle = session.new_window() 41 42 session.url = url("/webdriver/tests/support/html/frames.html") 43 44 subframe = session.find.css("#sub-frame", all=False) 45 session.switch_to_frame(subframe) 46 47 session.window.close() 48 49 response = switch_to_frame(session, id) 50 assert_error(response, "no such window") 51 52 53 @pytest.mark.parametrize("id", [ 54 None, 55 0, 56 {"element-6066-11e4-a52e-4f735466cecf": "foo"}, 57 ]) 58 def test_no_browsing_context(session, closed_frame, id): 59 response = switch_to_frame(session, id) 60 if id is None: 61 assert_success(response) 62 session.find.css("#delete", all=False) 63 else: 64 assert_error(response, "no such window") 65 66 67 def test_no_browsing_context_when_already_top_level(session, closed_window): 68 response = switch_to_frame(session, None) 69 assert_error(response, "no such window") 70 71 72 @pytest.mark.parametrize("value", ["foo", True, [], {}]) 73 def test_frame_id_invalid_types(session, value): 74 response = switch_to_frame(session, value) 75 assert_error(response, "invalid argument") 76 77 78 def test_frame_id_shadow_root(session, get_test_page): 79 session.url = get_test_page() 80 81 element = session.find.css("custom-element", all=False) 82 83 result = switch_to_frame(session, element.shadow_root) 84 assert_error(result, "invalid argument") 85 86 87 def test_frame_id_null(session, inline, iframe): 88 session.url = inline(iframe("{}<div>foo".format(iframe("<p>bar")))) 89 90 frame1 = session.find.css("iframe", all=False) 91 session.switch_to_frame(frame1) 92 element1 = session.find.css("div", all=False) 93 94 frame2 = session.find.css("iframe", all=False) 95 session.switch_to_frame(frame2) 96 element2 = session.find.css("p", all=False) 97 98 # Switch to top-level browsing context 99 response = switch_to_frame(session, None) 100 assert_success(response) 101 102 with pytest.raises(NoSuchElementException): 103 element2.text 104 with pytest.raises(NoSuchElementException): 105 element1.text 106 107 frame = session.find.css("iframe", all=False) 108 assert_same_element(session, frame, frame1) 109 110 111 def test_find_element_while_frame_is_still_loading(session, url): 112 session.timeouts.implicit = 5 113 114 frame_url = url("/webdriver/tests/support/html/subframe.html?pipe=trickle(d2)") 115 page_url = "<html><body><iframe src='{}'></iframe></body></html>".format(frame_url) 116 117 session.execute_script( 118 "document.documentElement.innerHTML = arguments[0];", args=[page_url]) 119 120 frame1 = session.find.css("iframe", all=False) 121 session.switch_to_frame(frame1) 122 123 # Ensure that the is always a valid browsing context, and the element 124 # can be found eventually. 125 session.find.css("#delete", all=False)