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