"""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, )