diff --git a/playwright/_impl/_api_types.py b/playwright/_impl/_api_types.py index 5682159c3..f4627ae7f 100644 --- a/playwright/_impl/_api_types.py +++ b/playwright/_impl/_api_types.py @@ -16,10 +16,14 @@ # stable API. +from typing import Optional + + class Error(Exception): - def __init__(self, message: str, stack: str = None) -> None: + def __init__(self, message: str) -> None: self.message = message - self.stack = stack + self.name: Optional[str] = None + self.stack: Optional[str] = None super().__init__(message) diff --git a/playwright/_impl/_helper.py b/playwright/_impl/_helper.py index 895788d3c..8516fe0a3 100644 --- a/playwright/_impl/_helper.py +++ b/playwright/_impl/_helper.py @@ -170,9 +170,10 @@ def parse_error(error: ErrorPayload) -> Error: base_error_class = Error if error.get("name") == "TimeoutError": base_error_class = TimeoutError - return base_error_class( - cast(str, patch_error_message(error.get("message"))), error["stack"] - ) + exc = base_error_class(cast(str, patch_error_message(error.get("message")))) + exc.name = error["name"] + exc.stack = error["stack"] + return exc def patch_error_message(message: Optional[str]) -> Optional[str]: diff --git a/tests/async/test_page.py b/tests/async/test_page.py index 5723cd130..edf964859 100644 --- a/tests/async/test_page.py +++ b/tests/async/test_page.py @@ -398,6 +398,7 @@ async def test_page_error_should_fire(page, server, is_webkit): async with page.expect_event("pageerror") as error_info: await page.goto(server.PREFIX + "/error.html") error = await error_info.value + assert error.name == "Error" assert error.message == "Fancy error!" stack = await page.evaluate("window.e.stack") # Note that WebKit reports the stack of the 'throw' statement instead of the Error constructor call. @@ -422,15 +423,28 @@ async def test_page_error_should_handle_object(page, is_chromium): assert error.message == "Object" if is_chromium else "[object Object]" -@pytest.mark.skip_browser("firefox") async def test_page_error_should_handle_window(page, is_chromium): - # Firefox just does not report this error. async with page.expect_event("pageerror") as error_info: await page.evaluate("() => setTimeout(() => { throw window; }, 0)") error = await error_info.value assert error.message == "Window" if is_chromium else "[object Window]" +async def test_page_error_should_pass_error_name_property(page): + async with page.expect_event("pageerror") as error_info: + await page.evaluate( + """() => setTimeout(() => { + const error = new Error("my-message"); + error.name = "my-name"; + throw error; + }, 0) + """ + ) + error = await error_info.value + assert error.message == "my-message" + assert error.name == "my-name" + + expected_output = "