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>
91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
"""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,
|
||
)
|