如何在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
相关产品推荐
相关产品推荐

