Selenium 3 Python:为Chrome DevTools网络事件添加侦听器

问题描述

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

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中进行这项工作。

解决方法

我认为您不能在 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 似乎不支持此功能。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...