【问题标题】:Selenium 3 python: add listener for Chrome DevTools network eventSelenium 3 python:为 Chrome DevTools 网络事件添加监听器
【发布时间】:2021-01-20 11:20:04
【问题描述】:

我在 python 中使用Selenium 3。目前可以使用execute_cdp_cmd绑定发送Chrome DevTools命令:

from selenium import webdriver

driver = webdriver.Chrome()
response = driver.execute_cdp_cmd('Network.getAllCookies', {})
print(response)

是否有可能以某种方式为Network Event 添加监听器?比如:

driver.execute_cdp_cmd('Network.enable')
driver.add_listener('Network.dataReceived', my_listener)

它应该在 Selenium 4 中得到原生支持(目前为 alpha 版本),但我想知道是否可以在 Selenium 3 中实现这一点。

【问题讨论】:

    标签: python selenium google-chrome google-chrome-devtools chrome-devtools-protocol


    【解决方案1】:

    我认为您不能在 Selenium 3 中执行此操作。在 Selenium 3 中,add_listener 看起来不像 Java 中的 addListener。似乎它只接收 Console.ERROR Console.ALLConsole.Log 作为参数。

        @asynccontextmanager
        async def add_listener(self, event_type):
            '''
            Listens for certain events that are passed in.
    
            :Args:
             - event_type: The type of event that we want to look at.
    
             :Usage:
                 ::
    
                    async with driver.add_listener(Console.log) as messages:
                        driver.execute_script("console.log('I like cheese')")
                    assert messages["message"] == "I love cheese"
    
            '''
            assert sys.version_info >= (3, 7)
            global cdp
            from selenium.webdriver.common.bidi.console import Console
    
            async with self._get_bidi_connection():
                global devtools
                session = cdp.get_session_context('page.enable')
                await session.execute(devtools.page.enable())
                session = cdp.get_session_context('console.enable')
                await session.execute(devtools.console.enable())
                console = {
                    "message": None,
                    "level": None
                }
                async with session.wait_for(devtools.console.MessageAdded) as messages:
                    yield console
                if event_type == Console.ERROR:
                    if messages.value.message.level == "error":
                        console["message"] = messages.value.message.text
                        console["level"] = messages.value.message.level
                elif event_type == Console.ALL:
                    console["message"] = messages.value.message.text
                    console["level"] = messages.value.message.level
    

    此外,目前 Selenium 4 似乎不支持此功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 2020-02-25
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      相关资源
      最近更新 更多