2

我已经从源代码构建并安装了Selenium 4.0.0-beta-1 python 轮以测试CDP功能。具体来说,我想使用Fetch Domain protocol拦截请求。

我可以使用命令启用域Fetch.enable,但我看不到如何订阅Fetch.requestPaused之类的事件来拦截请求:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

driver = webdriver.Chrome()

# Enable Fetch domain
driver.execute_cdp_cmd('Fetch.enable', cmd_args={})

# How to subscribe to Fetch.requestPaused event??
# driver.add_cdp_event_listener ... 

谢谢你的帮助!

4

1 回答 1

5

在 selenium 4.0.0rc1 上测试,使用 chromedriver v94(最新于 2021 年 9 月 21 日)。

import trio # async library that selenium uses
from selenium import webdriver

async def start_listening(listener):
    async for event in listener:
        print(event)

async def main():
    driver = webdriver.Chrome()

    async with driver.bidi_connection() as connection:
        session, devtools = connection.session, connection.devtools

        # await session.execute(devtools.fetch.enable())
        await session.execute(devtools.network.enable())

        # listener = session.listen(devtools.fetch.RequestPaused)
        listener = session.listen(devtools.network.ResponseReceived)
        async with trio.open_nursery() as nursery:
            nursery.start_soon(start_listening, listener) # start_listening blocks, so we run it in another coroutine

            driver.get('https://google.com')


trio.run(main)

需要注意的几点:

  • 不幸的是,它目前似乎不起作用Fetch.requestPausedFetch.enable发送命令并暂停请求,但似乎 selenium 从未收到该RequestPaused事件。(这就是代码片段使用的原因Network.responseReceived
  • 该类没有文档devtools,但您仍然可以查看源 .py 文件以获取可用属性。
于 2021-05-02T10:00:06.237 回答