diff --git a/playwright/_impl/_helper.py b/playwright/_impl/_helper.py index dc0a2479d..213fdc1e3 100644 --- a/playwright/_impl/_helper.py +++ b/playwright/_impl/_helper.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import asyncio +import datetime import math import os import re @@ -574,3 +575,13 @@ def is_file_payload(value: Optional[Any]) -> bool: def is_textual_mime_type(mime_type: str) -> bool: return bool(TEXTUAL_MIME_TYPE.match(mime_type)) + + +def to_milliseconds( + value: Union[float, datetime.timedelta, None], +) -> Optional[float]: + if value is None: + return None + if isinstance(value, datetime.timedelta): + return value / datetime.timedelta(milliseconds=1) + return value diff --git a/playwright/async_api/_generated.py b/playwright/async_api/_generated.py index 130230390..225693db8 100644 --- a/playwright/async_api/_generated.py +++ b/playwright/async_api/_generated.py @@ -71,6 +71,7 @@ from playwright._impl._fetch import APIResponse as APIResponseImpl from playwright._impl._file_chooser import FileChooser as FileChooserImpl from playwright._impl._frame import Frame as FrameImpl +from playwright._impl._helper import to_milliseconds from playwright._impl._input import Keyboard as KeyboardImpl from playwright._impl._input import Mouse as MouseImpl from playwright._impl._input import Touchscreen as TouchscreenImpl @@ -791,7 +792,7 @@ async def fetch( post_data: typing.Optional[typing.Union[typing.Any, str, bytes]] = None, max_redirects: typing.Optional[int] = None, max_retries: typing.Optional[int] = None, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, ) -> "APIResponse": """Route.fetch @@ -850,7 +851,7 @@ async def handle(route): postData=mapping.to_impl(post_data), maxRedirects=max_redirects, maxRetries=max_retries, - timeout=timeout, + timeout=to_milliseconds(timeout), ) ) @@ -1125,7 +1126,7 @@ def expect_event( event: str, predicate: typing.Optional[typing.Callable] = None, *, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, ) -> AsyncEventContextManager: """WebSocket.expect_event @@ -1149,7 +1150,9 @@ def expect_event( return AsyncEventContextManager( self._impl_obj.expect_event( - event=event, predicate=self._wrap_handler(predicate), timeout=timeout + event=event, + predicate=self._wrap_handler(predicate), + timeout=to_milliseconds(timeout), ).future ) @@ -1158,7 +1161,7 @@ async def wait_for_event( event: str, predicate: typing.Optional[typing.Callable] = None, *, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, ) -> typing.Any: """WebSocket.wait_for_event @@ -1185,7 +1188,9 @@ async def wait_for_event( return mapping.from_maybe_impl( await self._impl_obj.wait_for_event( - event=event, predicate=self._wrap_handler(predicate), timeout=timeout + event=event, + predicate=self._wrap_handler(predicate), + timeout=to_milliseconds(timeout), ) ) @@ -2044,7 +2049,9 @@ async def dispatch_event( ) async def scroll_into_view_if_needed( - self, *, timeout: typing.Optional[float] = None + self, + *, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, ) -> None: """ElementHandle.scroll_into_view_if_needed @@ -2065,7 +2072,9 @@ async def scroll_into_view_if_needed( """ return mapping.from_maybe_impl( - await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + await self._impl_obj.scroll_into_view_if_needed( + timeout=to_milliseconds(timeout) + ) ) async def hover( @@ -2075,7 +2084,7 @@ async def hover( typing.Sequence[Literal["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]] ] = None, position: typing.Optional[Position] = None, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, no_wait_after: typing.Optional[bool] = None, force: typing.Optional[bool] = None, trial: typing.Optional[bool] = None, @@ -2118,7 +2127,7 @@ async def hover( await self._impl_obj.hover( modifiers=mapping.to_impl(modifiers), position=position, - timeout=timeout, + timeout=to_milliseconds(timeout), noWaitAfter=no_wait_after, force=force, trial=trial, @@ -2135,7 +2144,7 @@ async def click( delay: typing.Optional[float] = None, button: typing.Optional[Literal["left", "middle", "right"]] = None, click_count: typing.Optional[int] = None, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, force: typing.Optional[bool] = None, no_wait_after: typing.Optional[bool] = None, trial: typing.Optional[bool] = None, @@ -2194,7 +2203,7 @@ async def click( delay=delay, button=button, clickCount=click_count, - timeout=timeout, + timeout=to_milliseconds(timeout), force=force, noWaitAfter=no_wait_after, trial=trial, @@ -2211,7 +2220,7 @@ async def dblclick( position: typing.Optional[Position] = None, delay: typing.Optional[float] = None, button: typing.Optional[Literal["left", "middle", "right"]] = None, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, force: typing.Optional[bool] = None, no_wait_after: typing.Optional[bool] = None, trial: typing.Optional[bool] = None, @@ -2266,7 +2275,7 @@ async def dblclick( position=position, delay=delay, button=button, - timeout=timeout, + timeout=to_milliseconds(timeout), force=force, noWaitAfter=no_wait_after, trial=trial, @@ -2283,7 +2292,7 @@ async def select_option( element: typing.Optional[ typing.Union["ElementHandle", typing.Sequence["ElementHandle"]] ] = None, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, force: typing.Optional[bool] = None, no_wait_after: typing.Optional[bool] = None, ) -> typing.List[str]: @@ -2344,7 +2353,7 @@ async def select_option( index=mapping.to_impl(index), label=mapping.to_impl(label), element=mapping.to_impl(element), - timeout=timeout, + timeout=to_milliseconds(timeout), force=force, noWaitAfter=no_wait_after, ) @@ -2357,7 +2366,7 @@ async def tap( typing.Sequence[Literal["Alt", "Control", "ControlOrMeta", "Meta", "Shift"]] ] = None, position: typing.Optional[Position] = None, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, force: typing.Optional[bool] = None, no_wait_after: typing.Optional[bool] = None, trial: typing.Optional[bool] = None, @@ -2402,7 +2411,7 @@ async def tap( await self._impl_obj.tap( modifiers=mapping.to_impl(modifiers), position=position, - timeout=timeout, + timeout=to_milliseconds(timeout), force=force, noWaitAfter=no_wait_after, trial=trial, @@ -2413,7 +2422,7 @@ async def fill( self, value: str, *, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, no_wait_after: typing.Optional[bool] = None, force: typing.Optional[bool] = None, ) -> None: @@ -2445,7 +2454,10 @@ async def fill( return mapping.from_maybe_impl( await self._impl_obj.fill( - value=value, timeout=timeout, noWaitAfter=no_wait_after, force=force + value=value, + timeout=to_milliseconds(timeout), + noWaitAfter=no_wait_after, + force=force, ) ) @@ -2453,7 +2465,7 @@ async def select_text( self, *, force: typing.Optional[bool] = None, - timeout: typing.Optional[float] = None, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, ) -> None: """ElementHandle.select_text @@ -2474,10 +2486,16 @@ async def select_text( """ return mapping.from_maybe_impl( - await self._impl_obj.select_text(force=force, timeout=timeout) + await self._impl_obj.select_text( + force=force, timeout=to_milliseconds(timeout) + ) ) - async def input_value(self, *, timeout: typing.Optional[float] = None) -> str: + async def input_value( + self, + *, + timeout: typing.Optional[typing.Union[float, datetime.timedelta]] = None, + ) -> str: """ElementHandle.input_value Returns `input.value` for the selected `` or `