Skip to content

Commit dffa098

Browse files
authored
fix(webError): fix WebError when using sync API (microsoft#2721)
1 parent 4ae12bd commit dffa098

File tree

6 files changed

+33
-5
lines changed

6 files changed

+33
-5
lines changed

playwright/_impl/_browser_context.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,10 @@ def _on_dialog(self, dialog: Dialog) -> None:
692692
asyncio.create_task(dialog.dismiss())
693693

694694
def _on_page_error(self, error: Error, page: Optional[Page]) -> None:
695-
self.emit(BrowserContext.Events.WebError, WebError(self._loop, page, error))
695+
self.emit(
696+
BrowserContext.Events.WebError,
697+
WebError(self._loop, self._dispatcher_fiber, page, error),
698+
)
696699
if page:
697700
page.emit(Page.Events.PageError, error)
698701

playwright/_impl/_web_error.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,22 @@
1313
# limitations under the License.
1414

1515
from asyncio import AbstractEventLoop
16-
from typing import Optional
16+
from typing import Any, Optional
1717

1818
from playwright._impl._helper import Error
1919
from playwright._impl._page import Page
2020

2121

2222
class WebError:
2323
def __init__(
24-
self, loop: AbstractEventLoop, page: Optional[Page], error: Error
24+
self,
25+
loop: AbstractEventLoop,
26+
dispatcher_fiber: Any,
27+
page: Optional[Page],
28+
error: Error,
2529
) -> None:
2630
self._loop = loop
31+
self._dispatcher_fiber = dispatcher_fiber
2732
self._page = page
2833
self._error = error
2934

playwright/async_api/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
Selectors,
6161
Touchscreen,
6262
Video,
63+
WebError,
6364
WebSocket,
6465
WebSocketRoute,
6566
Worker,
@@ -190,6 +191,7 @@ def __call__(
190191
"Touchscreen",
191192
"Video",
192193
"ViewportSize",
194+
"WebError",
193195
"WebSocket",
194196
"WebSocketRoute",
195197
"Worker",

playwright/sync_api/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
Selectors,
6161
Touchscreen,
6262
Video,
63+
WebError,
6364
WebSocket,
6465
WebSocketRoute,
6566
Worker,
@@ -190,6 +191,7 @@ def __call__(
190191
"Touchscreen",
191192
"Video",
192193
"ViewportSize",
194+
"WebError",
193195
"WebSocket",
194196
"WebSocketRoute",
195197
"Worker",

tests/async/test_browsercontext_events.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import pytest
1919

20-
from playwright.async_api import Page
20+
from playwright.async_api import BrowserContext, Page
2121
from tests.utils import must
2222

2323
from ..server import Server, TestServerRequest
@@ -198,3 +198,11 @@ async def test_page_error_event_should_work(page: Page) -> None:
198198
page_error = await page_error_info.value
199199
assert page_error.page == page
200200
assert "boom" in page_error.error.stack
201+
202+
203+
async def test_weberror_event_should_work(context: BrowserContext, page: Page) -> None:
204+
async with context.expect_event("weberror") as error_info:
205+
await page.goto('data:text/html,<script>throw new Error("Test")</script>')
206+
error = await error_info.value
207+
assert error.page == page
208+
assert error.error.message == "Test"

tests/sync/test_browsercontext_events.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import pytest
1818

19-
from playwright.sync_api import Dialog, Page
19+
from playwright.sync_api import BrowserContext, Dialog, Page
2020

2121
from ..server import Server, TestServerRequest
2222

@@ -198,3 +198,11 @@ def test_console_event_should_work_with_context_manager(page: Page) -> None:
198198
message = cm_info.value
199199
assert message.text == "hello"
200200
assert message.page == page
201+
202+
203+
def test_weberror_event_should_work(context: BrowserContext, page: Page) -> None:
204+
with context.expect_event("weberror") as error_info:
205+
page.goto('data:text/html,<script>throw new Error("Test")</script>')
206+
error = error_info.value
207+
assert error.page == page
208+
assert error.error.message == "Test"

0 commit comments

Comments
 (0)