Skip to content

Commit 8229ee5

Browse files
authored
fix: page.pause() timeout reset (microsoft#2157)
1 parent 9060038 commit 8229ee5

File tree

4 files changed

+76
-10
lines changed

4 files changed

+76
-10
lines changed

playwright/_impl/_browser_context.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,15 +248,18 @@ def set_default_navigation_timeout(self, timeout: float) -> None:
248248
def _set_default_navigation_timeout_impl(self, timeout: Optional[float]) -> None:
249249
self._timeout_settings.set_default_navigation_timeout(timeout)
250250
self._channel.send_no_reply(
251-
"setDefaultNavigationTimeoutNoReply", dict(timeout=timeout)
251+
"setDefaultNavigationTimeoutNoReply",
252+
{} if timeout is None else {"timeout": timeout},
252253
)
253254

254255
def set_default_timeout(self, timeout: float) -> None:
255256
return self._set_default_timeout_impl(timeout)
256257

257258
def _set_default_timeout_impl(self, timeout: Optional[float]) -> None:
258259
self._timeout_settings.set_default_timeout(timeout)
259-
self._channel.send_no_reply("setDefaultTimeoutNoReply", dict(timeout=timeout))
260+
self._channel.send_no_reply(
261+
"setDefaultTimeoutNoReply", {} if timeout is None else {"timeout": timeout}
262+
)
260263

261264
@property
262265
def pages(self) -> List[Page]:

tests/async/test_page.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,3 +1294,33 @@ def binding(source, o):
12941294
await page.expose_binding("log", lambda source, o: binding(source, o))
12951295
await page.evaluate("const a = {}; a.b = a; window.log(a)")
12961296
assert binding_values[0]["b"] == binding_values[0]
1297+
1298+
1299+
async def test_page_pause_should_reset_default_timeouts(
1300+
page: Page, headless: bool, server: Server
1301+
) -> None:
1302+
if not headless:
1303+
pytest.skip()
1304+
1305+
await page.goto(server.EMPTY_PAGE)
1306+
page.pause()
1307+
with pytest.raises(Error, match="Timeout 30000ms exceeded."):
1308+
await page.get_by_text("foo").click()
1309+
1310+
1311+
async def test_page_pause_should_reset_custom_timeouts(
1312+
page: Page, headless: bool, server: Server
1313+
) -> None:
1314+
if not headless:
1315+
pytest.skip()
1316+
1317+
page.set_default_timeout(123)
1318+
page.set_default_navigation_timeout(456)
1319+
await page.goto(server.EMPTY_PAGE)
1320+
page.pause()
1321+
with pytest.raises(Error, match="Timeout 123ms exceeded."):
1322+
await page.get_by_text("foo").click()
1323+
1324+
server.set_route("/empty.html", lambda route: None)
1325+
with pytest.raises(Error, match="Timeout 456ms exceeded."):
1326+
await page.goto(server.EMPTY_PAGE)

tests/conftest.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
_dirname = get_file_dirname()
3636

3737

38-
def pytest_generate_tests(metafunc: Any) -> None:
38+
def pytest_generate_tests(metafunc: pytest.Metafunc) -> None:
3939
if "browser_name" in metafunc.fixturenames:
4040
browsers = metafunc.config.option.browser or ["chromium", "firefox", "webkit"]
4141
metafunc.parametrize("browser_name", browsers, scope="session")
@@ -54,11 +54,14 @@ def assetdir() -> Path:
5454

5555

5656
@pytest.fixture(scope="session")
57-
def launch_arguments(pytestconfig: Any) -> Dict:
57+
def headless(pytestconfig: pytest.Config) -> bool:
58+
return not (pytestconfig.getoption("--headed") or os.getenv("HEADFUL", False))
59+
60+
61+
@pytest.fixture(scope="session")
62+
def launch_arguments(pytestconfig: pytest.Config, headless: bool) -> Dict:
5863
return {
59-
"headless": not (
60-
pytestconfig.getoption("--headed") or os.getenv("HEADFUL", False)
61-
),
64+
"headless": headless,
6265
"channel": pytestconfig.getoption("--browser-channel"),
6366
}
6467

@@ -92,12 +95,12 @@ def after_each_hook() -> Generator[None, None, None]:
9295

9396

9497
@pytest.fixture(scope="session")
95-
def browser_name(pytestconfig: Any) -> None:
98+
def browser_name(pytestconfig: pytest.Config) -> None:
9699
return pytestconfig.getoption("browser")
97100

98101

99102
@pytest.fixture(scope="session")
100-
def browser_channel(pytestconfig: Any) -> None:
103+
def browser_channel(pytestconfig: pytest.Config) -> None:
101104
return pytestconfig.getoption("--browser-channel")
102105

103106

@@ -169,7 +172,7 @@ def skip_by_platform(request: pytest.FixtureRequest) -> None:
169172
pytest.skip(f"skipped on this platform: {sys.platform}")
170173

171174

172-
def pytest_addoption(parser: Any) -> None:
175+
def pytest_addoption(parser: pytest.Parser) -> None:
173176
group = parser.getgroup("playwright", "Playwright")
174177
group.addoption(
175178
"--browser",

tests/sync/test_page.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,33 @@ def test_emitted_for_domcontentloaded_and_load(page: Page, server: Server) -> No
8484
page.goto(server.EMPTY_PAGE)
8585
assert isinstance(dom_info.value, Page)
8686
assert isinstance(load_info.value, Page)
87+
88+
89+
def test_page_pause_should_reset_default_timeouts(
90+
page: Page, headless: bool, server: Server
91+
) -> None:
92+
if not headless:
93+
pytest.skip()
94+
95+
page.goto(server.EMPTY_PAGE)
96+
page.pause()
97+
with pytest.raises(Error, match="Timeout 30000ms exceeded."):
98+
page.get_by_text("foo").click()
99+
100+
101+
def test_page_pause_should_reset_custom_timeouts(
102+
page: Page, headless: bool, server: Server
103+
) -> None:
104+
if not headless:
105+
pytest.skip()
106+
107+
page.set_default_timeout(123)
108+
page.set_default_navigation_timeout(456)
109+
page.goto(server.EMPTY_PAGE)
110+
page.pause()
111+
with pytest.raises(Error, match="Timeout 123ms exceeded."):
112+
page.get_by_text("foo").click()
113+
114+
server.set_route("/empty.html", lambda route: None)
115+
with pytest.raises(Error, match="Timeout 456ms exceeded."):
116+
page.goto(server.EMPTY_PAGE)

0 commit comments

Comments
 (0)