You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:37:09