问题描述
我正在使用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.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 似乎不支持此功能。