summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webdriver/tests/classic/switch_to_frame/switch.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/webdriver/tests/classic/switch_to_frame/switch.py')
-rw-r--r--testing/web-platform/tests/webdriver/tests/classic/switch_to_frame/switch.py125
1 files changed, 125 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webdriver/tests/classic/switch_to_frame/switch.py b/testing/web-platform/tests/webdriver/tests/classic/switch_to_frame/switch.py
new file mode 100644
index 0000000000..b9cccb3ecc
--- /dev/null
+++ b/testing/web-platform/tests/webdriver/tests/classic/switch_to_frame/switch.py
@@ -0,0 +1,125 @@
+import pytest
+
+import webdriver.protocol as protocol
+
+from webdriver import NoSuchElementException
+from webdriver.transport import Response
+
+from tests.support.asserts import assert_error, assert_same_element, assert_success
+
+
+def switch_to_frame(session, frame):
+ return session.transport.send(
+ "POST", "session/{session_id}/frame".format(**vars(session)),
+ {"id": frame},
+ encoder=protocol.Encoder, decoder=protocol.Decoder,
+ session=session)
+
+
+def test_null_parameter_value(session, http):
+ path = "/session/{session_id}/frame".format(**vars(session))
+ with http.post(path, None) as response:
+ assert_error(Response.from_http(response), "invalid argument")
+
+
+def test_null_response_value(session, inline, iframe):
+ session.url = inline(iframe("<p>foo"))
+ frame = session.find.css("iframe", all=False)
+
+ response = switch_to_frame(session, frame)
+ value = assert_success(response)
+ assert value is None
+
+
+@pytest.mark.parametrize("id", [
+ None,
+ 0,
+ {"element-6066-11e4-a52e-4f735466cecf": "foo"},
+])
+def test_no_top_browsing_context(session, url, id):
+ session.window_handle = session.new_window()
+
+ session.url = url("/webdriver/tests/support/html/frames.html")
+
+ subframe = session.find.css("#sub-frame", all=False)
+ session.switch_frame(subframe)
+
+ session.window.close()
+
+ response = switch_to_frame(session, id)
+ assert_error(response, "no such window")
+
+
+@pytest.mark.parametrize("id", [
+ None,
+ 0,
+ {"element-6066-11e4-a52e-4f735466cecf": "foo"},
+])
+def test_no_browsing_context(session, closed_frame, id):
+ response = switch_to_frame(session, id)
+ if id is None:
+ assert_success(response)
+ session.find.css("#delete", all=False)
+ else:
+ assert_error(response, "no such window")
+
+
+def test_no_browsing_context_when_already_top_level(session, closed_window):
+ response = switch_to_frame(session, None)
+ assert_error(response, "no such window")
+
+
+@pytest.mark.parametrize("value", ["foo", True, [], {}])
+def test_frame_id_invalid_types(session, value):
+ response = switch_to_frame(session, value)
+ assert_error(response, "invalid argument")
+
+
+def test_frame_id_shadow_root(session, get_test_page):
+ session.url = get_test_page()
+
+ element = session.find.css("custom-element", all=False)
+
+ result = switch_to_frame(session, element.shadow_root)
+ assert_error(result, "invalid argument")
+
+
+def test_frame_id_null(session, inline, iframe):
+ session.url = inline(iframe("{}<div>foo".format(iframe("<p>bar"))))
+
+ frame1 = session.find.css("iframe", all=False)
+ session.switch_frame(frame1)
+ element1 = session.find.css("div", all=False)
+
+ frame2 = session.find.css("iframe", all=False)
+ session.switch_frame(frame2)
+ element2 = session.find.css("p", all=False)
+
+ # Switch to top-level browsing context
+ response = switch_to_frame(session, None)
+ assert_success(response)
+
+ with pytest.raises(NoSuchElementException):
+ element2.text
+ with pytest.raises(NoSuchElementException):
+ element1.text
+
+ frame = session.find.css("iframe", all=False)
+ assert_same_element(session, frame, frame1)
+
+
+def test_find_element_while_frame_is_still_loading(session, url):
+ session.timeouts.implicit = 5
+
+ frame_url = url("/webdriver/tests/support/html/subframe.html?pipe=trickle(d2)")
+ page_url = "<html><body><iframe src='{}'></iframe></body></html>".format(frame_url)
+
+ session.execute_script(
+ "document.documentElement.innerHTML = arguments[0];", args=[page_url])
+
+ frame1 = session.find.css("iframe", all=False)
+ session.switch_frame(frame1)
+
+ # Ensure that the is always a valid browsing context, and the element
+ # can be found eventually.
+ session.find.css("#delete", all=False)