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"