1import pytest
2
3from webdriver.error import NoSuchAlertException
4from webdriver.transport import Response
5
6from tests.support.asserts import assert_error, assert_success
7from tests.support.sync import Poll
8
9
10def execute_async_script(session, script, args=None):
11    if args is None:
12        args = []
13    body = {"script": script, "args": args}
14
15    return session.transport.send(
16        "POST", "/session/{session_id}/execute/async".format(**vars(session)),
17        body)
18
19
20def test_null_parameter_value(session, http):
21    path = "/session/{session_id}/execute/async".format(**vars(session))
22    with http.post(path, None) as response:
23        assert_error(Response.from_http(response), "invalid argument")
24
25
26def test_no_top_browsing_context(session, closed_window):
27    response = execute_async_script(session, "argument[0](1);")
28    assert_error(response, "no such window")
29
30
31def test_no_browsing_context(session, closed_frame):
32    response = execute_async_script(session, "argument[0](1);")
33    assert_error(response, "no such window")
34
35
36@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
37def test_abort_by_user_prompt(session, dialog_type):
38    response = execute_async_script(
39        session,
40        "window.{}('Hello'); arguments[0](1);".format(dialog_type))
41    assert_success(response, None)
42
43    session.alert.accept()
44
45
46@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"])
47def test_abort_by_user_prompt_twice(session, dialog_type):
48    response = execute_async_script(
49        session,
50        "window.{0}('Hello'); window.{0}('Bye'); arguments[0](1);".format(dialog_type))
51    assert_success(response, None)
52
53    session.alert.accept()
54
55    # The first alert has been accepted by the user prompt handler, the second
56    # alert will still be opened because the current step isn't aborted.
57    wait = Poll(
58        session,
59        timeout=5,
60        message="Second alert has not been opened",
61        ignored_exceptions=NoSuchAlertException
62    )
63    text = wait.until(lambda s: s.alert.text)
64
65    assert text == "Bye"
66
67    session.alert.accept()
68