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

如何在Python中获取Chrome控制台日志中的Object详情?

问题描述

我目前用Selenium获取Chrome浏览器控制台日志,以下是能正常获取日志的配置代码:

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

# 启用浏览器日志
d = DesiredCapabilities.CHROME
d['goog:loggingPrefs'] = { 'browser':'ALL' }
driver = webdriver.Chrome(desired_capabilities=d)

# 加载目标网页
driver.get("http://192.168.5.5")

# 打印日志消息
for entry in driver.get_log('browser'):
    print(entry)

问题在于返回的entry是字典,其中message字段是Object的字符串形式(比如"[END REQUEST]: Response:" Object Object),无法访问Object内部内容。在浏览器里能展开这些Object查看内部的字典结构,请问怎么在Python里实现类似操作,获取控制台日志Object的内部数据?不局限于使用Selenium。

补充示例:

  • entry输出示例:
    {'level': 'INFO', 'message': 'http://192.168.5.5/app.e52b3dcc.bundle.js 58:31633 "[END REQUEST]: Response:" Object Object', 'source': 'console-api', 'timestamp': 1663609942539}
    
  • 浏览器中展开的Object示例:
    [END REQUEST]: Response: 
    Object
    data1: "SOMEPIECEOFDATA"
    response: {moreData: {…}, status: 1, type: 'response'}
    [[Prototype]]: Object
    
解决方案

方法1:修改前端代码,输出序列化后的JSON

这是最可靠的方案。浏览器控制台打印Object时,前端能直接访问对象,但通过Selenium取日志时,对象会被转成Object Object字符串——这是因为前端用了console.log("[END REQUEST]: Response:", obj)的写法,第二个参数是对象,日志系统仅将其转为字符串标识。

修改前端的console输出,把对象序列化为JSON字符串:

// 原代码
console.log("[END REQUEST]: Response:", responseObj);

// 修改后
console.log("[END REQUEST]: Response:", JSON.stringify(responseObj));

此时Python拿到的message字段会包含完整JSON串,直接用json.loads()解析即可:

import json

for entry in driver.get_log('browser'):
    msg = entry['message']
    # 提取JSON部分(可根据实际日志格式调整字符串处理逻辑)
    if '[END REQUEST]: Response:' in msg:
        json_part = msg.split('[END REQUEST]: Response:')[1].strip()
        try:
            data = json.loads(json_part)
            print(data['data1'])
            print(data['response'])
        except json.JSONDecodeError:
            # 处理解析失败的情况
            pass

方法2:用Chrome DevTools Protocol(CDP)获取结构化日志

Selenium底层依赖CDP,但直接调用CDP接口能拿到更原始的日志数据,包括控制台输出的结构化参数,无需修改前端。

通过Selenium调用CDP接口

from selenium import webdriver

driver = webdriver.Chrome()
# 启用控制台日志监听
driver.execute_cdp_cmd('Log.enable', {})

def handle_log(message):
    if message['method'] == 'Log.entryAdded':
        entry = message['params']['entry']
        # 仅处理console-api类型的日志
        if entry['source'] == 'console-api' and 'args' in entry:
            for arg in entry['args']:
                # 若参数是对象,调用CDP获取完整属性
                if arg.get('type') == 'object' and 'objectId' in arg:
                    props = driver.execute_cdp_cmd('Runtime.getProperties', {
                        'objectId': arg['objectId'],
                        'ownProperties': True
                    })
                    # 整理对象属性
                    obj_data = {}
                    for prop in props['result']:
                        if not prop.get('isSymbol') and 'value' in prop:
                            obj_data[prop['name']] = prop['value'].get('value')
                    print(f"解析后的对象:{obj_data}")
                elif arg.get('type') == 'string':
                    print(f"字符串消息:{arg['value']}")

# 添加日志监听回调
driver.add_cdp_listener('Log.entryAdded', handle_log)

# 加载目标页面
driver.get("http://192.168.5.5")

# 等待日志输出完成(可根据实际场景替换为显式等待)
input("按回车结束...")
driver.quit()

方法3:解析现有字符串(兜底方案)

如果无法修改前端也不想用CDP,只能尝试解析message中的字符串,但这种方法稳定性极差——因为字符串没有结构化信息,只能依赖固定格式做正则匹配或字段提取,比如从页面网络请求响应中同步获取对应数据。仅在极端场景下作为临时方案使用,不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:10:28