Skip to content

Commit 6edf2c4

Browse files
committed
chore(roll): roll Playwright to 1.34.0-beta-1684534842000
1 parent d4a874f commit 6edf2c4

File tree

11 files changed

+365
-6
lines changed

11 files changed

+365
-6
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Playwright is a Python library to automate [Chromium](https://www.chromium.org/H
44

55
| | Linux | macOS | Windows |
66
| :--- | :---: | :---: | :---: |
7-
| Chromium <!-- GEN:chromium-version -->113.0.5672.53<!-- GEN:stop --> ||||
7+
| Chromium <!-- GEN:chromium-version -->114.0.5735.35<!-- GEN:stop --> ||||
88
| WebKit <!-- GEN:webkit-version -->16.4<!-- GEN:stop --> ||||
99
| Firefox <!-- GEN:firefox-version -->113.0<!-- GEN:stop --> ||||
1010

playwright/_impl/_browser_context.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,13 @@ async def wait_for_event(
478478
pass
479479
return await event_info
480480

481+
def expect_console_message(
482+
self,
483+
predicate: Callable[[ConsoleMessage], bool] = None,
484+
timeout: float = None,
485+
) -> EventContextManagerImpl[ConsoleMessage]:
486+
return self.expect_event(Page.Events.Console, predicate, timeout)
487+
481488
def expect_page(
482489
self,
483490
predicate: Callable[[Page], bool] = None,

playwright/async_api/_generated.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13733,6 +13733,38 @@ async def wait_for_event(
1373313733
)
1373413734
)
1373513735

13736+
def expect_console_message(
13737+
self,
13738+
predicate: typing.Optional[typing.Callable[["ConsoleMessage"], bool]] = None,
13739+
*,
13740+
timeout: typing.Optional[float] = None
13741+
) -> AsyncEventContextManager["ConsoleMessage"]:
13742+
"""BrowserContext.expect_console_message
13743+
13744+
Performs action and waits for a `ConsoleMessage` to be logged by in the pages in the context. If predicate is
13745+
provided, it passes `ConsoleMessage` value into the `predicate` function and waits for `predicate(message)` to
13746+
return a truthy value. Will throw an error if the page is closed before the `browser_context.on('console')` event
13747+
is fired.
13748+
13749+
Parameters
13750+
----------
13751+
predicate : Union[Callable[[ConsoleMessage], bool], None]
13752+
Receives the `ConsoleMessage` object and resolves to truthy value when the waiting should resolve.
13753+
timeout : Union[float, None]
13754+
Maximum time to wait for in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout. The
13755+
default value can be changed by using the `browser_context.set_default_timeout()`.
13756+
13757+
Returns
13758+
-------
13759+
EventContextManager[ConsoleMessage]
13760+
"""
13761+
13762+
return AsyncEventContextManager(
13763+
self._impl_obj.expect_console_message(
13764+
predicate=self._wrap_handler(predicate), timeout=timeout
13765+
).future
13766+
)
13767+
1373613768
def expect_page(
1373713769
self,
1373813770
predicate: typing.Optional[typing.Callable[["Page"], bool]] = None,

playwright/sync_api/_generated.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13799,6 +13799,38 @@ def wait_for_event(
1379913799
)
1380013800
)
1380113801

13802+
def expect_console_message(
13803+
self,
13804+
predicate: typing.Optional[typing.Callable[["ConsoleMessage"], bool]] = None,
13805+
*,
13806+
timeout: typing.Optional[float] = None
13807+
) -> EventContextManager["ConsoleMessage"]:
13808+
"""BrowserContext.expect_console_message
13809+
13810+
Performs action and waits for a `ConsoleMessage` to be logged by in the pages in the context. If predicate is
13811+
provided, it passes `ConsoleMessage` value into the `predicate` function and waits for `predicate(message)` to
13812+
return a truthy value. Will throw an error if the page is closed before the `browser_context.on('console')` event
13813+
is fired.
13814+
13815+
Parameters
13816+
----------
13817+
predicate : Union[Callable[[ConsoleMessage], bool], None]
13818+
Receives the `ConsoleMessage` object and resolves to truthy value when the waiting should resolve.
13819+
timeout : Union[float, None]
13820+
Maximum time to wait for in milliseconds. Defaults to `30000` (30 seconds). Pass `0` to disable timeout. The
13821+
default value can be changed by using the `browser_context.set_default_timeout()`.
13822+
13823+
Returns
13824+
-------
13825+
EventContextManager[ConsoleMessage]
13826+
"""
13827+
return EventContextManager(
13828+
self,
13829+
self._impl_obj.expect_console_message(
13830+
predicate=self._wrap_handler(predicate), timeout=timeout
13831+
).future,
13832+
)
13833+
1380213834
def expect_page(
1380313835
self,
1380413836
predicate: typing.Optional[typing.Callable[["Page"], bool]] = None,

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
InWheel = None
3131
from wheel.bdist_wheel import bdist_wheel as BDistWheelCommand
3232

33-
driver_version = "1.34.0-alpha-may-17-2023"
33+
driver_version = "1.34.0-beta-1684534842000"
3434

3535

3636
def extractall(zip: zipfile.ZipFile, path: str) -> None:

tests/async/test_browsercontext.py

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

1515
import asyncio
16+
import re
1617
from urllib.parse import urlparse
1718

1819
import pytest
@@ -477,13 +478,13 @@ def handler(route, request, ordinal):
477478
def handler4(route, request):
478479
handler(route, request, 4)
479480

480-
await context.route("**/empty.html", handler4)
481+
await context.route(re.compile("empty.html"), handler4)
481482

482483
await page.goto(server.EMPTY_PAGE)
483484
assert intercepted == [4]
484485

485486
intercepted = []
486-
await context.unroute("**/empty.html", handler4)
487+
await context.unroute(re.compile("empty.html"), handler4)
487488
await page.goto(server.EMPTY_PAGE)
488489
assert intercepted == [3]
489490

tests/async/test_browsercontext_events.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,11 @@ def handle_route(request: HttpRequestWithPostBody) -> None:
180180
await dialog.accept("hello")
181181
await promise
182182
await popup.evaluate("window.result") == "hello"
183+
184+
185+
async def test_console_event_should_work_with_context_manager(page: Page) -> None:
186+
async with page.context.expect_console_message() as cm_info:
187+
await page.evaluate("() => console.log('hello')")
188+
message = await cm_info.value
189+
assert message.text == "hello"
190+
assert message.page == page

tests/async/test_interception.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import asyncio
1616
import json
17+
import re
1718

1819
import pytest
1920

@@ -75,13 +76,13 @@ def handler4(route):
7576
intercepted.append(4)
7677
asyncio.create_task(route.continue_())
7778

78-
await page.route("**/empty.html", handler4)
79+
await page.route(re.compile("empty.html"), handler4)
7980

8081
await page.goto(server.EMPTY_PAGE)
8182
assert intercepted == [4]
8283

8384
intercepted = []
84-
await page.unroute("**/empty.html", handler4)
85+
await page.unroute(re.compile("empty.html"), handler4)
8586
await page.goto(server.EMPTY_PAGE)
8687
assert intercepted == [3]
8788

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,205 @@
1+
# Copyright (c) Microsoft Corporation.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
from typing import Optional
16+
17+
import pytest
18+
19+
from playwright.sync_api import Dialog, Page
20+
21+
from ..server import HttpRequestWithPostBody, Server
22+
23+
24+
def test_console_event_should_work(page: Page) -> None:
25+
with page.context.expect_console_message() as console_info:
26+
page.evaluate("() => console.log('hello')")
27+
message = console_info.value
28+
assert message.text == "hello"
29+
assert message.page == page
30+
31+
32+
def test_console_event_should_work_in_popup(page: Page) -> None:
33+
with page.context.expect_console_message() as console_info:
34+
with page.expect_popup() as popup_info:
35+
page.evaluate(
36+
"""() => {
37+
const win = window.open('');
38+
win.console.log('hello');
39+
}"""
40+
)
41+
message = console_info.value
42+
popup = popup_info.value
43+
assert message.text == "hello"
44+
assert message.page == popup
45+
46+
47+
# console message from javascript: url is not reported at all
48+
@pytest.mark.skip_browser("firefox")
49+
def test_console_event_should_work_in_popup_2(page: Page, browser_name: str) -> None:
50+
with page.context.expect_console_message(
51+
lambda msg: msg.type == "log"
52+
) as console_info:
53+
with page.context.expect_page() as page_info:
54+
page.evaluate(
55+
"""async () => {
56+
const win = window.open('javascript:console.log("hello")');
57+
await new Promise(f => setTimeout(f, 0));
58+
win.close();
59+
}"""
60+
)
61+
message = console_info.value
62+
popup = page_info.value
63+
assert message.text == "hello"
64+
assert message.page == popup
65+
66+
67+
# console message from javascript: url is not reported at all
68+
@pytest.mark.skip_browser("firefox")
69+
def test_console_event_should_work_in_immediately_closed_popup(
70+
page: Page, browser_name: str
71+
) -> None:
72+
with page.context.expect_console_message(
73+
lambda msg: msg.type == "log"
74+
) as console_info:
75+
with page.context.expect_page() as page_info:
76+
page.evaluate(
77+
"""() => {
78+
const win = window.open('');
79+
win.console.log('hello');
80+
win.close();
81+
}"""
82+
)
83+
message = console_info.value
84+
popup = page_info.value
85+
assert message.text == "hello"
86+
assert message.page == popup
87+
88+
89+
def test_dialog_event_should_work1(page: Page) -> None:
90+
dialog1: Optional[Dialog] = None
91+
92+
def handle_page_dialog(dialog: Dialog) -> None:
93+
nonlocal dialog1
94+
dialog1 = dialog
95+
dialog.accept("hello")
96+
97+
page.on("dialog", handle_page_dialog)
98+
99+
dialog2: Optional[Dialog] = None
100+
101+
def handle_context_dialog(dialog: Dialog) -> None:
102+
nonlocal dialog2
103+
dialog2 = dialog
104+
105+
page.context.on("dialog", handle_context_dialog)
106+
107+
assert page.evaluate("() => prompt('hey?')") == "hello"
108+
assert dialog1
109+
assert dialog1 == dialog2
110+
assert dialog1.message == "hey?"
111+
assert dialog1.page == page
112+
113+
114+
def test_dialog_event_should_work_in_popup1(page: Page) -> None:
115+
dialog: Optional[Dialog] = None
116+
117+
def handle_dialog(d: Dialog) -> None:
118+
nonlocal dialog
119+
dialog = d
120+
dialog.accept("hello")
121+
122+
page.context.on("dialog", handle_dialog)
123+
124+
with page.expect_popup() as popup_info:
125+
assert page.evaluate("() => window.open('').prompt('hey?')") == "hello"
126+
popup = popup_info.value
127+
assert dialog
128+
assert dialog.message == "hey?"
129+
assert dialog.page == popup
130+
131+
132+
# console message from javascript: url is not reported at all
133+
@pytest.mark.skip_browser("firefox")
134+
def test_dialog_event_should_work_in_popup_2(page: Page, browser_name: str) -> None:
135+
handled = False
136+
137+
def handle_dialog(dialog: Dialog) -> None:
138+
assert dialog.message == "hey?"
139+
assert dialog.page is None
140+
nonlocal handled
141+
handled = True
142+
dialog.accept("hello")
143+
144+
page.context.on("dialog", handle_dialog)
145+
146+
assert page.evaluate("() => window.open('javascript:prompt(\"hey?\")')")
147+
assert handled
148+
149+
150+
# console message from javascript: url is not reported at all
151+
@pytest.mark.skip_browser("firefox")
152+
def test_dialog_event_should_work_in_immdiately_closed_popup(page: Page) -> None:
153+
popup = None
154+
155+
def handle_popup(p: Page) -> None:
156+
nonlocal popup
157+
popup = p
158+
159+
page.on("popup", handle_popup)
160+
161+
with page.context.expect_console_message() as console_info:
162+
page.evaluate(
163+
"""() => {
164+
const win = window.open();
165+
win.console.log('hello');
166+
win.close();
167+
}"""
168+
)
169+
message = console_info.value
170+
171+
assert message.text == "hello"
172+
assert message.page == popup
173+
174+
175+
def test_dialog_event_should_work_with_inline_script_tag(
176+
page: Page, server: Server
177+
) -> None:
178+
def handle_route(request: HttpRequestWithPostBody) -> None:
179+
request.setHeader("content-type", "text/html")
180+
request.write(b"""<script>window.result = prompt('hey?')</script>""")
181+
request.finish()
182+
183+
server.set_route("/popup.html", handle_route)
184+
page.goto(server.EMPTY_PAGE)
185+
page.set_content("<a href='popup.html' target=_blank>Click me</a>")
186+
187+
def handle_dialog(dialog: Dialog) -> None:
188+
assert dialog.message == "hey?"
189+
assert dialog.page == popup
190+
dialog.accept("hello")
191+
192+
page.context.on("dialog", handle_dialog)
193+
194+
with page.expect_popup() as popup_info:
195+
page.click("a")
196+
popup = popup_info.value
197+
assert popup.evaluate("window.result") == "hello"
198+
199+
200+
def test_console_event_should_work_with_context_manager(page: Page) -> None:
201+
with page.context.expect_console_message() as cm_info:
202+
page.evaluate("() => console.log('hello')")
203+
message = cm_info.value
204+
assert message.text == "hello"
205+
assert message.page == page

0 commit comments

Comments
 (0)