Chrome Selenium CDP Bidi API - 发送到目标会话的下一个命令无效,而第一个命令有效

问题描述 投票:0回答:1

大家好,我在尝试挂钩 TargetCreated Event 并向找到的每个新目标发送 CDP 命令时遇到了很大麻烦。

我正在使用最后的 Selenium 和 Chrome。

我启动 Bidi 会话并发送命令,它按预期工作。

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)

javascript 属性已成功覆盖。

但是,在侦听 TargetCreated Event 并成功接收它们时,附加到目标然后启动会话来发送命令无法按预期工作...

event = new_targetcreated_event_received
async with self.driver.bidi_connection_with_target(event.target_info.target_id, self.target_attached_counter) as connection: -> I have modified selenium bidi source to make us able choosing session target and incrementing command ids
    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) -> no differences
    await self.__inject_javascript_object_via_bidi(cdp_bidi_main_session, cdp_bidi_main_devtools)

我努力尝试很多不同的事情:

我没有尝试过的:

  • 在启动新会话之前从会话中分离,因为这很难做到,因为这会杀死监听者......

这是发送的命令的示例输出,您会发现这应该按预期工作......

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"}

P.S :我修改了selenium bidi的源代码,这样我们就可以在会话打开时指定目标会话和命令ID。

google-chrome selenium-webdriver selenium-chromedriver google-chrome-devtools cdp
1个回答
0
投票

好的,我找到答案了。

附加会话销毁后,发送的命令将被销毁。

因此,您必须在外部线程中保留打开的扁平化会话引用以保留命令数据。

© www.soinside.com 2019 - 2024. All rights reserved.