From ac9e4118437a72ad7c15af37aea28df1edc77eab Mon Sep 17 00:00:00 2001 From: nxs7 <69392661+nxs7@users.noreply.github.com> Date: Fri, 5 Sep 2025 01:56:06 +0800 Subject: [PATCH 1/2] [py]: allow CDP and BiDi event callbacks to determine event triggering order --- .../webdriver/remote/websocket_connection.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/py/selenium/webdriver/remote/websocket_connection.py b/py/selenium/webdriver/remote/websocket_connection.py index 55dc83471b1a4..685aa79956307 100644 --- a/py/selenium/webdriver/remote/websocket_connection.py +++ b/py/selenium/webdriver/remote/websocket_connection.py @@ -39,6 +39,7 @@ def __init__(self, url): self.url = url self._id = 0 + self._sequence = 0 self._messages = {} self._started = False @@ -78,12 +79,15 @@ def execute(self, command): return self._deserialize_result(result, command) def add_callback(self, event, callback): + self.add_callback_with_sequence(event, lambda _, x: callback(x)) + + def add_callback_with_sequence(self, event, callback): event_name = event.event_class if event_name not in self.callbacks: self.callbacks[event_name] = [] - def _callback(params): - callback(event.from_json(params)) + def _callback(sequence, params): + callback(sequence, event.from_json(params)) self.callbacks[event_name].append(_callback) return id(_callback) @@ -113,7 +117,8 @@ def on_open(ws): self._started = True def on_message(ws, message): - self._process_message(message) + self._sequence += 1 + self._process_message(self._sequence, message) def on_error(ws, error): logger.debug(f"error: {error}") @@ -129,7 +134,7 @@ def run_socket(): self._ws_thread = Thread(target=run_socket) self._ws_thread.start() - def _process_message(self, message): + def _process_message(self, sequence, message): message = json.loads(message) logger.debug(f"<- {message}"[: self._max_log_message_size]) @@ -139,7 +144,7 @@ def _process_message(self, message): if "method" in message: params = message["params"] for callback in self.callbacks.get(message["method"], []): - Thread(target=callback, args=(params,)).start() + Thread(target=callback, args=(sequence, params)).start() def _wait_until(self, condition): timeout = self._response_wait_timeout From fd171d1742aea7c1eb4a3dcfa0394d811bb4bc50 Mon Sep 17 00:00:00 2001 From: nxs7 <69392661+nxs7@users.noreply.github.com> Date: Fri, 5 Sep 2025 12:15:51 +0800 Subject: [PATCH 2/2] fix return value --- py/selenium/webdriver/remote/websocket_connection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/py/selenium/webdriver/remote/websocket_connection.py b/py/selenium/webdriver/remote/websocket_connection.py index 685aa79956307..9f31908866090 100644 --- a/py/selenium/webdriver/remote/websocket_connection.py +++ b/py/selenium/webdriver/remote/websocket_connection.py @@ -79,7 +79,7 @@ def execute(self, command): return self._deserialize_result(result, command) def add_callback(self, event, callback): - self.add_callback_with_sequence(event, lambda _, x: callback(x)) + return self.add_callback_with_sequence(event, lambda _, x: callback(x)) def add_callback_with_sequence(self, event, callback): event_name = event.event_class