Chrome Selenium CDP Bidi API:新Target Session命令无效问题求助
监听TargetCreated事件并向新发现的Target发送CDP命令失败
使用最新版Selenium与Chrome,在监听TargetCreated事件并向每个新发现的Target发送CDP命令时遇到问题:
1. 初始Bidi会话执行正常
启动Bidi会话并发送命令可成功覆盖JavaScript属性,代码如下:
async with self.driver.bidi_connection() as connection: self.cdp_bidi_main_session, self.cdp_bidi_main_devtools, self.cdp_cdp = connection.session, connection.devtools, connection.cdp await self.cdp_bidi_main_session.execute(self.cdp_bidi_main_devtools.page.enable()) await self.__inject_javascript_object_via_bidi(self.cdp_bidi_main_session, self.cdp_bidi_main_devtools)
2. TargetCreated事件处理未达预期
成功监听并接收TargetCreated事件后,附加到目标并启动会话发送命令没有效果,代码如下:
event = new_targetcreated_event_received async with self.driver.bidi_connection_with_target(event.target_info.target_id, self.target_attached_counter) as connection: # 已修改Selenium Bidi源码,支持选择会话目标并递增命令ID cdp_bidi_main_session, cdp_bidi_main_devtools, cdp_cdp, cdp_ws_url = connection.session, connection.devtools, connection.cdp, connection.ws_url await cdp_bidi_main_session.execute(cdp_bidi_main_devtools.page.enable()) # await trio.sleep(2) -> 无差异 await self.__inject_javascript_object_via_bidi(cdp_bidi_main_session, cdp_bidi_main_devtools)
已尝试的方案
- 使用手动会话命令发送工具
- 深入研究WS CDP协议
- 暂未尝试在启动新会话前断开旧会话(会终止监听器,操作难度大)
命令输出示例
F054E949597158BF152714D31B7D2DBD {"method": "Target.getTargets", "params": {}, "id": 0} {"method": "Target.attachToTarget", "params": {"targetId": "F054E949597158BF152714D31B7D2DBD", "flatten": true}, "id": 1} ws://localhost:9222/devtools/browser/ce75db14-2dd8-41b3-92d7-2125604f4154 {"method": "Page.enable", "id": 0, "sessionId": "F9F2C2303E47C4F042BC46B789AEF1DF"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'deviceMemory', {get: () => 32})"}, "id": 1, "sessionId": "F9F2C2303E47C4F042BC46B789AEF1DF"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => false})"}, "id": 2, "sessionId": "F9F2C2303E47C4F042BC46B789AEF1DF"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en','fr-FR', 'fr']})"}, "id": 3, "sessionId": "F9F2C2303E47C4F042BC46B789AEF1DF"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'language', {get: () => ''fr-FR'})"}, "id": 4, "sessionId": "F9F2C2303E47C4F042BC46B789AEF1DF"} {"method": "Target.setDiscoverTargets", "params": {"discover": true}, "id": 5, "sessionId": "F9F2C2303E47C4F042BC46B789AEF1DF"} mitm targets thread started TargetCreated(target_info=TargetInfo(target_id=TargetID('28FECF0B602368C5FDC98F1CD7AA42B3'), type_='page', title='New Tab', url='chrome://newtab/', attached=False, can_access_opener=False, opener_id=None, opener_frame_id=None, browser_context_id=BrowserContextID('ECC6C0EB1E4D82FF193AF53D9EAE8486'), subtype=None)) {"method": "Target.attachToTarget", "params": {"targetId": "28FECF0B602368C5FDC98F1CD7AA42B3", "flatten": true}, "id": 2} {"method": "Page.enable", "id": 0, "sessionId": "D967794A83E55D16C23734D11FF69DB6"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'deviceMemory', {get: () => 32})"}, "id": 1, "sessionId": "D967794A83E55D16C23734D11FF69DB6"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => false})"}, "id": 2, "sessionId": "D967794A83E55D16C23734D11FF69DB6"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en','fr-FR', 'fr']})"}, "id": 3, "sessionId": "D967794A83E55D16C23734D11FF69DB6"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'language', {get: () => ''fr-FR'})"}, "id": 4, "sessionId": "D967794A83E55D16C23734D11FF69DB6"} TargetCreated(target_info=TargetInfo(target_id=TargetID('253AFEEF629E8CB2B201B2F78703AEE8'), type_='iframe', title='', url='', attached=False, can_access_opener=False, opener_id=None, opener_frame_id=None, browser_context_id=BrowserContextID('ECC6C0EB1E4D82FF193AF53D9EAE8486'), subtype=None)) {"method": "Target.attachToTarget", "params": {"targetId": "253AFEEF629E8CB2B201B2F78703AEE8", "flatten": true}, "id": 3} {"method": "Page.enable", "id": 0, "sessionId": "101425CF703EC42579FC95DF071DB019"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'deviceMemory', {get: () => 32})"}, "id": 1, "sessionId": "101425CF703EC42579FC95DF071DB019"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'webdriver', {get: () => false})"}, "id": 2, "sessionId": "101425CF703EC42579FC95DF071DB019"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'languages', {get: () => ['en-US', 'en','fr-FR', 'fr']})"}, "id": 3, "sessionId": "101425CF703EC42579FC95DF071DB019"} {"method": "Page.addScriptToEvaluateOnNewDocument", "params": {"source": "Object.defineProperty(navigator, 'language', {get: () => ''fr-FR'})"}, "id": 4, "sessionId": "101425CF703EC42579FC95DF071DB019"}
附言:已修改Selenium Bidi源码,支持在启动会话时指定目标会话和命令ID。
内容的提问来源于stack exchange,提问作者PsyTrxOps
相关产品推荐
相关产品推荐

