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

如何在Python Selenium 4中为控制台日志添加事件监听器?

问题:Python Selenium 4中如何自动监听并显示浏览器控制台日志?

我有一段能在调用函数时获取控制台日志的代码,但问题是driver.get_log('browser')返回的日志列表不会自动更新,只有调用printConsoleLogs函数时才会收集日志。请问如何在Python Selenium 4中为控制台添加事件监听器,实现自动显示控制台日志?

原代码如下:

from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.log import Log
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium import webdriver
import trio
import time

service = Service(executable_path=f"C:/Users/Dell/Desktop/PyCharm/bl/chromedriver.exe")

def wait_seconds(t):
   time.sleep(t)

def printConsoleLogs():
   options = Options()
   options.add_experimental_option('excludeSwitches', ['enable-logging'])

   dc = DesiredCapabilities.CHROME
   dc["goog:loggingPrefs"] = {"browser":"INFO"}

   driver = webdriver.Chrome(service=service, options=options, desired_capabilities=dc)
   driver.get("http://localhost:9091")

   time.sleep(5)

   for entry in driver.get_log('browser'):
        print(entry)

   time.sleep(5)

   for repeat in driver.get_log('browser'):
        print(repeat)

printConsoleLogs()

解决方案:实时监听控制台日志的实现思路和代码

Selenium本身没有内置的实时日志推送机制,我们可以通过轮询+去重的方式模拟自动监听效果——定期调用get_log('browser'),只输出新增的日志条目。

修改后的代码

from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium import webdriver
import time

service = Service(executable_path=f"C:/Users/Dell/Desktop/PyCharm/bl/chromedriver.exe")

def listen_console_logs():
    options = Options()
    options.add_experimental_option('excludeSwitches', ['enable-logging'])

    # 配置日志偏好,确保能捕获浏览器控制台日志
    dc = DesiredCapabilities.CHROME
    dc["goog:loggingPrefs"] = {"browser": "INFO"}

    driver = webdriver.Chrome(service=service, options=options, desired_capabilities=dc)
    driver.get("http://localhost:9091")

    # 存储已输出的日志唯一标识,避免重复打印
    seen_log_ids = set()
    try:
        # 持续监听,可根据需求自定义终止条件
        while True:
            # 获取当前所有控制台日志
            logs = driver.get_log('browser')
            for entry in logs:
                # 用日志的timestamp作为唯一ID(也可结合message等字段增强唯一性)
                log_id = entry['timestamp']
                if log_id not in seen_log_ids:
                    seen_log_ids.add(log_id)
                    # 格式化输出日志,更易读
                    print(f"[{entry['level']}] {entry['message']}")
            # 轮询间隔,单位秒,可根据需求调整(越小越接近实时)
            time.sleep(0.5)
    except KeyboardInterrupt:
        print("\n监听已手动停止")
    finally:
        driver.quit()

if __name__ == "__main__":
    listen_console_logs()

关键细节说明

  • 去重逻辑:利用日志的timestamp字段作为唯一标识,确保每条日志只输出一次,避免重复打印历史日志。
  • 轮询机制:通过无限循环定期调用get_log,模拟实时监听效果,间隔时间可根据实际需求调整(0.5秒是兼顾实时性和资源消耗的折中值)。
  • 终止条件:示例中用Ctrl+C(KeyboardInterrupt)手动终止监听,你也可以添加业务相关的终止条件,比如页面加载完成、特定元素出现、超时等。

内容的提问来源于stack exchange,提问作者20MikeMike

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:46:00