【问题标题】: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.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 似乎不支持此功能。