Skip to content

Commit f7349a4

Browse files
committed
feat(debug): add comprehensive error snapshots for headless disconnect debugging
- New debug_utils module with 7 artifact types (DOM structure, console logs, network state, etc.) - Date-based snapshot structure: errors_py/YYYY-MM-DD/HH-MM-SS_reqid_errorname/ - Global console and network logging listeners in initialization - Enhanced error capture in queue_worker with headless mode context - Backward-compatible refactor of save_error_snapshot
1 parent 6371f9d commit f7349a4

7 files changed

Lines changed: 671 additions & 78 deletions

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ env.bak/
215215
venv.bak/
216216

217217
# Error snapshots directory (Python specific)
218-
errors_py/
218+
# New date-based structure: errors_py/YYYY-MM-DD/HH-MM-SS_reqid_errorname/
219+
errors_py/*/
220+
!errors_py/.gitkeep
219221
logs/
220222

221223
# Authentication Profiles (Sensitive)

api_utils/queue_worker.py

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -430,17 +430,61 @@ async def non_streaming_disconnect_monitor():
430430
logger.warning(
431431
f"[{req_id}] ⚠️ 流式响应后按钮状态处理超时或错误: {e_pw_disabled}"
432432
)
433-
from api_utils.request_processor import (
434-
save_error_snapshot,
435-
)
436-
437-
await save_error_snapshot(
438-
f"stream_post_submit_button_handling_timeout_{req_id}"
439-
)
440-
except ClientDisconnectedError:
433+
# Use comprehensive snapshot for better debugging
434+
from browser_utils.debug_utils import save_comprehensive_snapshot
435+
from server import page_instance
436+
from config import PROMPT_TEXTAREA_SELECTOR
437+
import os
438+
439+
if page_instance:
440+
await save_comprehensive_snapshot(
441+
page=page_instance,
442+
error_name="stream_post_submit_button_handling_timeout",
443+
req_id=req_id,
444+
error_stage="流式响应后按钮状态处理",
445+
additional_context={
446+
"headless_mode": os.environ.get("HEADLESS", "true").lower() == "true",
447+
"completion_event_set": completion_event.is_set() if completion_event else None,
448+
"client_disconnected_early": client_disconnected_early,
449+
"error_type": type(e_pw_disabled).__name__,
450+
"error_message": str(e_pw_disabled)
451+
},
452+
locators={
453+
"submit_button": submit_btn_loc,
454+
"input_field": page_instance.locator(PROMPT_TEXTAREA_SELECTOR)
455+
},
456+
error_exception=e_pw_disabled
457+
)
458+
except ClientDisconnectedError as e_client_disco:
441459
logger.info(
442460
f"[{req_id}] 客户端在流式响应后按钮状态处理时断开连接。"
443461
)
462+
# Capture comprehensive snapshot for CLIENT DISCONNECT issue
463+
from browser_utils.debug_utils import save_comprehensive_snapshot
464+
from server import page_instance
465+
from config import PROMPT_TEXTAREA_SELECTOR
466+
import os
467+
468+
if page_instance:
469+
await save_comprehensive_snapshot(
470+
page=page_instance,
471+
error_name="stream_post_button_check_client_disconnect",
472+
req_id=req_id,
473+
error_stage="流式响应后按钮状态检查 - 前置检查",
474+
additional_context={
475+
"headless_mode": os.environ.get("HEADLESS", "true").lower() == "true",
476+
"completion_event_set": completion_event.is_set() if completion_event else None,
477+
"client_disconnected_early": client_disconnected_early,
478+
"error_type": "ClientDisconnectedError",
479+
"error_message": str(e_client_disco),
480+
"note": "This is the headless mode false positive we're investigating"
481+
},
482+
locators={
483+
"submit_button": submit_btn_loc,
484+
"input_field": page_instance.locator(PROMPT_TEXTAREA_SELECTOR)
485+
},
486+
error_exception=e_client_disco
487+
)
444488
elif completion_event and current_request_was_streaming:
445489
logger.warning(
446490
f"[{req_id}] (Worker) 流式请求但 submit_btn_loc 或 client_disco_checker 未提供。跳过按钮禁用等待。"

browser_utils/__init__.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
)
2424
from .script_manager import ScriptManager, script_manager
2525
from .page_controller import PageController
26+
from .debug_utils import (
27+
save_comprehensive_snapshot,
28+
save_error_snapshot_legacy,
29+
get_texas_timestamp,
30+
capture_dom_structure,
31+
capture_playwright_state
32+
)
2633

2734
__all__ = [
2835
# 初始化相关
@@ -56,5 +63,12 @@
5663
'script_manager',
5764

5865
# Page Controller
59-
'PageController'
66+
'PageController',
67+
68+
# Debug utilities (comprehensive error snapshots)
69+
'save_comprehensive_snapshot',
70+
'save_error_snapshot_legacy',
71+
'get_texas_timestamp',
72+
'capture_dom_structure',
73+
'capture_playwright_state'
6074
]

0 commit comments

Comments
 (0)