From 265ae212bc8808efe0b757b6b738af44efa2da8d Mon Sep 17 00:00:00 2001 From: m9810223 Date: Sat, 15 Apr 2023 00:18:19 +0800 Subject: [PATCH 1/5] fix: mark `Playwright.stop` async ```shell RuntimeWarning: coroutine 'PlaywrightContextManager.__aexit__' was never awaited playwright.stop() ``` --- playwright/_impl/_playwright.py | 2 +- playwright/async_api/_generated.py | 4 ++-- playwright/sync_api/_generated.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/playwright/_impl/_playwright.py b/playwright/_impl/_playwright.py index 746b2e830..d3edfacc1 100644 --- a/playwright/_impl/_playwright.py +++ b/playwright/_impl/_playwright.py @@ -70,7 +70,7 @@ def _set_selectors(self, selectors: Selectors) -> None: self.selectors = selectors self.selectors._add_channel(selectors_owner) - def stop(self) -> None: + async def stop(self) -> None: pass diff --git a/playwright/async_api/_generated.py b/playwright/async_api/_generated.py index e5268b1bb..c4a7442f6 100644 --- a/playwright/async_api/_generated.py +++ b/playwright/async_api/_generated.py @@ -14966,7 +14966,7 @@ def request(self) -> "APIRequest": def __getitem__(self, value: str) -> "BrowserType": return mapping.from_impl(self._impl_obj.__getitem__(value=value)) - def stop(self) -> None: + async def stop(self) -> None: """Playwright.stop Terminates this instance of Playwright in case it was created bypassing the Python context manager. This is useful @@ -14987,7 +14987,7 @@ def stop(self) -> None: ``` """ - return mapping.from_maybe_impl(self._impl_obj.stop()) + return mapping.from_maybe_impl(await self._impl_obj.stop()) mapping.register(PlaywrightImpl, Playwright) diff --git a/playwright/sync_api/_generated.py b/playwright/sync_api/_generated.py index 72caeb1cc..6ff85ed77 100644 --- a/playwright/sync_api/_generated.py +++ b/playwright/sync_api/_generated.py @@ -15075,7 +15075,7 @@ def stop(self) -> None: ``` """ - return mapping.from_maybe_impl(self._impl_obj.stop()) + return mapping.from_maybe_impl(self._sync(self._impl_obj.stop())) mapping.register(PlaywrightImpl, Playwright) From d6ec2f4868d64907940ad5c0b8c4f2bc38ea0770 Mon Sep 17 00:00:00 2001 From: m9810223 Date: Fri, 21 Apr 2023 00:26:28 +0800 Subject: [PATCH 2/5] fix: remove duplicated keyword argument `timeout` TypeError: screenshot() got multiple values for keyword argument 'timeout' --- playwright/_impl/_locator.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/playwright/_impl/_locator.py b/playwright/_impl/_locator.py index ee39754d4..5e05d992f 100644 --- a/playwright/_impl/_locator.py +++ b/playwright/_impl/_locator.py @@ -517,6 +517,7 @@ async def screenshot( mask: List["Locator"] = None, ) -> bytes: params = locals_to_params(locals()) + del params["timeout"] return await self._with_element( lambda h, timeout: h.screenshot(timeout=timeout, **params) ) @@ -549,6 +550,7 @@ async def select_option( async def select_text(self, force: bool = None, timeout: float = None) -> None: params = locals_to_params(locals()) + del params["timeout"] return await self._with_element( lambda h, timeout: h.select_text(timeout=timeout, **params), timeout ) From 3f5bd63a31d832faa4414e4bce5399f95a861f72 Mon Sep 17 00:00:00 2001 From: m9810223 Date: Fri, 21 Apr 2023 23:58:23 +0800 Subject: [PATCH 3/5] fix: remove duplicated keyword argument `timeout` --- playwright/_impl/_locator.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/playwright/_impl/_locator.py b/playwright/_impl/_locator.py index 5e05d992f..f19151d6f 100644 --- a/playwright/_impl/_locator.py +++ b/playwright/_impl/_locator.py @@ -516,10 +516,18 @@ async def screenshot( scale: Literal["css", "device"] = None, mask: List["Locator"] = None, ) -> bytes: - params = locals_to_params(locals()) - del params["timeout"] return await self._with_element( - lambda h, timeout: h.screenshot(timeout=timeout, **params) + lambda h, timeout: h.screenshot( + timeout=timeout, + type=type, + path=path, + quality=quality, + omitBackground=omitBackground, + animations=animations, + caret=caret, + scale=scale, + mask=mask, + ) ) async def scroll_into_view_if_needed( @@ -549,10 +557,12 @@ async def select_option( ) async def select_text(self, force: bool = None, timeout: float = None) -> None: - params = locals_to_params(locals()) - del params["timeout"] return await self._with_element( - lambda h, timeout: h.select_text(timeout=timeout, **params), timeout + lambda h, timeout: h.select_text( + force=force, + timeout=timeout, + ), + timeout, ) async def set_input_files( From 72d6a147ca322b427feb699e67952206b42bdacb Mon Sep 17 00:00:00 2001 From: m9810223 Date: Sat, 22 Apr 2023 01:08:04 +0800 Subject: [PATCH 4/5] test: test `timeout` for `Locator` --- tests/sync/test_locators.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/sync/test_locators.py b/tests/sync/test_locators.py index 1055dfd37..8c00368d9 100644 --- a/tests/sync/test_locators.py +++ b/tests/sync/test_locators.py @@ -355,6 +355,7 @@ def test_locators_should_select_textarea( textarea = page.locator("textarea") textarea.evaluate("textarea => textarea.value = 'some value'") textarea.select_text() + textarea.select_text(timeout=1_000) if browser_name == "firefox" or browser_name == "webkit": assert textarea.evaluate("el => el.selectionStart") == 0 assert textarea.evaluate("el => el.selectionEnd") == 10 @@ -381,6 +382,9 @@ def test_locators_should_screenshot( page.evaluate("window.scrollBy(50, 100)") element = page.locator(".box:nth-of-type(3)") assert_to_be_golden(element.screenshot(), "screenshot-element-bounding-box.png") + assert_to_be_golden( + element.screenshot(timeout=1_000), "screenshot-element-bounding-box.png" + ) def test_locators_should_return_bounding_box(page: Page, server: Server) -> None: From 3a56a424fe35f3417e17abacfb40a3bd1aa582fd Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Fri, 21 Apr 2023 20:15:33 +0200 Subject: [PATCH 5/5] simplify it --- playwright/_impl/_locator.py | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/playwright/_impl/_locator.py b/playwright/_impl/_locator.py index f19151d6f..a39139f74 100644 --- a/playwright/_impl/_locator.py +++ b/playwright/_impl/_locator.py @@ -197,7 +197,7 @@ async def evaluate_handle( self, expression: str, arg: Serializable = None, timeout: float = None ) -> "JSHandle": return await self._with_element( - lambda h, o: h.evaluate_handle(expression, arg), timeout + lambda h, _: h.evaluate_handle(expression, arg), timeout ) async def fill( @@ -516,18 +516,11 @@ async def screenshot( scale: Literal["css", "device"] = None, mask: List["Locator"] = None, ) -> bytes: + params = locals_to_params(locals()) return await self._with_element( lambda h, timeout: h.screenshot( - timeout=timeout, - type=type, - path=path, - quality=quality, - omitBackground=omitBackground, - animations=animations, - caret=caret, - scale=scale, - mask=mask, - ) + **{**params, "timeout": timeout}, # type: ignore + ), ) async def scroll_into_view_if_needed( @@ -557,12 +550,9 @@ async def select_option( ) async def select_text(self, force: bool = None, timeout: float = None) -> None: + params = locals_to_params(locals()) return await self._with_element( - lambda h, timeout: h.select_text( - force=force, - timeout=timeout, - ), - timeout, + lambda h, timeout: h.select_text(**{**params, "timeout": timeout}), timeout # type: ignore ) async def set_input_files(