Selenium 4.23.0远程WebDriver调用ConsoleAPICalled与add_console_message_handler报错
解决Selenium 4.23.0远程WebDriver(Selenoid)监控控制台消息与JS异常的问题
前提确认
- 确保Selenoid版本≥1.12.0,使用的浏览器镜像支持BiDi协议(如Chrome 118+、Firefox 115+),且镜像内置对应版本的WebDriver。
- 在浏览器能力配置中明确设置
enable_bidi: True,同时Selenoid后台已开启BiDi支持。
针对你遇到的错误,逐一修正方案:
1. 解决'ConsoleAPICalled' object is not subscriptable错误
该错误源于错误调用DevTools事件常量。Selenium 4.23.0的BiDi API已封装了控制台消息的订阅方法,无需直接操作DevTools的事件对象,放弃test_websocket.on(test_devtools.runtime.ConsoleAPICalled, ...)的写法,改用BiDi会话的内置方法。
2. 解决'session.subscribe' wasn't found与AttributeError问题
这两个问题的核心是未正确初始化BiDi会话,或Selenoid浏览器实例未启用BiDi支持。按以下步骤修正:
步骤1:初始化带BiDi支持的Remote WebDriver
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 配置Chrome选项与Selenoid参数 chrome_options = Options() chrome_options.add_argument("--headless=new") # 开启BiDi支持 chrome_options.set_capability("enable_bidi", True) # Selenoid自定义配置 chrome_options.set_capability("selenoid:options", { "enableVNC": True, "enableVideo": False, "browserName": "chrome", "browserVersion": "126.0" # 使用支持BiDi的浏览器版本 }) # 初始化Remote WebDriver driver = webdriver.Remote( command_executor="http://你的Selenoid地址:4444/wd/hub", options=chrome_options )
步骤2:建立BiDi会话并订阅事件
# 定义控制台消息处理函数 def handle_console_message(event): msg_content = event["params"]["message"] print(f"[Console] {msg_content['type']}: {msg_content['text']}") # 定义JavaScript异常处理函数 def handle_js_exception(event): exception = event["params"]["exceptionDetails"]["exception"] print(f"[JS Error] {exception['description']}") # 建立并启动BiDi会话 bidi_session = driver.bidi_connection() bidi_session.start() # 订阅控制台消息与JS异常 bidi_session.script.add_console_message_handler(handle_console_message) bidi_session.script.add_script_exception_handler(handle_js_exception)
步骤3:测试验证
执行一段会触发控制台输出和JS异常的代码,验证是否能正常捕获:
# 触发控制台日志 driver.execute_script("console.log('测试控制台日志');") # 触发JS异常 driver.execute_script("throw new Error('测试JS异常');") # 等待事件捕获(根据实际场景调整等待时间) import time time.sleep(2) # 清理资源 bidi_session.close() driver.quit()
额外注意事项
- 如果使用Firefox,需将
chrome_options替换为firefox_options,并补充配置:from selenium.webdriver.firefox.options import Options firefox_options = Options() firefox_options.set_capability("enable_bidi", True) firefox_options.set_capability("moz:debuggerAddress", True) - 若仍出现WebSocket连接问题,检查Selenoid的防火墙规则,确保4444端口(默认)允许WebSocket通信。
内容的提问来源于stack exchange,提问作者KulOlga
相关产品推荐
相关产品推荐

