From 6cd41a5cc58c18e08d4ef2440e440741117789b3 Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Tue, 23 Jul 2024 08:26:05 +0200 Subject: [PATCH] page wait load timeout and fix --- bidi.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/bidi.py b/bidi.py index 7387e6d..eb3d1f2 100755 --- a/bidi.py +++ b/bidi.py @@ -19,6 +19,10 @@ class WebdriverError(RuntimeError): pass +# default timeout +TIMEOUT = 5 # TODO: raise to 15 + + @dataclass class LogMessage: level: str # like "info" @@ -140,9 +144,11 @@ class WebdriverBidi: self.logs.append(LogMessage(data["params"])) continue if data["method"] == "browsingContext.domContentLoaded": - logger.debug("page loaded: %r", data["params"]) if self.future_wait_page_load: + logger.debug("page loaded: %r, resolving wait page load future", data["params"]) self.future_wait_page_load.set_result(data["params"]["url"]) + else: + logger.debug("page loaded: %r (not awaited)", data["params"]) continue logger.warning("ws_reader: unhandled message %r", data) @@ -165,9 +171,14 @@ class WebdriverBidi: assert self.future_wait_page_load is None, "already waiting for page load" self.future_wait_page_load = asyncio.get_event_loop().create_future() - async def wait_page_load(self): + async def wait_page_load(self, timeout: int = TIMEOUT) -> str: assert self.future_wait_page_load is not None, "call arm_page_load() first" - return await self.future_wait_page_load + try: + url = await asyncio.wait_for(self.future_wait_page_load, timeout=timeout) + self.future_wait_page_load = None + return url + except asyncio.TimeoutError as e: + raise ValueError("timed out waiting for page load") from e # # High-level helpers