Selenium 3 python: добавить прослушиватель для сетевого события Chrome DevTools

#python #selenium #google-chrome #google-chrome-devtools #chrome-devtools-protocol

#python #selenium #google-chrome #google-chrome-devtools #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)
  

Возможно ли как-то добавить прослушиватель для сетевого события? Что-то вроде:

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

Он должен изначально поддерживаться в Selenium 4 (в настоящее время в альфа-версии), но я хотел бы знать, возможно ли заставить это работать в Selenium 3.

Ответ №1:

Я думаю, вы не можете сделать это в Selenium 3. В Selenium 3 add_listener не похоже addListener на Java. Кажется, он получает только Console.ERROR Console.ALL и Console.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.