Files
skill-template/tools/ui_inspector/drivers/browser_pw.py
chendelian 633ecff4e2 chore: archive tools/ui_inspector snapshot before migration removal.
Keep the last in-template copy on main so history can restore it; product continues in jiangchang-ui-recorder.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-07 11:19:14 +08:00

91 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Browser whole-page dump via Inspector Playwright session + kit page_dump."""
from __future__ import annotations
from typing import Any, Optional
import kit_browser
import target
from .base import DumpResult
class BrowserPlaywrightDriver:
surface = target.SURFACE_BROWSER
driver_name = "playwright"
def dump(
self,
*,
info: Any,
selection_meta: dict[str, Any],
max_depth: int = 16,
max_nodes: int = 8000,
warmup_mode: str = "full",
merge_same_pid_if_sparse: bool = True,
warmed_pids: Optional[set[int]] = None,
page_id: str = "",
document_id: str = "",
frame_id: str = "",
) -> DumpResult:
del max_depth, warmup_mode, merge_same_pid_if_sparse, warmed_pids # unused
sess = kit_browser.ensure_session()
dump = kit_browser.dump_current_page(
max_nodes=max_nodes, locatable_limit=300, page_id=page_id
)
try:
png = kit_browser.screenshot_png(page_id=page_id)
except Exception:
png = None
from jiangchang_skill_core.rpa.page_dump import (
format_locatable_text,
format_tree_text,
)
url = dump.get("url") or ""
page_title = dump.get("title") or ""
window = info.to_dict() if hasattr(info, "to_dict") else dict(info or {})
# Prefer live page identity for labeling / meta
window = {
**window,
"title": page_title or window.get("title") or "",
"class_name": window.get("class_name") or "PlaywrightPage",
"process_name": window.get("process_name") or "chrome.exe",
"url": url,
}
stats = dict(dump.get("stats") or {})
active_page = dict(stats.get("active_page") or {})
stats["browser_session"] = {
"profile_dir": sess.get("profile_dir"),
"reused": sess.get("reused"),
"page_count": active_page.get("page_count") or sess.get("page_count"),
"resolve": active_page.get("resolve") or "visible",
"note": (
"dump 来自 Inspector 自管 Playwright 的当前可见标签页"
"(document.visibilityState),不是系统 Chrome 的 UIA,"
"也不是固定的 pages[0]。多标签时请切到目标页再拾取。"
),
}
sel = dict(selection_meta or {})
sel["surface"] = self.surface
sel["browser_url"] = url
sel["page_id"] = page_id or active_page.get("page_id") or ""
sel["document_id"] = document_id
sel["frame_id"] = frame_id
return DumpResult(
surface=self.surface,
driver=self.driver_name,
window=window,
tree=dump.get("tree") or {},
index=list(dump.get("index") or []),
locatable=list(dump.get("locatable") or []),
stats=stats,
selection=sel,
url=url,
page_title=page_title,
locatable_text=format_locatable_text(dump.get("locatable") or []),
tree_text=format_tree_text(dump.get("tree") or {}),
screenshot_bytes=png,
use_hwnd_screenshot=False,
)