Skip to content

Commit 5d976dc

Browse files
authored
feat(pageerror): added Error.name property support (#652)
1 parent 027c1fb commit 5d976dc

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

playwright/_impl/_api_types.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,14 @@
1616
# stable API.
1717

1818

19+
from typing import Optional
20+
21+
1922
class Error(Exception):
20-
def __init__(self, message: str, stack: str = None) -> None:
23+
def __init__(self, message: str) -> None:
2124
self.message = message
22-
self.stack = stack
25+
self.name: Optional[str] = None
26+
self.stack: Optional[str] = None
2327
super().__init__(message)
2428

2529

playwright/_impl/_helper.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,10 @@ def parse_error(error: ErrorPayload) -> Error:
170170
base_error_class = Error
171171
if error.get("name") == "TimeoutError":
172172
base_error_class = TimeoutError
173-
return base_error_class(
174-
cast(str, patch_error_message(error.get("message"))), error["stack"]
175-
)
173+
exc = base_error_class(cast(str, patch_error_message(error.get("message"))))
174+
exc.name = error["name"]
175+
exc.stack = error["stack"]
176+
return exc
176177

177178

178179
def patch_error_message(message: Optional[str]) -> Optional[str]:

tests/async/test_page.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ async def test_page_error_should_fire(page, server, is_webkit):
398398
async with page.expect_event("pageerror") as error_info:
399399
await page.goto(server.PREFIX + "/error.html")
400400
error = await error_info.value
401+
assert error.name == "Error"
401402
assert error.message == "Fancy error!"
402403
stack = await page.evaluate("window.e.stack")
403404
# 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):
422423
assert error.message == "Object" if is_chromium else "[object Object]"
423424

424425

425-
@pytest.mark.skip_browser("firefox")
426426
async def test_page_error_should_handle_window(page, is_chromium):
427-
# Firefox just does not report this error.
428427
async with page.expect_event("pageerror") as error_info:
429428
await page.evaluate("() => setTimeout(() => { throw window; }, 0)")
430429
error = await error_info.value
431430
assert error.message == "Window" if is_chromium else "[object Window]"
432431

433432

433+
async def test_page_error_should_pass_error_name_property(page):
434+
async with page.expect_event("pageerror") as error_info:
435+
await page.evaluate(
436+
"""() => setTimeout(() => {
437+
const error = new Error("my-message");
438+
error.name = "my-name";
439+
throw error;
440+
}, 0)
441+
"""
442+
)
443+
error = await error_info.value
444+
assert error.message == "my-message"
445+
assert error.name == "my-name"
446+
447+
434448
expected_output = "<html><head></head><body><div>hello</div></body></html>"
435449

436450

0 commit comments

Comments
 (0)