1# META: timeout=long 2 3import pytest 4 5from tests.support.asserts import assert_dialog_handled, assert_error, assert_success 6 7 8def execute_async_script(session, script, args=None): 9 if args is None: 10 args = [] 11 body = {"script": script, "args": args} 12 13 return session.transport.send( 14 "POST", "/session/{session_id}/execute/async".format(**vars(session)), 15 body) 16 17 18@pytest.fixture 19def check_user_prompt_closed_without_exception(session, create_dialog): 20 def check_user_prompt_closed_without_exception(dialog_type, retval): 21 create_dialog(dialog_type, text=dialog_type) 22 23 response = execute_async_script(session, "window.result = 1; arguments[0](1);") 24 assert_success(response, 1) 25 26 assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval) 27 28 assert session.execute_script("return window.result;") == 1 29 30 return check_user_prompt_closed_without_exception 31 32 return check_user_prompt_closed_without_exception 33 34 35@pytest.fixture 36def check_user_prompt_closed_with_exception(session, create_dialog): 37 def check_user_prompt_closed_with_exception(dialog_type, retval): 38 create_dialog(dialog_type, text=dialog_type) 39 40 response = execute_async_script(session, "window.result = 1; arguments[0](1);") 41 assert_error(response, "unexpected alert open") 42 43 assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval) 44 45 assert session.execute_script("return window.result;") is None 46 47 return check_user_prompt_closed_with_exception 48 49 50@pytest.fixture 51def check_user_prompt_not_closed_but_exception(session, create_dialog): 52 def check_user_prompt_not_closed_but_exception(dialog_type): 53 create_dialog(dialog_type, text=dialog_type) 54 55 response = execute_async_script(session, "window.result = 1; arguments[0](1);") 56 assert_error(response, "unexpected alert open") 57 58 assert session.alert.text == dialog_type 59 session.alert.dismiss() 60 61 assert session.execute_script("return window.result;") is None 62 63 return check_user_prompt_not_closed_but_exception 64 65 66@pytest.mark.capabilities({"unhandledPromptBehavior": "accept"}) 67@pytest.mark.parametrize("dialog_type, retval", [ 68 ("alert", None), 69 ("confirm", True), 70 ("prompt", ""), 71]) 72def test_accept(check_user_prompt_closed_without_exception, dialog_type, retval): 73 check_user_prompt_closed_without_exception(dialog_type, retval) 74 75 76@pytest.mark.capabilities({"unhandledPromptBehavior": "accept and notify"}) 77@pytest.mark.parametrize("dialog_type, retval", [ 78 ("alert", None), 79 ("confirm", True), 80 ("prompt", ""), 81]) 82def test_accept_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval): 83 check_user_prompt_closed_with_exception(dialog_type, retval) 84 85 86@pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss"}) 87@pytest.mark.parametrize("dialog_type, retval", [ 88 ("alert", None), 89 ("confirm", False), 90 ("prompt", None), 91]) 92def test_dismiss(check_user_prompt_closed_without_exception, dialog_type, retval): 93 check_user_prompt_closed_without_exception(dialog_type, retval) 94 95 96@pytest.mark.capabilities({"unhandledPromptBehavior": "dismiss and notify"}) 97@pytest.mark.parametrize("dialog_type, retval", [ 98 ("alert", None), 99 ("confirm", False), 100 ("prompt", None), 101]) 102def test_dismiss_and_notify(check_user_prompt_closed_with_exception, dialog_type, retval): 103 check_user_prompt_closed_with_exception(dialog_type, retval) 104 105 106@pytest.mark.capabilities({"unhandledPromptBehavior": "ignore"}) 107@pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) 108def test_ignore(check_user_prompt_not_closed_but_exception, dialog_type): 109 check_user_prompt_not_closed_but_exception(dialog_type) 110 111 112@pytest.mark.parametrize("dialog_type, retval", [ 113 ("alert", None), 114 ("confirm", False), 115 ("prompt", None), 116]) 117def test_default(check_user_prompt_closed_with_exception, dialog_type, retval): 118 check_user_prompt_closed_with_exception(dialog_type, retval) 119