@@ -211,6 +211,75 @@ async def test_execute_multiple_commands_multiplexing():
211211 assert len (mock_ws .sent_messages ) == 3
212212
213213
214+ @pytest .mark .asyncio
215+ async def test_execute_many_success ():
216+ """Test execute_many returns ordered command results."""
217+ mock_ws = MockWebSocket ()
218+
219+ # Queue responses in reverse order to verify request multiplexing.
220+ mock_ws .queue_message ({"id" : 2 , "result" : {"result" : {"type" : "number" , "value" : 2 }}})
221+ mock_ws .queue_message ({"id" : 1 , "result" : {"result" : {"type" : "number" , "value" : 1 }}})
222+
223+ with patch ('cdp.connection.websockets.connect' , new_callable = AsyncMock ) as mock_connect :
224+ mock_connect .return_value = mock_ws
225+
226+ async with CDPConnection ("ws://localhost:9222/test" ) as conn :
227+ results = await conn .execute_many ([
228+ runtime .evaluate (expression = "1" ),
229+ runtime .evaluate (expression = "2" ),
230+ ])
231+
232+ assert len (results ) == 2
233+ assert isinstance (results [0 ][0 ], runtime .RemoteObject )
234+ assert isinstance (results [1 ][0 ], runtime .RemoteObject )
235+ assert results [0 ][0 ].value == 1
236+ assert results [1 ][0 ].value == 2
237+ assert len (mock_ws .sent_messages ) == 2
238+
239+
240+ @pytest .mark .asyncio
241+ async def test_execute_many_return_exceptions ():
242+ """Test execute_many can collect exceptions instead of raising."""
243+ mock_ws = MockWebSocket ()
244+
245+ # First command succeeds, second command fails.
246+ mock_ws .queue_message ({"id" : 1 , "result" : {"result" : {"type" : "number" , "value" : 1 }}})
247+ mock_ws .queue_message ({"id" : 2 , "error" : {"code" : - 32602 , "message" : "Invalid params" }})
248+
249+ with patch ('cdp.connection.websockets.connect' , new_callable = AsyncMock ) as mock_connect :
250+ mock_connect .return_value = mock_ws
251+
252+ async with CDPConnection ("ws://localhost:9222/test" ) as conn :
253+ results = await conn .execute_many (
254+ [
255+ runtime .evaluate (expression = "1" ),
256+ page .navigate (url = "https://example.com" ),
257+ ],
258+ return_exceptions = True ,
259+ )
260+
261+ assert len (results ) == 2
262+ assert isinstance (results [0 ][0 ], runtime .RemoteObject )
263+ assert results [0 ][0 ].value == 1
264+ assert isinstance (results [1 ], CDPCommandError )
265+ assert results [1 ].code == - 32602
266+
267+
268+ @pytest .mark .asyncio
269+ async def test_execute_many_raises_first_exception_by_default ():
270+ """Test execute_many raises command errors by default."""
271+ mock_ws = MockWebSocket ()
272+ mock_ws .queue_message ({"id" : 1 , "error" : {"code" : - 32000 , "message" : "Command failed" }})
273+
274+ with patch ('cdp.connection.websockets.connect' , new_callable = AsyncMock ) as mock_connect :
275+ mock_connect .return_value = mock_ws
276+
277+ async with CDPConnection ("ws://localhost:9222/test" ) as conn :
278+ with pytest .raises (CDPCommandError ) as exc_info :
279+ await conn .execute_many ([page .navigate (url = "https://example.com" )])
280+ assert exc_info .value .code == - 32000
281+
282+
214283@pytest .mark .asyncio
215284async def test_command_timeout ():
216285 """Test command timeout."""
0 commit comments