import pytest from webdriver.error import NoSuchAlertException from webdriver.transport import Response from tests.support.asserts import assert_error, assert_success from tests.support.sync import Poll def execute_async_script(session, script, args=None): if args is None: args = [] body = {"script": script, "args": args} return session.transport.send( "POST", "/session/{session_id}/execute/async".format(**vars(session)), body) def test_null_parameter_value(session, http): path = "/session/{session_id}/execute/async".format(**vars(session)) with http.post(path, None) as response: assert_error(Response.from_http(response), "invalid argument") def test_no_top_browsing_context(session, closed_window): response = execute_async_script(session, "argument[0](1);") assert_error(response, "no such window") def test_no_browsing_context(session, closed_frame): response = execute_async_script(session, "argument[0](1);") assert_error(response, "no such window") @pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) def test_abort_by_user_prompt(session, dialog_type): response = execute_async_script( session, "window.{}('Hello'); arguments[0](1);".format(dialog_type)) assert_success(response, None) session.alert.accept() @pytest.mark.parametrize("dialog_type", ["alert", "confirm", "prompt"]) def test_abort_by_user_prompt_twice(session, dialog_type): response = execute_async_script( session, "window.{0}('Hello'); window.{0}('Bye'); arguments[0](1);".format(dialog_type)) assert_success(response, None) session.alert.accept() # The first alert has been accepted by the user prompt handler, the second # alert will still be opened because the current step isn't aborted. wait = Poll( session, timeout=5, message="Second alert has not been opened", ignored_exceptions=NoSuchAlertException ) text = wait.until(lambda s: s.alert.text) assert text == "Bye" session.alert.accept()