From dffa098606633b6ca4573c4ab12ba7808337ae07 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Wed, 22 Jan 2025 16:34:49 +0100 Subject: [PATCH] fix(webError): fix WebError when using sync API (#2721) --- playwright/_impl/_browser_context.py | 5 ++++- playwright/_impl/_web_error.py | 9 +++++++-- playwright/async_api/__init__.py | 2 ++ playwright/sync_api/__init__.py | 2 ++ tests/async/test_browsercontext_events.py | 10 +++++++++- tests/sync/test_browsercontext_events.py | 10 +++++++++- 6 files changed, 33 insertions(+), 5 deletions(-) diff --git a/playwright/_impl/_browser_context.py b/playwright/_impl/_browser_context.py index f415d5900..e5a9b14fd 100644 --- a/playwright/_impl/_browser_context.py +++ b/playwright/_impl/_browser_context.py @@ -692,7 +692,10 @@ def _on_dialog(self, dialog: Dialog) -> None: asyncio.create_task(dialog.dismiss()) def _on_page_error(self, error: Error, page: Optional[Page]) -> None: - self.emit(BrowserContext.Events.WebError, WebError(self._loop, page, error)) + self.emit( + BrowserContext.Events.WebError, + WebError(self._loop, self._dispatcher_fiber, page, error), + ) if page: page.emit(Page.Events.PageError, error) diff --git a/playwright/_impl/_web_error.py b/playwright/_impl/_web_error.py index eb1b51948..345f95b8f 100644 --- a/playwright/_impl/_web_error.py +++ b/playwright/_impl/_web_error.py @@ -13,7 +13,7 @@ # limitations under the License. from asyncio import AbstractEventLoop -from typing import Optional +from typing import Any, Optional from playwright._impl._helper import Error from playwright._impl._page import Page @@ -21,9 +21,14 @@ class WebError: def __init__( - self, loop: AbstractEventLoop, page: Optional[Page], error: Error + self, + loop: AbstractEventLoop, + dispatcher_fiber: Any, + page: Optional[Page], + error: Error, ) -> None: self._loop = loop + self._dispatcher_fiber = dispatcher_fiber self._page = page self._error = error diff --git a/playwright/async_api/__init__.py b/playwright/async_api/__init__.py index a64a066c2..be918f53c 100644 --- a/playwright/async_api/__init__.py +++ b/playwright/async_api/__init__.py @@ -60,6 +60,7 @@ Selectors, Touchscreen, Video, + WebError, WebSocket, WebSocketRoute, Worker, @@ -190,6 +191,7 @@ def __call__( "Touchscreen", "Video", "ViewportSize", + "WebError", "WebSocket", "WebSocketRoute", "Worker", diff --git a/playwright/sync_api/__init__.py b/playwright/sync_api/__init__.py index 80eaf71db..136433982 100644 --- a/playwright/sync_api/__init__.py +++ b/playwright/sync_api/__init__.py @@ -60,6 +60,7 @@ Selectors, Touchscreen, Video, + WebError, WebSocket, WebSocketRoute, Worker, @@ -190,6 +191,7 @@ def __call__( "Touchscreen", "Video", "ViewportSize", + "WebError", "WebSocket", "WebSocketRoute", "Worker", diff --git a/tests/async/test_browsercontext_events.py b/tests/async/test_browsercontext_events.py index a0a3b90eb..8ae14def6 100644 --- a/tests/async/test_browsercontext_events.py +++ b/tests/async/test_browsercontext_events.py @@ -17,7 +17,7 @@ import pytest -from playwright.async_api import Page +from playwright.async_api import BrowserContext, Page from tests.utils import must from ..server import Server, TestServerRequest @@ -198,3 +198,11 @@ async def test_page_error_event_should_work(page: Page) -> None: page_error = await page_error_info.value assert page_error.page == page assert "boom" in page_error.error.stack + + +async def test_weberror_event_should_work(context: BrowserContext, page: Page) -> None: + async with context.expect_event("weberror") as error_info: + await page.goto('data:text/html,') + error = await error_info.value + assert error.page == page + assert error.error.message == "Test" diff --git a/tests/sync/test_browsercontext_events.py b/tests/sync/test_browsercontext_events.py index 315fff0dc..6e44b76d5 100644 --- a/tests/sync/test_browsercontext_events.py +++ b/tests/sync/test_browsercontext_events.py @@ -16,7 +16,7 @@ import pytest -from playwright.sync_api import Dialog, Page +from playwright.sync_api import BrowserContext, Dialog, Page from ..server import Server, TestServerRequest @@ -198,3 +198,11 @@ def test_console_event_should_work_with_context_manager(page: Page) -> None: message = cm_info.value assert message.text == "hello" assert message.page == page + + +def test_weberror_event_should_work(context: BrowserContext, page: Page) -> None: + with context.expect_event("weberror") as error_info: + page.goto('data:text/html,') + error = error_info.value + assert error.page == page + assert error.error.message == "Test"