blob: f639725fe22846e6b020f1b0d83e4f94a722f43c [file] [log] [blame] [edit]
import pytest
from support.asserts import assert_error, assert_success, assert_dialog_handled, assert_same_element
from support.fixtures import create_dialog
from support.inline import inline
def assert_result_is_active_element(session, result):
"""Ensure that the provided object is a successful WebDriver response
describing an element reference and that the referenced element matches the
element returned by the `activeElement` attribute of the current browsing
context's active document."""
assert result.status == 200
from_js = session.execute_script("return document.activeElement;")
if result.body["value"] is None:
assert from_js == None
else:
assert_same_element(session, result.body["value"], from_js)
# > 1. If the current browsing context is no longer open, return error with
# > error code no such window.
def test_closed_context(session, create_window):
new_window = create_window()
session.window_handle = new_window
session.close()
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_error(result, "no such window")
# [...]
# 2. Handle any user prompts and return its value if it is an error.
# [...]
# In order to handle any user prompts a remote end must take the following
# steps:
# 2. Run the substeps of the first matching user prompt handler:
#
# [...]
# - dismiss state
# 1. Dismiss the current user prompt.
# [...]
#
# 3. Return success.
def test_handle_prompt_dismiss(new_session):
_, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "dismiss"}})
session.url = inline("<body><p>Hello, World!</p></body>")
create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
assert_dialog_handled(session, "dismiss #1")
assert session.execute_script("return dismiss1;") == None
create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
assert_dialog_handled(session, "dismiss #2")
assert read_global(session, "dismiss2") == None
create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
assert_dialog_handled(session, "dismiss #3")
assert read_global(session, "dismiss3") == None
# [...]
# 2. Handle any user prompts and return its value if it is an error.
# [...]
# In order to handle any user prompts a remote end must take the following
# steps:
# 2. Run the substeps of the first matching user prompt handler:
#
# [...]
# - accept state
# 1. Accept the current user prompt.
# [...]
#
# 3. Return success.
def test_handle_prompt_accept(new_session):
_, session = new_session({"alwaysMatch": {"unhandledPromptBehavior": "accept"}})
session.url = inline("<body><p>Hello, World!</p></body>")
create_dialog(session)("alert", text="accept #1", result_var="accept1")
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
assert_dialog_handled(session, "accept #1")
assert read_global(session, "accept1") == None
create_dialog(session)("confirm", text="accept #2", result_var="accept2")
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
assert_dialog_handled(session, "accept #2")
assert read_global(session, "accept2"), True
create_dialog(session)("prompt", text="accept #3", result_var="accept3")
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
assert_dialog_handled(session, "accept #3")
assert read_global(session, "accept3") == ""
# [...]
# 2. Handle any user prompts and return its value if it is an error.
# [...]
# In order to handle any user prompts a remote end must take the following
# steps:
# 2. Run the substeps of the first matching user prompt handler:
#
# [...]
# - missing value default state
# - not in the table of simple dialogs
# 1. Dismiss the current user prompt.
# 2. Return error with error code unexpected alert open.
def test_handle_prompt_missing_value(session, create_dialog):
session.url = inline("<body><p>Hello, World!</p></body>")
create_dialog("alert", text="dismiss #1", result_var="dismiss1")
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_error(result, "unexpected alert open")
assert_dialog_handled(session, "dismiss #1")
assert session.execute_script("return accept1;") == None
create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_error(result, "unexpected alert open")
assert_dialog_handled(session, "dismiss #2")
assert session.execute_script("return dismiss2;") == False
create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
result = session.transport.send("GET",
"session/%s/element/active" % session.session_id)
assert_error(result, "unexpected alert open")
assert_dialog_handled(session, "dismiss #3")
assert session.execute_script("return dismiss3;") == None
# > [...]
# > 3. Let active element be the active element of the current browsing
# > context's document element.
# > 4. Let active web element be the JSON Serialization of active element.
# > 5. Return success with data active web element.
def test_success_document(session):
session.url = inline("""
<body>
<h1>Heading</h1>
<input />
<input />
<input style="opacity: 0;" />
<p>Another element</p>
</body>""")
result = session.transport.send("GET", "session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
def test_sucess_input(session):
session.url = inline("""
<body>
<h1>Heading</h1>
<input autofocus />
<input style="opacity: 0;" />
<p>Another element</p>
</body>""")
result = session.transport.send("GET", "session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
def test_sucess_input_non_interactable(session):
session.url = inline("""
<body>
<h1>Heading</h1>
<input />
<input style="opacity: 0;" autofocus />
<p>Another element</p>
</body>""")
result = session.transport.send("GET", "session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
def test_success_explicit_focus(session):
session.url = inline("""
<body>
<h1>Heading</h1>
<input />
<iframe></iframe>
</body>""")
session.execute_script("document.body.getElementsByTagName('h1')[0].focus();")
result = session.transport.send("GET", "session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
session.execute_script("document.body.getElementsByTagName('input')[0].focus();")
result = session.transport.send("GET", "session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
session.execute_script("document.body.getElementsByTagName('iframe')[0].focus();")
result = session.transport.send("GET", "session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
session.execute_script("document.body.getElementsByTagName('iframe')[0].focus();")
session.execute_script("document.body.getElementsByTagName('iframe')[0].remove();")
result = session.transport.send("GET", "session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
session.execute_script("document.body.appendChild(document.createElement('textarea'));")
result = session.transport.send("GET", "session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
def test_success_iframe_content(session):
session.url = inline("<body></body>")
session.execute_script("""
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
var input = iframe.contentDocument.createElement('input');
iframe.contentDocument.body.appendChild(input);
input.focus();""")
result = session.transport.send("GET", "session/%s/element/active" % session.session_id)
assert_result_is_active_element(session, result)
def test_sucess_without_body(session):
session.url = inline("<body></body>")
session.execute_script("document.body.remove();")
result = session.transport.send("GET", "session/%s/element/active"% session.session_id)
assert_result_is_active_element(session, result)