@toolstackhq/cdpwright 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/browser/ChromiumManager.ts","../src/logging/Logger.ts","../src/core/Events.ts","../src/cdp/Connection.ts","../src/cdp/Session.ts","../src/core/Page.ts","../src/core/Frame.ts","../src/core/Waiter.ts","../src/core/Selectors.ts","../src/core/ShadowDom.ts","../src/core/Locator.ts","../src/core/UrlGuard.ts","../src/core/Browser.ts","../src/browser/Downloader.ts","../src/browser/Revision.ts","../src/assert/AssertionError.ts","../src/assert/expect.ts","../src/index.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { ChromiumManager } from \"./browser/ChromiumManager.js\";\nimport { automaton } from \"./index.js\";\nimport { PINNED_REVISION, resolveRevision } from \"./browser/Revision.js\";\nimport {\n detectPlatform,\n defaultCacheRoot,\n chromiumExecutableRelativePath,\n chromiumVersion,\n} from \"./browser/Downloader.js\";\nimport type { Browser } from \"./core/Browser.js\";\nimport type { Page } from \"./core/Page.js\";\n\nfunction printHelp() {\n console.log(`cdpwright (cpw) — Chromium automation CLI\n\nCommands:\n download [options] Download pinned Chromium snapshot\n install Alias for download\n open <url> Launch headed browser and navigate to URL\n screenshot <url> -o f Take a screenshot (PNG/JPEG)\n pdf <url> -o file.pdf Generate PDF of page (headless only)\n eval <url> <script> Run script in page, print result as JSON\n version Print cdpwright and Chromium versions\n\nDownload options:\n --latest Download the latest Chromium revision\n --mirror <url> Custom mirror base URL\n --url <url> Exact zip URL override\n\nCommon options:\n --headless Run in headless mode (default for screenshot, pdf, eval)\n --headed Run in headed mode (default for open)\n\nScreenshot options:\n -o, --output <file> Output file path (required)\n --full-page Capture full scrollable page\n\nPDF options:\n -o, --output <file> Output file path (required)\n Note: pdf always runs headless (CDP limitation)`);\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag);\n}\n\nfunction flagValue(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1 || index + 1 >= args.length) return undefined;\n return args[index + 1];\n}\n\nconst VALUE_FLAGS = [\"--mirror\", \"--url\", \"-o\", \"--output\"];\n\nfunction resolveHeadless(args: string[], defaultValue: boolean): boolean {\n if (hasFlag(args, \"--headed\")) return false;\n if (hasFlag(args, \"--headless\")) return true;\n return defaultValue;\n}\n\nfunction positionalArgs(args: string[]): string[] {\n const result: string[] = [];\n for (let i = 0; i < args.length; i++) {\n if (args[i].startsWith(\"-\")) {\n if (VALUE_FLAGS.includes(args[i])) i++;\n continue;\n }\n result.push(args[i]);\n }\n return result;\n}\n\nasync function withPage<T>(\n url: string,\n options: { headless?: boolean },\n fn: (page: Page, browser: Browser) => Promise<T>\n): Promise<T> {\n const args: string[] = [];\n if (process.platform === \"linux\") {\n args.push(\"--no-sandbox\", \"--no-zygote\", \"--disable-dev-shm-usage\");\n }\n const browser = await automaton.launch({\n headless: options.headless ?? true,\n args,\n logLevel: \"warn\",\n });\n try {\n const page = await browser.newPage();\n await page.goto(url, { waitUntil: \"load\" });\n return await fn(page, browser);\n } finally {\n await browser.close();\n }\n}\n\n// --- Commands ---\n\nasync function cmdDownload(rest: string[]) {\n const latest = hasFlag(rest, \"--latest\");\n const mirrorFlag = flagValue(rest, \"--mirror\");\n if (mirrorFlag) process.env.CDPWRIGHT_DOWNLOAD_MIRROR = mirrorFlag;\n const urlFlag = flagValue(rest, \"--url\");\n if (urlFlag) process.env.CDPWRIGHT_DOWNLOAD_URL = urlFlag;\n const manager = new ChromiumManager();\n await manager.download({ latest });\n}\n\nasync function cmdOpen(rest: string[]) {\n const url = positionalArgs(rest)[0];\n if (!url) {\n console.error(\"Usage: cpw open <url>\");\n process.exit(1);\n }\n\n const headless = resolveHeadless(rest, false);\n const args: string[] = [];\n if (process.platform === \"linux\") {\n args.push(\"--no-sandbox\", \"--no-zygote\", \"--disable-dev-shm-usage\");\n }\n\n const browser = await automaton.launch({\n headless,\n args,\n logLevel: \"warn\",\n });\n\n const page = await browser.newPage();\n await page.goto(url, { waitUntil: \"load\" });\n\n console.log(`Browser open at ${url}`);\n console.log(\"Press Ctrl+C to close.\");\n\n await new Promise<void>((resolve) => {\n process.on(\"SIGINT\", () => {\n console.log(\"\\nClosing browser...\");\n resolve();\n });\n process.on(\"SIGTERM\", () => resolve());\n });\n\n try {\n await browser.close();\n } catch {\n // browser may have already exited\n }\n}\n\nasync function cmdScreenshot(rest: string[]) {\n const url = positionalArgs(rest)[0];\n const output = flagValue(rest, \"-o\") || flagValue(rest, \"--output\");\n if (!url || !output) {\n console.error(\"Usage: cpw screenshot <url> -o <file> [--full-page]\");\n process.exit(1);\n }\n const fullPage = hasFlag(rest, \"--full-page\");\n const headless = resolveHeadless(rest, true);\n const format = output.endsWith(\".jpeg\") || output.endsWith(\".jpg\") ? \"jpeg\" as const : \"png\" as const;\n\n await withPage(url, { headless }, async (page) => {\n await page.screenshot({ path: output, format, fullPage });\n });\n\n console.log(`Screenshot saved to ${output}`);\n}\n\nasync function cmdPdf(rest: string[]) {\n const url = positionalArgs(rest)[0];\n const output = flagValue(rest, \"-o\") || flagValue(rest, \"--output\");\n if (!url || !output) {\n console.error(\"Usage: cpw pdf <url> -o <file>\");\n process.exit(1);\n }\n\n await withPage(url, { headless: true }, async (page) => {\n await page.pdf({ path: output, printBackground: true });\n });\n\n console.log(`PDF saved to ${output}`);\n}\n\nasync function cmdEval(rest: string[]) {\n const pos = positionalArgs(rest);\n const url = pos[0];\n const script = pos[1];\n if (!url || !script) {\n console.error(\"Usage: cpw eval <url> <script>\");\n process.exit(1);\n }\n\n const headless = resolveHeadless(rest, true);\n\n await withPage(url, { headless }, async (page) => {\n const result = await page.evaluate(script);\n const output = result === undefined ? \"undefined\" : JSON.stringify(result, null, 2);\n console.log(output);\n });\n}\n\nasync function cmdVersion() {\n const pkgPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../package.json\");\n let version = \"unknown\";\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n version = pkg.version;\n } catch {\n // fallback\n }\n\n console.log(`cdpwright v${version}`);\n console.log(`Pinned revision: ${PINNED_REVISION}`);\n\n const platform = detectPlatform();\n const cacheRoot = defaultCacheRoot(platform);\n const revision = resolveRevision(process.env.CDPWRIGHT_REVISION);\n const execPath = path.join(cacheRoot, platform, revision, chromiumExecutableRelativePath(platform));\n\n if (fs.existsSync(execPath)) {\n try {\n const ver = await chromiumVersion(execPath);\n console.log(`Chromium: ${ver}`);\n } catch {\n console.log(`Chromium: installed at ${execPath}`);\n }\n } else {\n console.log(\"Chromium: not installed (run 'cpw install')\");\n }\n}\n\n// --- Main ---\n\nasync function main() {\n const [, , command, ...rest] = process.argv;\n\n if (!command || command === \"--help\" || command === \"-h\") {\n printHelp();\n process.exit(0);\n }\n\n switch (command) {\n case \"download\":\n case \"install\":\n return cmdDownload(rest);\n case \"open\":\n return cmdOpen(rest);\n case \"screenshot\":\n return cmdScreenshot(rest);\n case \"pdf\":\n return cmdPdf(rest);\n case \"eval\":\n return cmdEval(rest);\n case \"version\":\n case \"--version\":\n case \"-v\":\n return cmdVersion();\n default:\n console.error(`Unknown command: ${command}`);\n printHelp();\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","import fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport http from \"http\";\nimport { spawn } from \"child_process\";\nimport { Logger, LogLevel } from \"../logging/Logger.js\";\nimport { AutomationEvents } from \"../core/Events.js\";\nimport { Connection } from \"../cdp/Connection.js\";\nimport { Browser } from \"../core/Browser.js\";\nimport { detectPlatform, defaultCacheRoot, ensureDownloaded, fetchLatestRevision, Platform, chromiumVersion } from \"./Downloader.js\";\nimport { resolveRevision } from \"./Revision.js\";\n\nexport type LaunchOptions = {\n headless?: boolean;\n args?: string[];\n timeoutMs?: number;\n logLevel?: LogLevel;\n logEvents?: boolean;\n logActions?: boolean;\n logAssertions?: boolean;\n executablePath?: string;\n userDataDir?: string;\n maximize?: boolean;\n};\n\nexport type DownloadOptions = {\n latest?: boolean;\n};\n\nexport type ResolvedDownload = {\n cacheRoot: string;\n platform: Platform;\n revision: string;\n executablePath: string;\n revisionDir: string;\n chromiumVersion?: string;\n};\n\nexport class ChromiumManager {\n private logger: Logger;\n\n constructor(logger?: Logger) {\n const envLevel = (process.env.CDPWRIGHT_LOG_LEVEL as LogLevel | undefined) ?? \"info\";\n this.logger = logger ?? new Logger(envLevel);\n }\n\n getLogger() {\n return this.logger;\n }\n\n async download(options: DownloadOptions = {}): Promise<ResolvedDownload> {\n const platform = detectPlatform();\n const cacheRoot = this.resolveCacheRoot(platform);\n const overrideExecutable = process.env.CDPWRIGHT_EXECUTABLE_PATH;\n let revision = options.latest ? await fetchLatestRevision(platform) : resolveRevision(process.env.CDPWRIGHT_REVISION);\n let executablePath: string;\n let revisionDir = \"\";\n if (overrideExecutable) {\n executablePath = path.resolve(overrideExecutable);\n } else {\n const downloaded = await ensureDownloaded({\n cacheRoot,\n platform,\n revision,\n logger: this.logger\n });\n executablePath = downloaded.executablePath;\n revisionDir = downloaded.revisionDir;\n }\n\n if (!fs.existsSync(executablePath)) {\n throw new Error(`Chromium executable not found: ${executablePath}`);\n }\n\n const version = await chromiumVersion(executablePath);\n\n this.logger.info(\"Chromium cache root\", cacheRoot);\n this.logger.info(\"Platform\", platform);\n this.logger.info(\"Revision\", revision);\n this.logger.info(\"Chromium version\", version);\n\n return {\n cacheRoot,\n platform,\n revision,\n executablePath,\n revisionDir,\n chromiumVersion: version\n };\n }\n\n async launch(options: LaunchOptions = {}) {\n const logger = this.logger;\n if (options.logLevel) {\n logger.setLevel(options.logLevel);\n }\n\n const executablePath = options.executablePath || process.env.CDPWRIGHT_EXECUTABLE_PATH;\n let resolvedExecutable = executablePath;\n if (!resolvedExecutable) {\n const platform = detectPlatform();\n const cacheRoot = this.resolveCacheRoot(platform);\n const revision = resolveRevision(process.env.CDPWRIGHT_REVISION);\n const downloaded = await ensureDownloaded({\n cacheRoot,\n platform,\n revision,\n logger\n });\n resolvedExecutable = downloaded.executablePath;\n }\n\n if (!resolvedExecutable || !fs.existsSync(resolvedExecutable)) {\n throw new Error(`Chromium executable not found: ${resolvedExecutable}`);\n }\n const stats = fs.statSync(resolvedExecutable);\n if (!stats.isFile()) {\n throw new Error(`Chromium executable is not a file: ${resolvedExecutable}`);\n }\n ensureExecutable(resolvedExecutable);\n\n const cleanupTasks: Array<() => void> = [];\n let userDataDir = options.userDataDir ?? process.env.CDPWRIGHT_USER_DATA_DIR;\n if (!userDataDir) {\n userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), \"cdpwright-\"));\n cleanupTasks.push(() => fs.rmSync(userDataDir as string, { recursive: true, force: true }));\n }\n\n const args = [\n \"--remote-debugging-port=0\",\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--disable-background-networking\",\n \"--disable-background-timer-throttling\",\n \"--disable-backgrounding-occluded-windows\",\n \"--disable-renderer-backgrounding\"\n ];\n if (userDataDir) {\n args.push(`--user-data-dir=${userDataDir}`);\n }\n if (process.platform === \"linux\") {\n args.push(\"--disable-crash-reporter\", \"--disable-crashpad\");\n }\n if (options.headless ?? true) {\n args.push(\"--headless=new\");\n }\n if (options.maximize) {\n args.push(\"--start-maximized\");\n }\n if (options.args) {\n args.push(...options.args);\n }\n\n logger.info(\"Launching Chromium\", resolvedExecutable);\n const child = spawn(resolvedExecutable, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n\n const websocketUrl = await waitForWebSocketEndpoint(child, logger, options.timeoutMs ?? 30_000);\n const httpUrl = toHttpVersionUrl(websocketUrl);\n const wsEndpoint = await fetchWebSocketDebuggerUrl(httpUrl);\n\n const connection = new Connection(wsEndpoint, logger);\n await closeInitialPages(connection, logger);\n const events = new AutomationEvents();\n const logEvents = resolveLogFlag(options.logEvents, process.env.CDPWRIGHT_LOG, true);\n const logActions = resolveLogFlag(options.logActions, process.env.CDPWRIGHT_LOG_ACTIONS, true);\n const logAssertions = resolveLogFlag(options.logAssertions, process.env.CDPWRIGHT_LOG_ASSERTIONS, true);\n if (logEvents && logActions) {\n events.on(\"action:end\", (payload) => {\n const selector = payload.sensitive ? undefined : payload.selector;\n const args = buildLogArgs(selector, payload.durationMs);\n logger.info(`Action ${payload.name}`, ...args);\n });\n }\n if (logEvents && logAssertions) {\n events.on(\"assertion:end\", (payload) => {\n const args = buildLogArgs(payload.selector, payload.durationMs);\n logger.info(`Assertion ${payload.name}`, ...args);\n });\n }\n const browser = new Browser(connection, child, logger, events, cleanupTasks);\n\n return browser;\n }\n\n private resolveCacheRoot(platform: Platform) {\n const envRoot = process.env.CDPWRIGHT_CACHE_DIR;\n if (envRoot && envRoot.trim()) {\n return path.resolve(envRoot.trim());\n }\n return defaultCacheRoot(platform);\n }\n}\n\nasync function closeInitialPages(connection: Connection, logger: Logger) {\n try {\n const targets = await connection.send<{ targetInfos: Array<{ targetId: string; type: string }> }>(\"Target.getTargets\");\n for (const info of targets.targetInfos) {\n if (info.type === \"page\") {\n await connection.send(\"Target.closeTarget\", { targetId: info.targetId });\n }\n }\n } catch (err) {\n logger.warn(\"Failed to close initial pages\", err);\n }\n}\n\nfunction resolveLogFlag(explicit: boolean | undefined, envValue: string | undefined, defaultValue: boolean) {\n if (explicit !== undefined) {\n return explicit;\n }\n if (envValue == null) {\n return defaultValue;\n }\n const normalized = envValue.trim().toLowerCase();\n return ![\"0\", \"false\", \"no\", \"off\"].includes(normalized);\n}\n\nfunction buildLogArgs(selector?: string, durationMs?: number) {\n const args: string[] = [];\n if (selector) {\n args.push(selector);\n }\n if (typeof durationMs === \"number\") {\n args.push(`${durationMs}ms`);\n }\n return args;\n}\n\nfunction ensureExecutable(executablePath: string) {\n if (process.platform === \"win32\") {\n return;\n }\n try {\n const stat = fs.statSync(executablePath);\n const isExecutable = (stat.mode & 0o111) !== 0;\n if (!isExecutable) {\n fs.chmodSync(executablePath, 0o755);\n }\n } catch {\n // ignore chmod errors\n }\n\n const dir = path.dirname(executablePath);\n const helpers = [\n \"chrome_crashpad_handler\",\n \"chrome_sandbox\",\n \"chrome-wrapper\",\n \"xdg-mime\",\n \"xdg-settings\"\n ];\n for (const name of helpers) {\n const helperPath = path.join(dir, name);\n if (!fs.existsSync(helperPath)) {\n continue;\n }\n try {\n const stat = fs.statSync(helperPath);\n const isExecutable = (stat.mode & 0o111) !== 0;\n if (!isExecutable) {\n fs.chmodSync(helperPath, 0o755);\n }\n } catch {\n // ignore chmod errors\n }\n }\n}\n\nfunction waitForWebSocketEndpoint(child: ReturnType<typeof spawn>, logger: Logger, timeoutMs: number): Promise<string> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n const timeout = setTimeout(() => {\n reject(new Error(\"Timed out waiting for DevTools endpoint\"));\n }, timeoutMs);\n\n const outputLines: string[] = [];\n const pushOutput = (data: Buffer) => {\n const text = data.toString();\n for (const line of text.split(/\\r?\\n/)) {\n if (!line.trim()) continue;\n outputLines.push(line);\n if (outputLines.length > 50) {\n outputLines.shift();\n }\n }\n };\n\n const onData = (data: Buffer) => {\n const text = data.toString();\n const match = text.match(/DevTools listening on (ws:\\/\\/[^\\s]+)/);\n if (match) {\n clearTimeout(timeout);\n cleanup();\n logger.info(\"DevTools endpoint\", match[1]);\n resolve(match[1]);\n }\n pushOutput(data);\n };\n\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n cleanup();\n const tail = outputLines.length ? `\\nChromium output:\\n${outputLines.join(\"\\n\")}` : \"\";\n reject(new Error(`Chromium exited early with code ${code ?? \"null\"} signal ${signal ?? \"null\"}${tail}`));\n };\n\n const cleanup = () => {\n child.stdout?.off(\"data\", onData);\n child.stderr?.off(\"data\", onData);\n child.off(\"exit\", onExit);\n };\n\n child.stdout?.on(\"data\", onData);\n child.stderr?.on(\"data\", onData);\n child.on(\"exit\", onExit);\n\n if (Date.now() - start > timeoutMs) {\n cleanup();\n }\n });\n}\n\nfunction toHttpVersionUrl(wsUrl: string) {\n try {\n const url = new URL(wsUrl);\n const port = url.port || \"9222\";\n return `http://127.0.0.1:${port}/json/version`;\n } catch {\n throw new Error(`Invalid DevTools endpoint: ${wsUrl}`);\n }\n}\n\nfunction fetchWebSocketDebuggerUrl(versionUrl: string): Promise<string> {\n return new Promise((resolve, reject) => {\n http.get(versionUrl, (res) => {\n if (res.statusCode && res.statusCode >= 400) {\n reject(new Error(`Failed to fetch /json/version: ${res.statusCode}`));\n return;\n }\n let data = \"\";\n res.on(\"data\", (chunk) => (data += chunk.toString()));\n res.on(\"end\", () => {\n try {\n const parsed = JSON.parse(data);\n if (!parsed.webSocketDebuggerUrl) {\n reject(new Error(\"webSocketDebuggerUrl missing\"));\n return;\n }\n resolve(parsed.webSocketDebuggerUrl);\n } catch (err) {\n reject(err);\n }\n });\n }).on(\"error\", reject);\n });\n}\n","export type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4\n};\n\nconst REDACT_KEYS = [\"password\", \"token\", \"secret\", \"authorization\", \"cookie\"];\n\nfunction redactValue(value: unknown): string {\n if (typeof value === \"string\") {\n try {\n const url = new URL(value);\n if (url.search) {\n url.search = \"?redacted\";\n }\n return url.toString();\n } catch {\n return value;\n }\n }\n if (value && typeof value === \"object\") {\n return JSON.stringify(value, (key, val) => {\n if (REDACT_KEYS.some((k) => key.toLowerCase().includes(k))) {\n return \"[redacted]\";\n }\n return val;\n });\n }\n return String(value);\n}\n\nexport class Logger {\n private level: LogLevel;\n\n constructor(level: LogLevel = \"info\") {\n this.level = level;\n }\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n error(message: string, ...args: unknown[]) {\n this.log(\"error\", message, ...args);\n }\n\n warn(message: string, ...args: unknown[]) {\n this.log(\"warn\", message, ...args);\n }\n\n info(message: string, ...args: unknown[]) {\n this.log(\"info\", message, ...args);\n }\n\n debug(message: string, ...args: unknown[]) {\n this.log(\"debug\", message, ...args);\n }\n\n trace(message: string, ...args: unknown[]) {\n this.log(\"trace\", message, ...args);\n }\n\n log(level: LogLevel, message: string, ...args: unknown[]) {\n if (LEVEL_ORDER[level] > LEVEL_ORDER[this.level]) {\n return;\n }\n const time = new Date().toISOString();\n const suffix = args.length ? \" \" + args.map(redactValue).join(\" \") : \"\";\n const line = `[${time}] [${level}] ${message}${suffix}`;\n if (level === \"error\") {\n console.error(line);\n } else if (level === \"warn\") {\n console.warn(line);\n } else {\n console.log(line);\n }\n }\n}\n","import { EventEmitter } from \"events\";\n\nexport type ActionEvent = {\n name: string;\n selector?: string;\n frameId?: string;\n durationMs?: number;\n sensitive?: boolean;\n status?: \"passed\" | \"failed\";\n};\n\nexport type AssertionEvent = {\n name: string;\n selector?: string;\n frameId?: string;\n durationMs?: number;\n status?: \"passed\" | \"failed\";\n};\n\nexport type AutomationEventMap = {\n \"action:start\": ActionEvent;\n \"action:end\": ActionEvent;\n \"assertion:start\": AssertionEvent;\n \"assertion:end\": AssertionEvent;\n};\n\nexport class AutomationEvents {\n private emitter = new EventEmitter();\n\n on<K extends keyof AutomationEventMap>(event: K, handler: (payload: AutomationEventMap[K]) => void) {\n this.emitter.on(event, handler);\n }\n\n off<K extends keyof AutomationEventMap>(event: K, handler: (payload: AutomationEventMap[K]) => void) {\n this.emitter.off(event, handler);\n }\n\n emit<K extends keyof AutomationEventMap>(event: K, payload: AutomationEventMap[K]) {\n this.emitter.emit(event, payload);\n }\n}\n","import WebSocket from \"ws\";\nimport { EventEmitter } from \"events\";\nimport { Logger } from \"../logging/Logger.js\";\nimport { Session } from \"./Session.js\";\n\nexport type CDPResponse = {\n id: number;\n result?: unknown;\n error?: { message: string; data?: unknown };\n sessionId?: string;\n};\n\nexport type CDPEvent = {\n method: string;\n params?: unknown;\n sessionId?: string;\n};\n\nexport class Connection {\n private ws: WebSocket;\n private id = 0;\n private callbacks = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void; method: string; start: number }>();\n private sessions = new Map<string, Session>();\n private emitter = new EventEmitter();\n private logger: Logger;\n private closed = false;\n\n constructor(url: string, logger: Logger) {\n this.logger = logger;\n this.ws = new WebSocket(url);\n this.ws.on(\"message\", (data: WebSocket.RawData) => this.onMessage(data.toString()));\n this.ws.on(\"error\", (err: Error) => this.onError(err));\n this.ws.on(\"close\", (code: number, reason: Buffer) => this.onClose(code, reason));\n }\n\n async waitForOpen() {\n if (this.ws.readyState === WebSocket.OPEN) {\n return;\n }\n if (this.ws.readyState === WebSocket.CLOSED) {\n throw new Error(\"CDP socket is closed\");\n }\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const onClose = () => {\n cleanup();\n reject(new Error(\"CDP socket closed before opening\"));\n };\n const cleanup = () => {\n this.ws.off(\"open\", onOpen);\n this.ws.off(\"error\", onError);\n this.ws.off(\"close\", onClose);\n };\n this.ws.on(\"open\", onOpen);\n this.ws.on(\"error\", onError);\n this.ws.on(\"close\", onClose);\n });\n }\n\n createSession(sessionId: string): Session {\n const session = new Session(this, sessionId);\n this.sessions.set(sessionId, session);\n return session;\n }\n\n removeSession(sessionId: string) {\n this.sessions.delete(sessionId);\n }\n\n on(event: string, handler: (params: unknown) => void) {\n this.emitter.on(event, handler);\n }\n\n async send<T = unknown>(method: string, params: Record<string, unknown> = {}, sessionId?: string): Promise<T> {\n await this.waitForOpen();\n const id = ++this.id;\n const payload = sessionId ? { id, method, params, sessionId } : { id, method, params };\n const start = Date.now();\n const promise = new Promise<T>((resolve, reject) => {\n this.callbacks.set(id, { resolve: resolve as (value: unknown) => void, reject, method, start });\n });\n if (this.logger) {\n this.logger.trace(\"CDP send\", method);\n }\n this.ws.send(JSON.stringify(payload));\n return promise;\n }\n\n async close() {\n if (this.ws.readyState === WebSocket.CLOSED) {\n return;\n }\n await new Promise<void>((resolve) => {\n this.ws.once(\"close\", () => resolve());\n if (this.ws.readyState === WebSocket.CLOSING) {\n return;\n }\n this.ws.close();\n });\n }\n\n private onError(err: unknown) {\n this.logger.error(\"CDP socket error\", err);\n }\n\n private onClose(code: number, reason: Buffer) {\n if (this.closed) {\n return;\n }\n this.closed = true;\n const reasonText = reason.toString() || \"no reason\";\n this.failPending(new Error(`CDP socket closed (${code}): ${reasonText}`));\n this.sessions.clear();\n }\n\n private failPending(error: Error) {\n if (this.callbacks.size === 0) {\n return;\n }\n for (const [, callback] of this.callbacks) {\n callback.reject(error);\n }\n this.callbacks.clear();\n }\n\n private onMessage(message: string) {\n let parsed: CDPResponse & CDPEvent;\n try {\n parsed = JSON.parse(message) as CDPResponse & CDPEvent;\n } catch (err) {\n this.logger.warn(\"Failed to parse CDP message\", err);\n return;\n }\n if (typeof parsed.id === \"number\") {\n const callback = this.callbacks.get(parsed.id);\n if (!callback) {\n return;\n }\n this.callbacks.delete(parsed.id);\n const duration = Date.now() - callback.start;\n this.logger.debug(\"CDP recv\", callback.method, `${duration}ms`);\n if (parsed.error) {\n callback.reject(new Error(parsed.error.message));\n } else {\n callback.resolve(parsed.result);\n }\n return;\n }\n\n if (parsed.sessionId) {\n const session = this.sessions.get(parsed.sessionId);\n if (session) {\n session.dispatch(parsed.method, parsed.params);\n }\n return;\n }\n\n if (parsed.method) {\n this.emitter.emit(parsed.method, parsed.params);\n }\n }\n}\n","import { EventEmitter } from \"events\";\nimport { Connection } from \"./Connection.js\";\n\nexport class Session {\n private connection: Connection;\n private sessionId: string;\n private emitter = new EventEmitter();\n\n constructor(connection: Connection, sessionId: string) {\n this.connection = connection;\n this.sessionId = sessionId;\n }\n\n on(event: string, handler: (params: unknown) => void) {\n this.emitter.on(event, handler);\n }\n\n once(event: string, handler: (params: unknown) => void) {\n this.emitter.once(event, handler);\n }\n\n async send<T = unknown>(method: string, params: Record<string, unknown> = {}): Promise<T> {\n return this.connection.send<T>(method, params, this.sessionId);\n }\n\n dispatch(method: string, params: unknown) {\n this.emitter.emit(method, params);\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { Session } from \"../cdp/Session.js\";\nimport { Logger } from \"../logging/Logger.js\";\nimport { AutomationEvents } from \"./Events.js\";\nimport { Frame } from \"./Frame.js\";\nimport { Locator } from \"./Locator.js\";\nimport { ensureAllowedUrl } from \"./UrlGuard.js\";\n\nexport type GotoOptions = {\n waitUntil?: \"domcontentloaded\" | \"load\";\n timeoutMs?: number;\n allowFileUrl?: boolean;\n};\n\nexport type ScreenshotOptions = {\n path?: string;\n format?: \"png\" | \"jpeg\";\n quality?: number;\n fullPage?: boolean;\n};\n\nexport type PdfOptions = {\n path?: string;\n landscape?: boolean;\n printBackground?: boolean;\n scale?: number;\n paperWidth?: number;\n paperHeight?: number;\n marginTop?: number;\n marginBottom?: number;\n marginLeft?: number;\n marginRight?: number;\n pageRanges?: string;\n preferCSSPageSize?: boolean;\n};\n\nexport class Page {\n private session: Session;\n private logger: Logger;\n private events: AutomationEvents;\n private framesById = new Map<string, Frame>();\n private mainFrameId?: string;\n private lifecycleEvents = new Map<string, Set<string>>();\n private defaultTimeout = 30_000;\n\n constructor(session: Session, logger: Logger, events: AutomationEvents) {\n this.session = session;\n this.logger = logger;\n this.events = events;\n }\n\n async initialize() {\n await this.session.send(\"Page.enable\");\n await this.session.send(\"DOM.enable\");\n await this.session.send(\"Runtime.enable\");\n await this.session.send(\"Network.enable\");\n await this.session.send(\"Page.setLifecycleEventsEnabled\", { enabled: true });\n\n this.session.on(\"Page.frameAttached\", (params) => this.onFrameAttached(params as any));\n this.session.on(\"Page.frameNavigated\", (params) => this.onFrameNavigated(params as any));\n this.session.on(\"Page.frameDetached\", (params) => this.onFrameDetached(params as any));\n this.session.on(\"Runtime.executionContextCreated\", (params) => this.onExecutionContextCreated(params as any));\n this.session.on(\"Runtime.executionContextDestroyed\", (params) => this.onExecutionContextDestroyed(params as any));\n this.session.on(\"Runtime.executionContextsCleared\", () => this.onExecutionContextsCleared());\n this.session.on(\"Page.lifecycleEvent\", (params) => this.onLifecycleEvent(params as any));\n\n const tree = await this.session.send<{ frameTree: { frame: { id: string; name?: string; url?: string; parentId?: string }; childFrames?: any[] } }>(\"Page.getFrameTree\");\n this.buildFrameTree(tree.frameTree);\n }\n\n frames() {\n return Array.from(this.framesById.values());\n }\n\n mainFrame() {\n if (!this.mainFrameId) {\n throw new Error(\"Main frame not initialized\");\n }\n const frame = this.framesById.get(this.mainFrameId);\n if (!frame) {\n throw new Error(\"Main frame missing\");\n }\n return frame;\n }\n\n frame(options: { name?: string; urlIncludes?: string; predicate?: (frame: Frame) => boolean }) {\n for (const frame of this.framesById.values()) {\n if (options.name && frame.name !== options.name) continue;\n if (options.urlIncludes && !frame.url?.includes(options.urlIncludes)) continue;\n if (options.predicate && !options.predicate(frame)) continue;\n return frame;\n }\n return null;\n }\n\n locator(selector: string) {\n return new Locator(this.mainFrame(), selector);\n }\n\n async goto(url: string, options: GotoOptions = {}) {\n ensureAllowedUrl(url, { allowFileUrl: options.allowFileUrl });\n const waitUntil = options.waitUntil ?? \"load\";\n const lifecycleName = waitUntil === \"domcontentloaded\" ? \"DOMContentLoaded\" : waitUntil === \"load\" ? \"load\" : null;\n if (!lifecycleName) {\n throw new Error(`Invalid waitUntil \"${waitUntil}\". Use \"load\" or \"domcontentloaded\".`);\n }\n const timeoutMs = options.timeoutMs ?? this.defaultTimeout;\n\n this.events.emit(\"action:start\", { name: \"goto\", selector: url, frameId: this.mainFrameId });\n const start = Date.now();\n // Clear any stale lifecycle state from prior navigations before issuing a new navigate.\n this.lifecycleEvents.clear();\n const navigation = await this.session.send<{ errorText?: string }>(\"Page.navigate\", { url });\n if (navigation?.errorText) {\n throw new Error(`Navigation failed: ${navigation.errorText}`);\n }\n await this.waitForLifecycle(this.mainFrameId, lifecycleName, timeoutMs);\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"goto\", selector: url, frameId: this.mainFrameId, durationMs: duration });\n this.logger.debug(\"Goto\", url, `${duration}ms`);\n }\n\n async query(selector: string) {\n return this.mainFrame().query(selector);\n }\n\n async queryAll(selector: string) {\n return this.mainFrame().queryAll(selector);\n }\n\n async queryXPath(selector: string) {\n return this.mainFrame().queryXPath(selector);\n }\n\n async queryAllXPath(selector: string) {\n return this.mainFrame().queryAllXPath(selector);\n }\n\n async click(selector: string, options?: { timeoutMs?: number }) {\n return this.mainFrame().click(selector, options);\n }\n\n async dblclick(selector: string, options?: { timeoutMs?: number }) {\n return this.mainFrame().dblclick(selector, options);\n }\n\n async type(selector: string, text: string, options?: { timeoutMs?: number }) {\n return this.mainFrame().type(selector, text, options);\n }\n\n async typeSecure(selector: string, text: string, options?: { timeoutMs?: number }) {\n return this.mainFrame().typeSecure(selector, text, options);\n }\n\n async fillInput(selector: string, value: string, options: { timeoutMs?: number } = {}) {\n return this.mainFrame().fillInput(selector, value, options);\n }\n\n async evaluate<T = unknown>(fnOrString: string | ((...args: any[]) => any), ...args: any[]): Promise<T> {\n return this.mainFrame().evaluate(fnOrString, ...args);\n }\n\n async textSecure(selector: string) {\n return this.mainFrame().textSecure(selector);\n }\n\n async valueSecure(selector: string) {\n return this.mainFrame().valueSecure(selector);\n }\n\n async selectOption(selector: string, value: string) {\n return this.mainFrame().selectOption(selector, value);\n }\n\n async setFileInput(selector: string, name: string, contents: string, options: { mimeType?: string } = {}) {\n return this.mainFrame().setFileInput(selector, name, contents, options);\n }\n\n async findLocators(options: { highlight?: boolean } = {}) {\n return this.mainFrame().findLocators(options);\n }\n\n async screenshot(options: ScreenshotOptions = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"screenshot\", frameId: this.mainFrameId });\n const result = await this.session.send<{ data: string }>(\"Page.captureScreenshot\", {\n format: options.format ?? \"png\",\n quality: options.quality,\n fromSurface: true,\n captureBeyondViewport: options.fullPage ?? false\n });\n const buffer = Buffer.from(result.data, \"base64\");\n if (options.path) {\n const resolved = path.resolve(options.path);\n fs.writeFileSync(resolved, buffer);\n }\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"screenshot\", frameId: this.mainFrameId, durationMs: duration });\n return buffer;\n }\n\n async screenshotBase64(options: Omit<ScreenshotOptions, \"path\"> = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"screenshotBase64\", frameId: this.mainFrameId });\n const result = await this.session.send<{ data: string }>(\"Page.captureScreenshot\", {\n format: options.format ?? \"png\",\n quality: options.quality,\n fromSurface: true,\n captureBeyondViewport: options.fullPage ?? false\n });\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"screenshotBase64\", frameId: this.mainFrameId, durationMs: duration });\n return result.data;\n }\n\n async pdf(options: PdfOptions = {}): Promise<Buffer> {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"pdf\", frameId: this.mainFrameId });\n const result = await this.session.send<{ data: string }>(\"Page.printToPDF\", {\n landscape: options.landscape ?? false,\n printBackground: options.printBackground ?? true,\n scale: options.scale,\n paperWidth: options.paperWidth,\n paperHeight: options.paperHeight,\n marginTop: options.marginTop,\n marginBottom: options.marginBottom,\n marginLeft: options.marginLeft,\n marginRight: options.marginRight,\n pageRanges: options.pageRanges,\n preferCSSPageSize: options.preferCSSPageSize,\n });\n const buffer = Buffer.from(result.data, \"base64\");\n if (options.path) {\n const resolved = path.resolve(options.path);\n fs.writeFileSync(resolved, buffer);\n }\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"pdf\", frameId: this.mainFrameId, durationMs: duration });\n return buffer;\n }\n\n getEvents() {\n return this.events;\n }\n\n getDefaultTimeout() {\n return this.defaultTimeout;\n }\n\n private buildFrameTree(tree: { frame: { id: string; name?: string; url?: string; parentId?: string }; childFrames?: any[] }) {\n const frame = this.ensureFrame(tree.frame.id);\n frame.setMeta({ name: tree.frame.name, url: tree.frame.url, parentId: tree.frame.parentId });\n if (!tree.frame.parentId) {\n this.mainFrameId = tree.frame.id;\n }\n if (tree.childFrames) {\n for (const child of tree.childFrames) {\n this.buildFrameTree(child);\n }\n }\n }\n\n private ensureFrame(id: string) {\n let frame = this.framesById.get(id);\n if (!frame) {\n frame = new Frame(id, this.session, this.logger, this.events);\n this.framesById.set(id, frame);\n }\n return frame;\n }\n\n private onFrameAttached(params: { frameId: string; parentFrameId?: string }) {\n const frame = this.ensureFrame(params.frameId);\n frame.setMeta({ parentId: params.parentFrameId });\n }\n\n private onFrameNavigated(params: { frame: { id: string; name?: string; url?: string; parentId?: string } }) {\n const frame = this.ensureFrame(params.frame.id);\n frame.setMeta({ name: params.frame.name, url: params.frame.url, parentId: params.frame.parentId });\n if (!params.frame.parentId) {\n this.mainFrameId = params.frame.id;\n }\n }\n\n private onFrameDetached(params: { frameId: string }) {\n this.framesById.delete(params.frameId);\n }\n\n private onExecutionContextCreated(params: { context: { id: number; auxData?: { frameId?: string } } }) {\n const frameId = params.context.auxData?.frameId;\n if (!frameId) {\n return;\n }\n const frame = this.ensureFrame(frameId);\n frame.setExecutionContext(params.context.id);\n }\n\n private onExecutionContextDestroyed(params: { executionContextId: number }) {\n for (const frame of this.framesById.values()) {\n if (frame.getExecutionContext() === params.executionContextId) {\n frame.setExecutionContext(undefined);\n }\n }\n }\n\n private onExecutionContextsCleared() {\n for (const frame of this.framesById.values()) {\n frame.setExecutionContext(undefined);\n }\n }\n\n private onLifecycleEvent(params: { frameId: string; name: string }) {\n if (!this.lifecycleEvents.has(params.frameId)) {\n this.lifecycleEvents.set(params.frameId, new Set());\n }\n this.lifecycleEvents.get(params.frameId)!.add(params.name);\n }\n\n private async waitForLifecycle(frameId: string | undefined, eventName: string, timeoutMs: number) {\n if (!frameId) {\n throw new Error(\"Missing frame id for lifecycle wait\");\n }\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n const events = this.lifecycleEvents.get(frameId);\n if (events && events.has(eventName)) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n throw new Error(`Timeout waiting for lifecycle event: ${eventName}`);\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { Session } from \"../cdp/Session.js\";\nimport { Logger } from \"../logging/Logger.js\";\nimport { AutomationEvents } from \"./Events.js\";\nimport { waitFor } from \"./Waiter.js\";\nimport { parseSelector } from \"./Selectors.js\";\nimport { serializeShadowDomHelpers } from \"./ShadowDom.js\";\nimport { Locator } from \"./Locator.js\";\n\nexport type FrameSelectorOptions = {\n pierceShadowDom?: boolean;\n timeoutMs?: number;\n};\n\nexport type ClickOptions = {\n timeoutMs?: number;\n};\n\nexport type TypeOptions = {\n timeoutMs?: number;\n sensitive?: boolean;\n};\n\nexport type QueryResult = {\n objectId: string;\n contextId: number;\n};\n\ntype ElementBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n visible: boolean;\n};\n\nexport class Frame {\n readonly id: string;\n name?: string;\n url?: string;\n parentId?: string;\n private session: Session;\n private logger: Logger;\n private events: AutomationEvents;\n private contextId?: number;\n private defaultTimeout = 30_000;\n\n constructor(id: string, session: Session, logger: Logger, events: AutomationEvents) {\n this.id = id;\n this.session = session;\n this.logger = logger;\n this.events = events;\n }\n\n setExecutionContext(contextId?: number) {\n this.contextId = contextId;\n }\n\n getExecutionContext() {\n return this.contextId;\n }\n\n setMeta(meta: { name?: string; url?: string; parentId?: string }) {\n this.name = meta.name;\n this.url = meta.url;\n this.parentId = meta.parentId;\n }\n\n async evaluate<T = unknown>(fnOrString: string | ((...args: any[]) => any), ...args: any[]): Promise<T> {\n return this.evaluateInContext(fnOrString, args);\n }\n\n async query(selector: string, options: FrameSelectorOptions = {}): Promise<QueryResult | null> {\n return this.querySelectorInternal(selector, options, false);\n }\n\n async queryAll(selector: string, options: FrameSelectorOptions = {}): Promise<QueryResult[]> {\n return this.querySelectorAllInternal(selector, options, false);\n }\n\n async queryXPath(selector: string, options: FrameSelectorOptions = {}): Promise<QueryResult | null> {\n return this.querySelectorInternal(selector, options, true);\n }\n\n async queryAllXPath(selector: string, options: FrameSelectorOptions = {}): Promise<QueryResult[]> {\n return this.querySelectorAllInternal(selector, options, true);\n }\n\n locator(selector: string, options: FrameSelectorOptions = {}) {\n return new Locator(this, selector, options);\n }\n\n async click(selector: string, options: ClickOptions = {}) {\n await this.performClick(selector, options, false);\n }\n\n async dblclick(selector: string, options: ClickOptions = {}) {\n await this.performClick(selector, options, true);\n }\n\n async type(selector: string, text: string, options: TypeOptions = {}) {\n const start = Date.now();\n const parsed = parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n this.events.emit(\"action:start\", { name: \"type\", selector, frameId: this.id, sensitive: options.sensitive });\n await waitFor(async () => {\n const box = await this.resolveElementBox(selector, options);\n if (!box || !box.visible) {\n return false;\n }\n return true;\n }, { timeoutMs: options.timeoutMs ?? this.defaultTimeout, description: `type ${selector}` });\n\n const helpers = serializeShadowDomHelpers();\n const focusExpression = `(function() {\n const querySelectorDeep = ${helpers.querySelectorDeep};\n const root = document;\n const selector = ${JSON.stringify(selector)};\n const el = ${pierce ? \"querySelectorDeep(root, selector)\" : \"root.querySelector(selector)\"};\n if (!el) {\n return;\n }\n el.focus();\n })()`;\n const focusParams: Record<string, unknown> = {\n expression: focusExpression,\n returnByValue: true\n };\n if (this.contextId) {\n focusParams.contextId = this.contextId;\n }\n await this.session.send(\"Runtime.evaluate\", focusParams);\n\n await this.session.send(\"Input.insertText\", { text });\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"type\", selector, frameId: this.id, durationMs: duration, sensitive: options.sensitive });\n this.logger.debug(\"Type\", selector, `${duration}ms`);\n }\n\n async typeSecure(selector: string, text: string, options: TypeOptions = {}) {\n return this.type(selector, text, { ...options, sensitive: true });\n }\n\n async fillInput(selector: string, value: string, options: { timeoutMs?: number } = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"fillInput\", selector, frameId: this.id });\n await waitFor(async () => {\n const expression = `(function() {\n const selector = ${JSON.stringify(selector)};\n const findDeep = (sel) => {\n if (sel.includes(\">>>\")) {\n const parts = sel.split(\">>>\").map((s) => s.trim()).filter(Boolean);\n let scope = [document];\n for (const part of parts) {\n const next = [];\n for (const node of scope) {\n const roots = [node];\n if (node instanceof Element && node.shadowRoot) roots.push(node.shadowRoot);\n for (const root of roots) {\n next.push(...root.querySelectorAll(part));\n }\n }\n if (!next.length) return null;\n scope = next;\n }\n return scope[0] || null;\n }\n return document.querySelector(sel);\n };\n const el = findDeep(selector);\n if (!el) return false;\n if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement)) {\n return false;\n }\n el.value = ${JSON.stringify(value)};\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n })()`;\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: boolean } }>(\"Runtime.evaluate\", params);\n return Boolean(result.result?.value);\n }, { timeoutMs: options.timeoutMs ?? this.defaultTimeout, description: `fillInput ${selector}` });\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"fillInput\", selector, frameId: this.id, durationMs: duration });\n this.logger.debug(\"FillInput\", selector, `${duration}ms`);\n }\n\n async findLocators(options: { highlight?: boolean; outputPath?: string; outputJson?: string; outputHtml?: string } = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"findLocators\", frameId: this.id });\n const artifactsDir = path.resolve(process.cwd(), \"artifacts\");\n try {\n fs.mkdirSync(artifactsDir, { recursive: true });\n } catch {\n // ignore dir creation errors\n }\n const resolveOut = (name?: string) => {\n if (!name) return null;\n const base = path.basename(name);\n return path.join(artifactsDir, base);\n };\n const outputJson = resolveOut(options.outputJson || options.outputPath);\n const outputHtml = resolveOut(options.outputHtml);\n const expression = `(function() {\n const highlight = ${options.highlight !== false};\n const previous = Array.from(document.querySelectorAll(\".__cdpwright-locator-overlay\"));\n previous.forEach((el) => el.remove());\n\n const cssEscape = (value) => {\n if (typeof CSS !== \"undefined\" && CSS.escape) return CSS.escape(value);\n return value.replace(/[^a-zA-Z0-9_-]/g, (c) => \"\\\\\\\\\" + c.charCodeAt(0).toString(16) + \" \");\n };\n\n const visible = (el) => {\n const rect = el.getBoundingClientRect();\n const style = window.getComputedStyle(el);\n return rect.width > 0 && rect.height > 0 && style.visibility !== \"hidden\" && style.display !== \"none\" && Number(style.opacity || \"1\") > 0;\n };\n\n const siblingsIndex = (el) => {\n if (!el.parentElement) return 1;\n const sibs = Array.from(el.parentElement.children).filter((n) => n.tagName === el.tagName);\n return sibs.indexOf(el) + 1;\n };\n\n const xpathFor = (el) => {\n const parts = [];\n let node = el;\n while (node && node.nodeType === 1 && node !== document.documentElement) {\n const idx = siblingsIndex(node);\n parts.unshift(node.tagName.toLowerCase() + \"[\" + idx + \"]\");\n node = node.parentElement;\n }\n return \"//\" + parts.join(\"/\");\n };\n\n const buildLocator = (el) => {\n const testid = el.getAttribute(\"data-testid\");\n const id = el.id;\n const name = el.getAttribute(\"name\");\n const aria = el.getAttribute(\"aria-label\");\n const labelledBy = el.getAttribute(\"aria-labelledby\");\n const placeholder = el.getAttribute(\"placeholder\");\n const role = el.getAttribute(\"role\");\n const labelText = (() => {\n if (labelledBy) {\n const ref = document.getElementById(labelledBy);\n if (ref) return ref.textContent?.trim() || \"\";\n }\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n const idRef = el.id && document.querySelector(\"label[for='\" + el.id.replace(/'/g, \"\\\\\\\\'\") + \"']\");\n if (idRef) return idRef.textContent?.trim() || \"\";\n const wrap = el.closest(\"label\");\n if (wrap) return wrap.textContent?.trim() || \"\";\n }\n return \"\";\n })();\n\n let css = \"\";\n let quality = \"low\";\n let reason = \"fallback\";\n if (testid) {\n css = \"[data-testid=\\\"\" + testid.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"high\";\n reason = \"data-testid\";\n } else if (id) {\n css = \"#\" + cssEscape(id);\n quality = \"high\";\n reason = \"id\";\n } else if (name) {\n css = \"[name=\\\"\" + name.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"ok\";\n reason = \"name\";\n } else if (aria) {\n css = \"[aria-label=\\\"\" + aria.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"ok\";\n reason = \"aria-label\";\n } else if (placeholder) {\n css = \"[placeholder=\\\"\" + placeholder.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"low\";\n reason = \"placeholder\";\n } else if (labelText) {\n css = el.tagName.toLowerCase() + \"[aria-label=\\\"\" + labelText.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"low\";\n reason = \"label text\";\n } else {\n const nth = siblingsIndex(el);\n css = el.tagName.toLowerCase() + \":nth-of-type(\" + nth + \")\";\n quality = \"low\";\n reason = \"nth-of-type\";\n }\n\n const tag = el.tagName.toLowerCase();\n const type = el.getAttribute(\"type\") || \"\";\n const text = (el.textContent || \"\").trim().slice(0, 80);\n\n return {\n name: labelText || aria || placeholder || name || testid || id || tag,\n css,\n xpath: xpathFor(el),\n quality,\n reason,\n visible: true,\n tag,\n type,\n role,\n text,\n id,\n nameAttr: name,\n dataTestid: testid\n };\n };\n\n const preferredSelectors = [\"input\", \"select\", \"textarea\", \"button\", \"a[href]\", \"[role='button']\", \"[contenteditable='true']\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"label\", \"legend\", \"fieldset\"];\n let nodes = Array.from(document.querySelectorAll(preferredSelectors.join(\", \")));\n if (nodes.length === 0) {\n nodes = Array.from(document.querySelectorAll(\"*\")).filter((el) => {\n if (!(el instanceof HTMLElement)) return false;\n const tag = el.tagName.toLowerCase();\n if (preferredSelectors.includes(tag)) return true;\n if (tag === \"a\" && el.hasAttribute(\"href\")) return true;\n if (el.getAttribute(\"role\") === \"button\") return true;\n if (el.hasAttribute(\"contenteditable\")) return true;\n return false;\n });\n }\n const results = [];\n nodes.forEach((el) => {\n const isVisible = visible(el);\n const locator = buildLocator(el);\n locator.visible = isVisible;\n results.push(locator);\n });\n\n if (highlight) {\n results.forEach((loc, index) => {\n const el = nodes[index];\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const overlay = document.createElement(\"div\");\n overlay.className = \"__cdpwright-locator-overlay\";\n overlay.style.position = \"absolute\";\n overlay.style.left = rect.x + window.scrollX + \"px\";\n overlay.style.top = rect.y + window.scrollY + \"px\";\n overlay.style.width = rect.width + \"px\";\n overlay.style.height = rect.height + \"px\";\n overlay.style.border = \"2px solid #e67e22\";\n overlay.style.borderRadius = \"6px\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.zIndex = \"99999\";\n const badge = document.createElement(\"div\");\n badge.textContent = String(index);\n badge.style.position = \"absolute\";\n badge.style.top = \"-10px\";\n badge.style.left = \"-10px\";\n badge.style.background = \"#e67e22\";\n badge.style.color = \"#fff\";\n badge.style.fontSize = \"12px\";\n badge.style.padding = \"2px 6px\";\n badge.style.borderRadius = \"10px\";\n overlay.appendChild(badge);\n document.body.appendChild(overlay);\n });\n }\n\n if (console && console.table) {\n console.table(results.map((r, idx) => ({ idx, name: r.name, css: r.css, quality: r.quality, reason: r.reason, tag: r.tag, type: r.type })));\n }\n return results;\n })()`;\n\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n let result = await this.session.send<{ result: { value?: any[] } }>(\"Runtime.evaluate\", params);\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"findLocators\", frameId: this.id, durationMs: duration });\n const value = (result.result?.value as any[]) ?? [];\n if (Array.isArray(value) && value.length > 0) {\n this.logger.info(\"FindLocators\", `${value.length} candidates`, value.slice(0, 5).map((v) => v.css || v.name || v.tag));\n if (outputJson) {\n try {\n fs.writeFileSync(outputJson, JSON.stringify(value, null, 2), \"utf-8\");\n this.logger.info(\"FindLocators\", `written to ${outputJson}`);\n } catch (err) {\n this.logger.warn(\"FindLocators write failed\", err);\n }\n }\n if (outputHtml) {\n this.writeLocatorHtml(outputHtml, value);\n }\n return value;\n }\n // Fallback: filtered scan to avoid empty results while ignoring document chrome\n result = await this.session.send<{ result: { value?: any[] } }>(\"Runtime.evaluate\", {\n expression: `(function() {\n const allowed = [\"input\",\"select\",\"textarea\",\"button\",\"a\",\"label\",\"legend\",\"fieldset\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"];\n const skip = [\"html\",\"head\",\"body\",\"meta\",\"link\",\"script\",\"style\"];\n return Array.from(document.querySelectorAll(\"*\"))\n .filter((el) => {\n if (!(el instanceof HTMLElement)) return false;\n const tag = el.tagName.toLowerCase();\n if (skip.includes(tag)) return false;\n if (tag === \"a\" && el.hasAttribute(\"href\")) return true;\n if (el.getAttribute(\"role\") === \"button\") return true;\n if (el.hasAttribute(\"contenteditable\")) return true;\n return allowed.includes(tag);\n })\n .slice(0, 200)\n .map((el, idx) => ({\n name: el.getAttribute(\"aria-label\") || el.getAttribute(\"name\") || el.getAttribute(\"data-testid\") || el.id || el.tagName.toLowerCase() + \"-\" + idx,\n css: el.id ? \"#\" + el.id : el.getAttribute(\"data-testid\") ? \"[data-testid=\\\\\"\" + el.getAttribute(\"data-testid\") + \"\\\\\"]\" : el.tagName.toLowerCase(),\n xpath: \"\",\n quality: \"low\",\n reason: \"fallback\",\n visible: true,\n tag: el.tagName.toLowerCase(),\n type: el.getAttribute(\"type\") || \"\",\n role: el.getAttribute(\"role\") || \"\"\n }));\n })()`,\n returnByValue: true\n });\n const fallback = (result.result?.value as any[]) ?? [];\n this.logger.info(\"FindLocators\", `${fallback.length} candidates`, fallback.slice(0, 5).map((v) => v.css || v.name || v.tag));\n if (outputJson) {\n try {\n fs.writeFileSync(outputJson, JSON.stringify(fallback, null, 2), \"utf-8\");\n this.logger.info(\"FindLocators\", `written to ${outputJson}`);\n } catch (err) {\n this.logger.warn(\"FindLocators write failed\", err);\n }\n }\n if (outputHtml) {\n this.writeLocatorHtml(outputHtml, fallback);\n }\n return fallback;\n }\n\n private writeLocatorHtml(filePath: string, data: any[]) {\n const html = `<!doctype html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <title>Locators</title>\n <style>\n body { font-family: \"Segoe UI\", system-ui, -apple-system, sans-serif; padding: 16px; background: #f8f9fa; color: #222; }\n h1 { font-size: 20px; margin-bottom: 12px; }\n table { border-collapse: collapse; width: 100%; background: #fff; box-shadow: 0 2px 6px rgba(0,0,0,0.08); }\n th, td { border: 1px solid #e5e7eb; padding: 8px; font-size: 13px; text-align: left; }\n th { background: linear-gradient(180deg, #f6f7fb, #edf0f7); font-weight: 600; }\n tr:nth-child(even) { background: #fafbfc; }\n .copy { color: #2563eb; text-decoration: underline dotted; cursor: pointer; font-size: 12px; background: none; border: none; padding: 0; opacity: 0; transition: opacity 0.15s ease; }\n tr:hover .copy { opacity: 1; }\n .copy:hover { color: #1d4ed8; }\n .loc-value { margin-left: 6px; font-family: ui-monospace, SFMono-Regular, SFMono, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; }\n </style>\n</head>\n<body>\n <h1>Locator candidates</h1>\n <table>\n <thead>\n <tr><th>#</th><th>Name</th><th>CSS</th><th>XPath</th><th>Quality</th><th>Reason</th><th>Visible</th></tr>\n </thead>\n <tbody id=\"rows\"></tbody>\n </table>\n <script>\n const data = ${JSON.stringify(data)};\n const rows = document.getElementById(\"rows\");\n data.forEach((loc, idx) => {\n const tr = document.createElement(\"tr\");\n const cells = [\n idx,\n loc.name || \"\",\n loc.css || \"\",\n loc.xpath || \"\",\n loc.quality || \"\",\n loc.reason || \"\",\n String(loc.visible)\n ];\n cells.forEach((val, i) => {\n const td = document.createElement(\"td\");\n if (i === 2 || i === 3) {\n const link = document.createElement(\"button\");\n link.className = \"copy\";\n link.textContent = \"copy\";\n link.addEventListener(\"click\", async (e) => {\n e.preventDefault();\n try { await navigator.clipboard.writeText(val); link.textContent = \"copied\"; setTimeout(() => link.textContent = \"copy\", 1000); }\n catch { link.textContent = \"error\"; }\n });\n const span = document.createElement(\"span\");\n span.className = \"loc-value\";\n span.textContent = val;\n td.appendChild(link);\n td.appendChild(span);\n } else {\n td.textContent = val;\n }\n tr.appendChild(td);\n });\n rows.appendChild(tr);\n });\n </script>\n</body>\n</html>`;\n try {\n fs.writeFileSync(filePath, html, \"utf-8\");\n this.logger.info(\"FindLocators\", `HTML written to ${filePath}`);\n } catch (err) {\n this.logger.warn(\"FindLocators HTML write failed\", err);\n }\n }\n\n async exists(selector: string, options: FrameSelectorOptions = {}) {\n const handle = await this.query(selector, options);\n if (handle) {\n await this.releaseObject(handle.objectId);\n return true;\n }\n return false;\n }\n\n async isVisible(selector: string, options: FrameSelectorOptions = {}) {\n const box = await this.resolveElementBox(selector, options);\n return Boolean(box && box.visible);\n }\n\n async text(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n return el.textContent || \"\";\n `);\n }\n\n async textSecure(selector: string, options: FrameSelectorOptions = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"text\", selector, frameId: this.id, sensitive: true });\n const result = await this.text(selector, options);\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"text\", selector, frameId: this.id, durationMs: duration, sensitive: true });\n return result;\n }\n\n async selectOption(selector: string, value: string) {\n await this.evaluate(\n (sel, val) => {\n const el = document.querySelector(sel);\n if (!(el instanceof HTMLSelectElement)) return false;\n el.value = val;\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n },\n selector,\n value\n );\n }\n\n async setFileInput(selector: string, name: string, contents: string, options: { mimeType?: string } = {}) {\n await this.evaluate(\n (sel, fileName, text, mime) => {\n const input = document.querySelector(sel);\n if (!(input instanceof HTMLInputElement)) return false;\n const file = new File([text], fileName, { type: mime || \"text/plain\" });\n const data = new DataTransfer();\n data.items.add(file);\n input.files = data.files;\n input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n },\n selector,\n name,\n contents,\n options.mimeType || \"text/plain\"\n );\n }\n\n async attribute(selector: string, name: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string | null>(selector, options, false, `\n if (!el || !(el instanceof Element)) {\n return null;\n }\n return el.getAttribute(${JSON.stringify(name)});\n `);\n }\n\n async value(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n if (\"value\" in el) {\n return el.value ?? \"\";\n }\n return el.getAttribute(\"value\");\n `);\n }\n\n async valueSecure(selector: string, options: FrameSelectorOptions = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"value\", selector, frameId: this.id, sensitive: true });\n const result = await this.value(selector, options);\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"value\", selector, frameId: this.id, durationMs: duration, sensitive: true });\n return result;\n }\n\n async isEnabled(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const disabled = Boolean(el.disabled) || el.hasAttribute(\"disabled\");\n const ariaDisabled = el.getAttribute && el.getAttribute(\"aria-disabled\") === \"true\";\n return !(disabled || ariaDisabled);\n `);\n }\n\n async isChecked(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const aria = el.getAttribute && el.getAttribute(\"aria-checked\");\n if (aria === \"true\") {\n return true;\n }\n if (aria === \"false\") {\n return false;\n }\n if (\"checked\" in el) {\n return Boolean(el.checked);\n }\n return null;\n `);\n }\n\n async count(selector: string, options: FrameSelectorOptions = {}) {\n const parsed = parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n const expression = parsed.type === \"xpath\"\n ? `(function() {\n const result = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\n return result.snapshotLength;\n })()`\n : `(function() {\n const querySelectorAllDeep = ${helpers.querySelectorAllDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n const nodes = ${pierce ? \"querySelectorAllDeep(root, selector)\" : \"root.querySelectorAll(selector)\"};\n return nodes.length;\n })()`;\n\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: number } }>(\"Runtime.evaluate\", params);\n return result.result.value ?? 0;\n }\n\n async classes(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string[] | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n if (!el.classList) {\n return [];\n }\n return Array.from(el.classList);\n `);\n }\n\n async css(selector: string, property: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const style = window.getComputedStyle(el);\n return style.getPropertyValue(${JSON.stringify(property)}) || \"\";\n `);\n }\n\n async hasFocus(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n return document.activeElement === el;\n `);\n }\n\n async isInViewport(selector: string, options: FrameSelectorOptions = {}, fully = false) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const rect = el.getBoundingClientRect();\n const viewWidth = window.innerWidth || document.documentElement.clientWidth;\n const viewHeight = window.innerHeight || document.documentElement.clientHeight;\n if (${fully ? \"true\" : \"false\"}) {\n return rect.top >= 0 && rect.left >= 0 && rect.bottom <= viewHeight && rect.right <= viewWidth;\n }\n return rect.bottom > 0 && rect.right > 0 && rect.top < viewHeight && rect.left < viewWidth;\n `);\n }\n\n async isEditable(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const disabled = Boolean(el.disabled) || el.hasAttribute(\"disabled\");\n const readOnly = Boolean(el.readOnly) || el.hasAttribute(\"readonly\");\n const ariaDisabled = el.getAttribute && el.getAttribute(\"aria-disabled\") === \"true\";\n return !(disabled || readOnly || ariaDisabled);\n `);\n }\n\n private async performClick(selector: string, options: ClickOptions, isDouble: boolean) {\n const start = Date.now();\n const actionName = isDouble ? \"dblclick\" : \"click\";\n this.events.emit(\"action:start\", { name: actionName, selector, frameId: this.id });\n const box = await waitFor(async () => {\n const result = await this.resolveElementBox(selector, options);\n if (!result || !result.visible) {\n return null;\n }\n return result;\n }, { timeoutMs: options.timeoutMs ?? this.defaultTimeout, description: `${actionName} ${selector}` });\n\n const centerX = box.x + box.width / 2;\n const centerY = box.y + box.height / 2;\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseMoved\", x: centerX, y: centerY });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mousePressed\", x: centerX, y: centerY, button: \"left\", clickCount: 1, buttons: 1 });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseReleased\", x: centerX, y: centerY, button: \"left\", clickCount: 1, buttons: 0 });\n\n if (isDouble) {\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseMoved\", x: centerX, y: centerY });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mousePressed\", x: centerX, y: centerY, button: \"left\", clickCount: 2, buttons: 1 });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseReleased\", x: centerX, y: centerY, button: \"left\", clickCount: 2, buttons: 0 });\n }\n\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: actionName, selector, frameId: this.id, durationMs: duration });\n this.logger.debug(\"Click\", selector, `${duration}ms`);\n }\n\n private async resolveElementBox(selector: string, options: FrameSelectorOptions): Promise<ElementBox | null> {\n const parsed = parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n const expression = parsed.type === \"xpath\"\n ? `(function() {\n const result = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n if (!result || !(result instanceof Element)) {\n return null;\n }\n result.scrollIntoView({ block: 'center', inline: 'center' });\n const rect = result.getBoundingClientRect();\n const style = window.getComputedStyle(result);\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height, visible: rect.width > 0 && rect.height > 0 && style.visibility !== 'hidden' && style.display !== 'none' && Number(style.opacity || '1') > 0 };\n })()`\n : `(function() {\n const querySelectorDeep = ${helpers.querySelectorDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n const el = ${pierce ? \"querySelectorDeep(root, selector)\" : \"root.querySelector(selector)\"};\n if (!el) {\n return null;\n }\n el.scrollIntoView({ block: 'center', inline: 'center' });\n const rect = el.getBoundingClientRect();\n const style = window.getComputedStyle(el);\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height, visible: rect.width > 0 && rect.height > 0 && style.visibility !== 'hidden' && style.display !== 'none' && Number(style.opacity || '1') > 0 };\n })()`;\n\n const boxParams: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n boxParams.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value: ElementBox | null } }>(\"Runtime.evaluate\", boxParams);\n\n return result?.result?.value ?? null;\n }\n\n private async querySelectorInternal(selector: string, options: FrameSelectorOptions, forceXPath: boolean): Promise<QueryResult | null> {\n const parsed = forceXPath ? { type: \"xpath\", value: selector.trim(), pierceShadowDom: undefined } : parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n const expression = parsed.type === \"xpath\"\n ? `(function() {\n const result = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n return result || null;\n })()`\n : `(function() {\n const querySelectorDeep = ${helpers.querySelectorDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n return ${pierce ? \"querySelectorDeep(root, selector)\" : \"root.querySelector(selector)\"};\n })()`;\n\n const queryParams: Record<string, unknown> = {\n expression,\n returnByValue: false\n };\n if (this.contextId) {\n queryParams.contextId = this.contextId;\n }\n const response = await this.session.send<{ result: { subtype?: string; objectId?: string } }>(\"Runtime.evaluate\", queryParams);\n\n if (response.result?.subtype === \"null\" || !response.result?.objectId) {\n return null;\n }\n\n return { objectId: response.result.objectId, contextId: this.contextId ?? 0 };\n }\n\n private async querySelectorAllInternal(selector: string, options: FrameSelectorOptions, forceXPath: boolean): Promise<QueryResult[]> {\n const parsed = forceXPath ? { type: \"xpath\", value: selector.trim(), pierceShadowDom: undefined } : parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n const expression = parsed.type === \"xpath\"\n ? `(function() {\n const result = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\n const nodes = [];\n for (let i = 0; i < result.snapshotLength; i += 1) {\n nodes.push(result.snapshotItem(i));\n }\n return nodes;\n })()`\n : `(function() {\n const querySelectorAllDeep = ${helpers.querySelectorAllDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n return ${pierce ? \"querySelectorAllDeep(root, selector)\" : \"Array.from(root.querySelectorAll(selector))\"};\n })()`;\n\n const listParams: Record<string, unknown> = {\n expression,\n returnByValue: false\n };\n if (this.contextId) {\n listParams.contextId = this.contextId;\n }\n const response = await this.session.send<{ result: { objectId?: string } }>(\"Runtime.evaluate\", listParams);\n\n if (!response.result?.objectId) {\n return [];\n }\n\n const properties = await this.session.send<{ result: Array<{ name?: string; value?: { objectId?: string } }> }>(\"Runtime.getProperties\", {\n objectId: response.result.objectId,\n ownProperties: true\n });\n\n const handles: QueryResult[] = [];\n for (const prop of properties.result) {\n if (prop.name && !/^\\d+$/.test(prop.name)) {\n continue;\n }\n const objectId = prop.value?.objectId;\n if (objectId) {\n handles.push({ objectId, contextId: this.contextId ?? 0 });\n }\n }\n\n await this.releaseObject(response.result.objectId);\n return handles;\n }\n\n private async evaluateInContext(fnOrString: string | ((...args: any[]) => any), args: any[]): Promise<any> {\n if (typeof fnOrString === \"string\") {\n const params: Record<string, unknown> = {\n expression: fnOrString,\n returnByValue: true,\n awaitPromise: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: unknown } }>(\"Runtime.evaluate\", params);\n return result.result.value;\n }\n\n const serializedArgs = args.map((arg) => serializeArgument(arg)).join(\", \");\n const expression = `(${fnOrString.toString()})(${serializedArgs})`;\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true,\n awaitPromise: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: unknown } }>(\"Runtime.evaluate\", params);\n return result.result.value;\n }\n\n private async releaseObject(objectId: string) {\n try {\n await this.session.send(\"Runtime.releaseObject\", { objectId });\n } catch {\n // ignore release errors\n }\n }\n\n private buildElementExpression(selector: string, options: FrameSelectorOptions, forceXPath: boolean, body: string) {\n const parsed = forceXPath ? { type: \"xpath\", value: selector.trim(), pierceShadowDom: undefined } : parseSelector(selector);\n const pierce = options.pierceShadowDom ?? Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n if (parsed.type === \"xpath\") {\n return `(function() {\n const el = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n ${body}\n })()`;\n }\n return `(function() {\n const querySelectorDeep = ${helpers.querySelectorDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n const el = ${pierce ? \"querySelectorDeep(root, selector)\" : \"root.querySelector(selector)\"};\n ${body}\n })()`;\n }\n\n private async evalOnSelector<T>(selector: string, options: FrameSelectorOptions, forceXPath: boolean, body: string): Promise<T> {\n const expression = this.buildElementExpression(selector, options, forceXPath, body);\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: T } }>(\"Runtime.evaluate\", params);\n return result.result.value as T;\n }\n}\n\nfunction serializeArgument(value: unknown) {\n if (value === undefined) {\n return \"undefined\";\n }\n return JSON.stringify(value);\n}\n","export type WaitForOptions = {\n timeoutMs?: number;\n intervalMs?: number;\n description?: string;\n};\n\nexport async function waitFor<T>(predicate: () => Promise<T> | T, options: WaitForOptions = {}): Promise<NonNullable<T>> {\n const timeoutMs = options.timeoutMs ?? 30_000;\n const intervalMs = options.intervalMs ?? 100;\n const start = Date.now();\n\n let lastError: unknown;\n while (Date.now() - start < timeoutMs) {\n try {\n const result = await predicate();\n if (result) {\n return result as NonNullable<T>;\n }\n } catch (err) {\n lastError = err;\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n const description = options.description ? ` (${options.description})` : \"\";\n const error = new Error(`Timeout after ${timeoutMs}ms${description}`);\n (error as Error & { cause?: unknown }).cause = lastError;\n throw error;\n}\n","export type SelectorType = \"css\" | \"xpath\";\n\nexport type ParsedSelector = {\n type: SelectorType;\n value: string;\n pierceShadowDom?: boolean;\n};\n\nfunction isXPathSelector(input: string): boolean {\n if (input.startsWith(\"/\")) return true;\n if (input.startsWith(\"./\")) return true;\n if (input.startsWith(\".//\")) return true;\n if (input.startsWith(\"..\")) return true;\n if (input.startsWith(\"(\")) {\n const trimmed = input.trimStart();\n if (trimmed.startsWith(\"(\")) {\n const inner = trimmed.slice(1).trimStart();\n return inner.startsWith(\"/\") || inner.startsWith(\".\");\n }\n }\n return false;\n}\n\nexport function parseSelector(input: string): ParsedSelector {\n const value = input.trim();\n const pierceShadowDom = value.includes(\">>>\");\n return {\n type: isXPathSelector(value) ? \"xpath\" : \"css\",\n value,\n pierceShadowDom\n };\n}\n","type RootNode = Document | ShadowRoot | Element;\n\nfunction getElementCtor(root: RootNode): typeof Element | null {\n if (typeof Element !== \"undefined\") return Element;\n const doc = (root as Document | ShadowRoot | Element & { ownerDocument?: Document }).ownerDocument;\n const view = (doc || (root as any)).defaultView;\n return view?.Element ?? null;\n}\n\nfunction isElementNode(node: RootNode, ElementCtor: typeof Element): node is Element {\n return node instanceof ElementCtor;\n}\n\nfunction nodeChildren(node: RootNode): Element[] {\n if (!(\"children\" in node)) {\n return [];\n }\n return Array.from(node.children as unknown as Iterable<Element>);\n}\n\nexport function querySelectorDeep(root: RootNode, selector: string): Element | null {\n const ElementCtor = getElementCtor(root);\n if (!ElementCtor) return null;\n const elementCtor = ElementCtor;\n function walk(node: RootNode, sel: string, results: Element[]) {\n if (isElementNode(node, elementCtor) && node.matches(sel)) {\n results.push(node);\n }\n if (isElementNode(node, elementCtor) && node.shadowRoot) {\n walk(node.shadowRoot, sel, results);\n }\n for (const child of nodeChildren(node)) {\n walk(child, sel, results);\n }\n }\n\n function findAll(rootNode: RootNode, sel: string) {\n const results: Element[] = [];\n walk(rootNode, sel, results);\n return results;\n }\n\n if (selector.includes(\">>>\")) {\n const parts = selector.split(\">>>\").map((p) => p.trim()).filter(Boolean);\n let scope: RootNode[] = [root];\n for (const part of parts) {\n const matches: Element[] = [];\n for (const item of scope) {\n matches.push(...findAll(item, part));\n }\n if (matches.length === 0) return null;\n scope = matches;\n }\n return (scope[0] as Element) ?? null;\n }\n const results = findAll(root, selector);\n return results[0] ?? null;\n}\n\nexport function querySelectorAllDeep(root: Document | ShadowRoot | Element, selector: string): Element[] {\n const ElementCtor = getElementCtor(root);\n if (!ElementCtor) return [];\n const elementCtor = ElementCtor;\n function walk(node: RootNode, sel: string, results: Element[]) {\n if (isElementNode(node, elementCtor) && node.matches(sel)) {\n results.push(node);\n }\n if (isElementNode(node, elementCtor) && node.shadowRoot) {\n walk(node.shadowRoot, sel, results);\n }\n for (const child of nodeChildren(node)) {\n walk(child, sel, results);\n }\n }\n\n function findAll(rootNode: RootNode, sel: string) {\n const results: Element[] = [];\n walk(rootNode, sel, results);\n return results;\n }\n\n if (selector.includes(\">>>\")) {\n const parts = selector.split(\">>>\").map((p) => p.trim()).filter(Boolean);\n let scope: RootNode[] = [root];\n for (const part of parts) {\n const matches: Element[] = [];\n for (const item of scope) {\n matches.push(...findAll(item, part));\n }\n scope = matches;\n if (scope.length === 0) return [];\n }\n return scope.filter((el): el is Element => el instanceof Element);\n }\n return findAll(root, selector);\n}\n\nexport function serializeShadowDomHelpers() {\n return {\n querySelectorDeep: querySelectorDeep.toString(),\n querySelectorAllDeep: querySelectorAllDeep.toString()\n };\n}\n","import type { Frame } from \"./Frame.js\";\n\nexport type LocatorOptions = {};\n\nexport class Locator {\n private frame: Frame;\n private selector: string;\n private options: LocatorOptions;\n\n constructor(frame: Frame, selector: string, options: LocatorOptions = {}) {\n this.frame = frame;\n this.selector = selector;\n this.options = options;\n }\n\n async click(options: { timeoutMs?: number } = {}) {\n return this.frame.click(this.selector, { ...this.options, ...options });\n }\n\n async dblclick(options: { timeoutMs?: number } = {}) {\n return this.frame.dblclick(this.selector, { ...this.options, ...options });\n }\n\n async type(text: string, options: { timeoutMs?: number } = {}) {\n return this.frame.type(this.selector, text, { ...this.options, ...options });\n }\n\n async exists() {\n return this.frame.exists(this.selector, this.options);\n }\n\n async text() {\n return this.frame.text(this.selector, this.options);\n }\n}\n","export type UrlGuardOptions = {\n allowFileUrl?: boolean;\n};\n\nexport function ensureAllowedUrl(url: string, options: UrlGuardOptions = {}) {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new Error(`Invalid URL: ${url}`);\n }\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") {\n return;\n }\n if (parsed.protocol === \"file:\" && options.allowFileUrl) {\n return;\n }\n throw new Error(`URL protocol not allowed: ${parsed.protocol}`);\n}\n","import { ChildProcess } from \"child_process\";\nimport { Connection } from \"../cdp/Connection.js\";\nimport { Session } from \"../cdp/Session.js\";\nimport { Logger } from \"../logging/Logger.js\";\nimport { AutomationEvents } from \"./Events.js\";\nimport { Page } from \"./Page.js\";\n\nexport class BrowserContext {\n private browser: Browser;\n private id: string;\n\n constructor(browser: Browser, id: string) {\n this.browser = browser;\n this.id = id;\n }\n\n getId() {\n return this.id;\n }\n\n async newPage() {\n return this.browser.newPage({ browserContextId: this.id });\n }\n\n async close() {\n await this.browser.disposeContext(this.id);\n }\n}\n\nexport class Browser {\n private connection: Connection;\n private process: ChildProcess;\n private logger: Logger;\n private events: AutomationEvents;\n private cleanupTasks: Array<() => void>;\n private contexts = new Set<string>();\n\n constructor(connection: Connection, child: ChildProcess, logger: Logger, events: AutomationEvents, cleanupTasks: Array<() => void> = []) {\n this.connection = connection;\n this.process = child;\n this.logger = logger;\n this.events = events;\n this.cleanupTasks = cleanupTasks;\n }\n\n on(event: \"action:start\" | \"action:end\" | \"assertion:start\" | \"assertion:end\", handler: (payload: any) => void) {\n this.events.on(event, handler as any);\n }\n\n async newContext() {\n const { browserContextId } = await this.connection.send<{ browserContextId: string }>(\"Target.createBrowserContext\");\n this.contexts.add(browserContextId);\n return new BrowserContext(this, browserContextId);\n }\n\n async newPage(options: { browserContextId?: string } = {}) {\n const { browserContextId } = options;\n const { targetId } = await this.connection.send<{ targetId: string }>(\"Target.createTarget\", {\n url: \"about:blank\",\n browserContextId\n });\n const { sessionId } = await this.connection.send<{ sessionId: string }>(\"Target.attachToTarget\", { targetId, flatten: true });\n const session = this.connection.createSession(sessionId);\n const page = new Page(session, this.logger, this.events);\n await page.initialize();\n return page;\n }\n\n async disposeContext(contextId: string) {\n if (!contextId) return;\n try {\n await this.connection.send(\"Target.disposeBrowserContext\", { browserContextId: contextId });\n } catch {\n // ignore dispose failures\n }\n this.contexts.delete(contextId);\n }\n\n async close() {\n if (this.contexts.size > 0) {\n for (const contextId of Array.from(this.contexts)) {\n await this.disposeContext(contextId);\n }\n }\n try {\n await this.connection.send(\"Browser.close\");\n } catch {\n // ignore\n }\n await this.connection.close();\n if (!this.process.killed) {\n this.process.kill();\n }\n for (const task of this.cleanupTasks) {\n try {\n task();\n } catch {\n // ignore cleanup errors\n }\n }\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport http from \"http\";\nimport https from \"https\";\nimport { spawn } from \"child_process\";\nimport yauzl from \"yauzl\";\nimport { Logger } from \"../logging/Logger.js\";\n\nexport type Platform = \"linux\" | \"mac\" | \"win\";\n\nconst SNAPSHOT_BASE = \"https://commondatastorage.googleapis.com/chromium-browser-snapshots\";\n\nexport function detectPlatform(platform = process.platform): Platform {\n if (platform === \"linux\") return \"linux\";\n if (platform === \"darwin\") return \"mac\";\n if (platform === \"win32\") return \"win\";\n throw new Error(`Unsupported platform: ${platform}`);\n}\n\nexport function platformFolder(platform: Platform) {\n if (platform === \"linux\") return \"Linux_x64\";\n if (platform === \"mac\") return \"Mac\";\n return \"Win\";\n}\n\nexport function defaultCacheRoot(platform: Platform) {\n if (platform === \"win\") {\n const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), \"AppData\", \"Local\");\n return path.join(localAppData, \"cdpwright\");\n }\n return path.join(os.homedir(), \".cache\", \"cdpwright\");\n}\n\nexport function ensureWithinRoot(root: string, target: string) {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n if (resolvedTarget === resolvedRoot) {\n return;\n }\n if (!resolvedTarget.startsWith(resolvedRoot + path.sep)) {\n throw new Error(`Path escapes cache root: ${resolvedTarget}`);\n }\n}\n\nexport function chromiumExecutableRelativePath(platform: Platform) {\n if (platform === \"linux\") return path.join(\"chrome-linux\", \"chrome\");\n if (platform === \"mac\") return path.join(\"chrome-mac\", \"Chromium.app\", \"Contents\", \"MacOS\", \"Chromium\");\n return path.join(\"chrome-win\", \"chrome.exe\");\n}\n\nfunction httpGet(url: string): typeof https {\n return url.startsWith(\"http://\") ? http as any : https;\n}\n\nfunction resolveSnapshotBase(): string {\n const mirror = process.env.CDPWRIGHT_DOWNLOAD_MIRROR;\n if (mirror && mirror.trim()) {\n return mirror.trim().replace(/\\/+$/, \"\");\n }\n return SNAPSHOT_BASE;\n}\n\nexport async function fetchLatestRevision(platform: Platform): Promise<string> {\n const base = resolveSnapshotBase();\n const folder = platformFolder(platform);\n const url = `${base}/${folder}/LAST_CHANGE`;\n return new Promise((resolve, reject) => {\n httpGet(url).get(url, (res) => {\n if (res.statusCode && res.statusCode >= 400) {\n reject(new Error(`Failed to fetch LAST_CHANGE: ${res.statusCode}`));\n return;\n }\n let data = \"\";\n res.on(\"data\", (chunk) => (data += chunk.toString()));\n res.on(\"end\", () => resolve(data.trim()));\n }).on(\"error\", reject);\n });\n}\n\nexport type DownloadOptions = {\n cacheRoot: string;\n platform: Platform;\n revision: string;\n logger: Logger;\n};\n\nexport async function ensureDownloaded(options: DownloadOptions) {\n const { cacheRoot, platform, revision, logger } = options;\n ensureWithinRoot(cacheRoot, cacheRoot);\n const platformDir = path.join(cacheRoot, platform);\n const revisionDir = path.join(platformDir, revision);\n ensureWithinRoot(cacheRoot, revisionDir);\n\n const executablePath = path.join(revisionDir, chromiumExecutableRelativePath(platform));\n const markerFile = path.join(revisionDir, \"INSTALLATION_COMPLETE\");\n\n if (fs.existsSync(executablePath) && fs.existsSync(markerFile)) {\n return { executablePath, revisionDir };\n }\n\n fs.mkdirSync(revisionDir, { recursive: true });\n\n const folder = platformFolder(platform);\n const zipName = platform === \"win\" ? \"chrome-win.zip\" : platform === \"mac\" ? \"chrome-mac.zip\" : \"chrome-linux.zip\";\n\n const explicitUrl = process.env.CDPWRIGHT_DOWNLOAD_URL?.trim();\n const base = resolveSnapshotBase();\n const downloadUrl = explicitUrl || `${base}/${folder}/${revision}/${zipName}`;\n\n const tempZipPath = path.join(os.tmpdir(), `cdpwright-${platform}-${revision}.zip`);\n\n logger.info(\"Downloading Chromium snapshot\", downloadUrl);\n await downloadFile(downloadUrl, tempZipPath, logger);\n logger.info(\"Extracting Chromium snapshot\", tempZipPath);\n await extractZipSafe(tempZipPath, revisionDir);\n fs.writeFileSync(markerFile, new Date().toISOString());\n fs.unlinkSync(tempZipPath);\n\n if (!fs.existsSync(executablePath)) {\n throw new Error(`Executable not found after extraction: ${executablePath}`);\n }\n ensureExecutable(executablePath, platform);\n\n return { executablePath, revisionDir };\n}\n\nfunction downloadFile(url: string, dest: string, logger: Logger): Promise<void> {\n return new Promise((resolve, reject) => {\n const file = fs.createWriteStream(dest);\n httpGet(url).get(url, (res) => {\n if (res.statusCode && res.statusCode >= 400) {\n reject(new Error(`Failed to download: ${res.statusCode}`));\n return;\n }\n const total = Number(res.headers[\"content-length\"] || 0);\n let downloaded = 0;\n let lastLoggedPercent = -1;\n let lastLoggedTime = Date.now();\n res.pipe(file);\n res.on(\"data\", (chunk) => {\n downloaded += chunk.length;\n if (!total) {\n const now = Date.now();\n if (now - lastLoggedTime > 2000) {\n logger.info(\"Download progress\", `${(downloaded / (1024 * 1024)).toFixed(1)} MB`);\n lastLoggedTime = now;\n }\n return;\n }\n const percent = Math.floor((downloaded / total) * 100);\n if (percent >= lastLoggedPercent + 5) {\n logger.info(\"Download progress\", `${percent}%`);\n lastLoggedPercent = percent;\n }\n });\n file.on(\"finish\", () => file.close(() => resolve()));\n }).on(\"error\", (err) => {\n fs.unlink(dest, () => reject(err));\n });\n });\n}\n\nexport async function extractZipSafe(zipPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n yauzl.open(zipPath, { lazyEntries: true }, (err, zipfile) => {\n if (err || !zipfile) {\n reject(err || new Error(\"Unable to open zip\"));\n return;\n }\n\n zipfile.readEntry();\n zipfile.on(\"entry\", (entry) => {\n const entryPath = entry.fileName.replace(/\\\\/g, \"/\");\n const targetPath = path.join(destDir, entryPath);\n try {\n ensureWithinRoot(destDir, targetPath);\n } catch (error) {\n zipfile.close();\n reject(error);\n return;\n }\n\n if (/\\/$/.test(entry.fileName)) {\n fs.mkdirSync(targetPath, { recursive: true });\n zipfile.readEntry();\n return;\n }\n\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n zipfile.openReadStream(entry, (streamErr, readStream) => {\n if (streamErr || !readStream) {\n zipfile.close();\n reject(streamErr || new Error(\"Unable to read zip entry\"));\n return;\n }\n const rawMode = entry.externalFileAttributes ? (entry.externalFileAttributes >>> 16) & 0xffff : 0;\n const mode = rawMode > 0 ? rawMode : undefined;\n const writeStream = fs.createWriteStream(targetPath);\n readStream.pipe(writeStream);\n writeStream.on(\"error\", (writeErr) => {\n zipfile.close();\n reject(writeErr);\n });\n writeStream.on(\"close\", () => {\n if (mode && mode <= 0o777) {\n try {\n fs.chmodSync(targetPath, mode);\n } catch {\n // ignore chmod errors\n }\n }\n zipfile.readEntry();\n });\n });\n });\n\n zipfile.on(\"end\", () => {\n zipfile.close();\n resolve();\n });\n\n zipfile.on(\"error\", (zipErr) => {\n zipfile.close();\n reject(zipErr);\n });\n });\n });\n}\n\nexport async function chromiumVersion(executablePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(executablePath, [\"--version\"], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let output = \"\";\n child.stdout.on(\"data\", (chunk) => (output += chunk.toString()));\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(output.trim());\n } else {\n reject(new Error(`Failed to get Chromium version: ${code}`));\n }\n });\n child.on(\"error\", reject);\n });\n}\n\nfunction ensureExecutable(executablePath: string, platform: Platform) {\n if (platform === \"win\") {\n return;\n }\n try {\n const stat = fs.statSync(executablePath);\n const isExecutable = (stat.mode & 0o111) !== 0;\n if (!isExecutable) {\n fs.chmodSync(executablePath, 0o755);\n }\n } catch {\n // ignore chmod errors\n }\n}\n","export const PINNED_REVISION = \"1567454\";\n\nexport function resolveRevision(envRevision?: string) {\n if (envRevision && envRevision.trim()) {\n return envRevision.trim();\n }\n return PINNED_REVISION;\n}\n","export class AssertionError extends Error {\n selector?: string;\n timeoutMs?: number;\n lastState?: unknown;\n\n constructor(message: string, options: { selector?: string; timeoutMs?: number; lastState?: unknown } = {}) {\n super(message);\n this.name = \"AssertionError\";\n this.selector = options.selector;\n this.timeoutMs = options.timeoutMs;\n this.lastState = options.lastState;\n }\n}\n","import { AssertionError } from \"./AssertionError.js\";\nimport { waitFor } from \"../core/Waiter.js\";\nimport { Page } from \"../core/Page.js\";\nimport { Frame } from \"../core/Frame.js\";\nimport { AutomationEvents } from \"../core/Events.js\";\n\nexport type ExpectSelectorOptions = {\n timeoutMs?: number;\n};\n\nclass ElementExpectation {\n private frame: Frame;\n private selector: string;\n private options: ExpectSelectorOptions;\n private negate: boolean;\n private events: AutomationEvents;\n\n constructor(frame: Frame, selector: string, options: ExpectSelectorOptions, negate: boolean, events: AutomationEvents) {\n this.frame = frame;\n this.selector = selector;\n this.options = options;\n this.negate = negate;\n this.events = events;\n }\n\n get not() {\n return new ElementExpectation(this.frame, this.selector, this.options, !this.negate, this.events);\n }\n\n async toExist() {\n return this.assert(async () => {\n const exists = await this.frame.exists(this.selector, this.options);\n return this.negate ? !exists : exists;\n }, this.negate ? \"Expected element not to exist\" : \"Expected element to exist\");\n }\n\n async toBeVisible() {\n return this.assert(async () => {\n const visible = await this.frame.isVisible(this.selector, this.options);\n return this.negate ? !visible : visible;\n }, this.negate ? \"Expected element not to be visible\" : \"Expected element to be visible\");\n }\n\n async toBeHidden() {\n return this.assert(async () => {\n const visible = await this.frame.isVisible(this.selector, this.options);\n return this.negate ? visible : !visible;\n }, this.negate ? \"Expected element not to be hidden\" : \"Expected element to be hidden\");\n }\n\n async toBeEnabled() {\n return this.assert(async () => {\n const enabled = await this.frame.isEnabled(this.selector, this.options);\n if (enabled == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !enabled : enabled;\n }, this.negate ? \"Expected element not to be enabled\" : \"Expected element to be enabled\");\n }\n\n async toBeDisabled() {\n return this.assert(async () => {\n const enabled = await this.frame.isEnabled(this.selector, this.options);\n if (enabled == null) {\n return this.negate ? true : false;\n }\n const disabled = !enabled;\n return this.negate ? !disabled : disabled;\n }, this.negate ? \"Expected element not to be disabled\" : \"Expected element to be disabled\");\n }\n\n async toBeChecked() {\n return this.assert(async () => {\n const checked = await this.frame.isChecked(this.selector, this.options);\n if (checked == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !checked : checked;\n }, this.negate ? \"Expected element not to be checked\" : \"Expected element to be checked\");\n }\n\n async toBeUnchecked() {\n return this.assert(async () => {\n const checked = await this.frame.isChecked(this.selector, this.options);\n if (checked == null) {\n return this.negate ? true : false;\n }\n const unchecked = !checked;\n return this.negate ? !unchecked : unchecked;\n }, this.negate ? \"Expected element not to be unchecked\" : \"Expected element to be unchecked\");\n }\n\n async toHaveText(textOrRegex: string | RegExp) {\n const expected = textOrRegex;\n return this.assert(async () => {\n const text = await this.frame.text(this.selector, this.options);\n if (text == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(text)\n : text.includes(expected);\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element text not to match\" : \"Expected element text to match\", { expected });\n }\n\n async toHaveExactText(textOrRegex: string | RegExp) {\n const expected = textOrRegex;\n return this.assert(async () => {\n const text = await this.frame.text(this.selector, this.options);\n if (text == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(text)\n : text === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element text not to match exactly\" : \"Expected element text to match exactly\", { expected });\n }\n\n async toContainText(textOrRegex: string | RegExp) {\n const expected = textOrRegex;\n return this.assert(async () => {\n const text = await this.frame.text(this.selector, this.options);\n if (text == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(text)\n : text.includes(expected);\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element text not to contain\" : \"Expected element text to contain\", { expected });\n }\n\n async toHaveValue(valueOrRegex: string | RegExp) {\n const expected = valueOrRegex;\n return this.assert(async () => {\n const value = await this.frame.value(this.selector, this.options);\n if (value == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(value)\n : value === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element value not to match\" : \"Expected element value to match\", { expected });\n }\n\n async toHaveAttribute(name: string, valueOrRegex?: string | RegExp) {\n const expected = valueOrRegex;\n return this.assert(async () => {\n const value = await this.frame.attribute(this.selector, name, this.options);\n if (expected === undefined) {\n const exists = value != null;\n return this.negate ? !exists : exists;\n }\n if (value == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(value)\n : value === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element attribute not to match\" : \"Expected element attribute to match\", { expected, name });\n }\n\n async toHaveId(idOrRegex: string | RegExp) {\n return this.toHaveAttribute(\"id\", idOrRegex);\n }\n\n async toHaveName(nameOrRegex: string | RegExp) {\n return this.toHaveAttribute(\"name\", nameOrRegex);\n }\n\n async toHaveCount(expected: number) {\n return this.assert(async () => {\n const count = await this.frame.count(this.selector, this.options);\n const matches = count === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element count not to match\" : \"Expected element count to match\", { expected });\n }\n\n async toHaveClass(nameOrRegex: string | RegExp) {\n const expected = nameOrRegex;\n return this.assert(async () => {\n const classes = await this.frame.classes(this.selector, this.options);\n if (classes == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? classes.some((value) => new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(value))\n : classes.includes(expected);\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element class not to match\" : \"Expected element class to match\", { expected });\n }\n\n async toHaveClasses(expected: string[]) {\n return this.assert(async () => {\n const classes = await this.frame.classes(this.selector, this.options);\n if (classes == null) {\n return this.negate ? true : false;\n }\n const matches = expected.every((value) => classes.includes(value));\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element classes not to match\" : \"Expected element classes to match\", { expected });\n }\n\n async toHaveCss(property: string, valueOrRegex: string | RegExp) {\n const expected = valueOrRegex;\n return this.assert(async () => {\n const value = await this.frame.css(this.selector, property, this.options);\n if (value == null) {\n return this.negate ? true : false;\n }\n const actual = value.trim();\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(actual)\n : actual === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element css not to match\" : \"Expected element css to match\", { expected, property });\n }\n\n async toHaveFocus() {\n return this.assert(async () => {\n const focused = await this.frame.hasFocus(this.selector, this.options);\n if (focused == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !focused : focused;\n }, this.negate ? \"Expected element not to have focus\" : \"Expected element to have focus\");\n }\n\n async toBeInViewport(options: { fully?: boolean } = {}) {\n return this.assert(async () => {\n const inViewport = await this.frame.isInViewport(this.selector, this.options, Boolean(options.fully));\n if (inViewport == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !inViewport : inViewport;\n }, this.negate ? \"Expected element not to be in viewport\" : \"Expected element to be in viewport\");\n }\n\n async toBeEditable() {\n return this.assert(async () => {\n const editable = await this.frame.isEditable(this.selector, this.options);\n if (editable == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !editable : editable;\n }, this.negate ? \"Expected element not to be editable\" : \"Expected element to be editable\");\n }\n\n private async assert(predicate: () => Promise<boolean>, message: string, details: Record<string, unknown> = {}) {\n const timeoutMs = this.options.timeoutMs ?? 30_000;\n const start = Date.now();\n this.events.emit(\"assertion:start\", { name: message, selector: this.selector, frameId: this.frame.id });\n\n let lastState: unknown;\n try {\n await waitFor(async () => {\n const result = await predicate();\n lastState = result;\n return result;\n }, { timeoutMs, description: message });\n } catch {\n const duration = Date.now() - start;\n this.events.emit(\"assertion:end\", { name: message, selector: this.selector, frameId: this.frame.id, durationMs: duration, status: \"failed\" });\n throw new AssertionError(message, { selector: this.selector, timeoutMs, lastState: { lastState, ...details } });\n }\n\n const duration = Date.now() - start;\n this.events.emit(\"assertion:end\", { name: message, selector: this.selector, frameId: this.frame.id, durationMs: duration, status: \"passed\" });\n }\n}\n\nclass ExpectFrame {\n private frame: Frame;\n private events: AutomationEvents;\n\n constructor(frame: Frame, events: AutomationEvents) {\n this.frame = frame;\n this.events = events;\n }\n\n element(selector: string, options: ExpectSelectorOptions = {}) {\n return new ElementExpectation(this.frame, selector, options, false, this.events);\n }\n}\n\nexport function expect(page: Page) {\n return {\n element: (selector: string, options: ExpectSelectorOptions = {}) => new ElementExpectation(page.mainFrame(), selector, options, false, page.getEvents()),\n frame: (options: { name?: string; urlIncludes?: string; predicate?: (frame: Frame) => boolean }) => {\n const frame = page.frame(options);\n if (!frame) {\n throw new AssertionError(\"Frame not found\", { selector: JSON.stringify(options) });\n }\n return new ExpectFrame(frame, page.getEvents());\n }\n };\n}\n\nexport type { ElementExpectation, ExpectFrame };\n\n// Convenience: page.expect().element(\"selector\") or page.expect(\"selector\").toExist()\ndeclare module \"../core/Page.js\" {\n interface Page {\n expect(): ReturnType<typeof expect>;\n expect(selector: string, options?: ExpectSelectorOptions): ElementExpectation;\n find: {\n locators: (options?: { highlight?: boolean; outputPath?: string; outputJson?: string; outputHtml?: string }) => Promise<any[]>;\n };\n findLocators(options?: { highlight?: boolean; outputPath?: string; outputJson?: string; outputHtml?: string }): Promise<any[]>;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Page.prototype as any).expect = function(selector?: string, options?: ExpectSelectorOptions) {\n const builder = expect(this as Page);\n if (selector) {\n return builder.element(selector, options);\n }\n return builder;\n};\n\nObject.defineProperty(Page.prototype, \"find\", {\n get: function() {\n return {\n locators: (options?: { highlight?: boolean; outputPath?: string; outputJson?: string; outputHtml?: string }) =>\n (this as Page).findLocators(options)\n };\n }\n});\n","import { ChromiumManager, LaunchOptions } from \"./browser/ChromiumManager.js\";\nimport { Browser, BrowserContext } from \"./core/Browser.js\";\nimport { Page } from \"./core/Page.js\";\nimport { Frame } from \"./core/Frame.js\";\nimport { Locator } from \"./core/Locator.js\";\nimport { Logger, LogLevel } from \"./logging/Logger.js\";\nimport { AutomationEvents } from \"./core/Events.js\";\nimport { expect } from \"./assert/expect.js\";\nimport { AssertionError } from \"./assert/AssertionError.js\";\n\nexport type AutomatonLaunchOptions = LaunchOptions & {\n logger?: Logger;\n};\n\nexport const automaton = {\n async launch(options: AutomatonLaunchOptions = {}): Promise<Browser> {\n const manager = new ChromiumManager(options.logger);\n return manager.launch(options);\n }\n};\n\nexport const chromium = automaton;\n\nexport { Browser, BrowserContext, Page, Frame, Locator, Logger, LogLevel, AutomationEvents, expect, AssertionError };\n"],"mappings":"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","names":["fs","path","fs","path","os","http","spawn","EventEmitter","EventEmitter","EventEmitter","fs","path","results","params","result","path","fs","fs","path","path","fs","ensureExecutable","os","spawn","args","http","duration","path","fs"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/browser/ChromiumManager.ts","../src/logging/Logger.ts","../src/core/Events.ts","../src/cdp/Connection.ts","../src/cdp/Session.ts","../src/core/Page.ts","../src/core/Frame.ts","../src/core/Waiter.ts","../src/core/Selectors.ts","../src/core/ShadowDom.ts","../src/core/Locator.ts","../src/core/UrlGuard.ts","../src/core/Browser.ts","../src/browser/Downloader.ts","../src/browser/Revision.ts","../src/assert/AssertionError.ts","../src/assert/expect.ts","../src/index.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport { fileURLToPath } from \"url\";\nimport { ChromiumManager } from \"./browser/ChromiumManager.js\";\nimport { automaton } from \"./index.js\";\nimport { PINNED_REVISION, resolveRevision } from \"./browser/Revision.js\";\nimport {\n detectPlatform,\n defaultCacheRoot,\n chromiumExecutableRelativePath,\n chromiumVersion,\n} from \"./browser/Downloader.js\";\nimport type { Browser } from \"./core/Browser.js\";\nimport type { Page } from \"./core/Page.js\";\n\n// --- Session file ---\n\nfunction sessionFilePath(): string {\n const platform = detectPlatform();\n const cacheRoot = defaultCacheRoot(platform);\n return path.join(cacheRoot, \"session.json\");\n}\n\ntype SessionInfo = { wsEndpoint: string; pid: number };\n\nfunction writeSession(info: SessionInfo) {\n const filePath = sessionFilePath();\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, JSON.stringify(info));\n}\n\nfunction readSession(): SessionInfo | null {\n const filePath = sessionFilePath();\n if (!fs.existsSync(filePath)) return null;\n try {\n const data = JSON.parse(fs.readFileSync(filePath, \"utf-8\"));\n if (!data.wsEndpoint || !data.pid) return null;\n // Check if the process is still alive\n try {\n process.kill(data.pid, 0);\n } catch {\n clearSession();\n return null;\n }\n return data;\n } catch {\n return null;\n }\n}\n\nfunction clearSession() {\n const filePath = sessionFilePath();\n try {\n fs.unlinkSync(filePath);\n } catch {\n // ignore\n }\n}\n\n// --- Helpers ---\n\nfunction printHelp() {\n console.log(`cdpwright (cpw) — Chromium automation CLI\n\nCommands:\n screenshot <url> -o f Take a screenshot (PNG/JPEG)\n pdf <url> -o file.pdf Generate visual PDF of page\n html <url> -o file.html Save the page HTML source\n eval <url> <script> Run JS in page, print result as JSON\n download [options] Download pinned Chromium snapshot\n install Alias for download\n version Print cdpwright and Chromium versions\n\nOptions:\n --headless Run in headless mode (default for screenshot, pdf, eval)\n --headed Run in headed mode\n -o, --output <file> Output file path (for screenshot, html, pdf)\n --full-page Capture full scrollable page (for screenshot)\n --latest Download the latest Chromium revision (for download)\n --mirror <url> Custom mirror base URL (for download)\n --url <url> Exact zip URL override (for download)\n\nInteractive session:\n open <url> Open browser and start a session\n close Close the running session\n When a session is running, commands accept no URL and operate on the\n live page instead: cpw screenshot -o shot.png | cpw eval \"document.title\"`);\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag);\n}\n\nfunction flagValue(args: string[], flag: string): string | undefined {\n const index = args.indexOf(flag);\n if (index === -1 || index + 1 >= args.length) return undefined;\n return args[index + 1];\n}\n\nconst VALUE_FLAGS = [\"--mirror\", \"--url\", \"-o\", \"--output\"];\n\nfunction resolveHeadless(args: string[], defaultValue: boolean): boolean {\n if (hasFlag(args, \"--headed\")) return false;\n if (hasFlag(args, \"--headless\")) return true;\n return defaultValue;\n}\n\nfunction positionalArgs(args: string[]): string[] {\n const result: string[] = [];\n for (let i = 0; i < args.length; i++) {\n if (args[i].startsWith(\"-\")) {\n if (VALUE_FLAGS.includes(args[i])) i++;\n continue;\n }\n result.push(args[i]);\n }\n return result;\n}\n\nfunction launchArgs(): string[] {\n const args: string[] = [];\n if (process.platform === \"linux\") {\n args.push(\"--no-sandbox\", \"--no-zygote\", \"--disable-dev-shm-usage\");\n }\n return args;\n}\n\nfunction pngDimensions(buffer: Buffer): { width: number; height: number } {\n if (buffer.length < 24) {\n throw new Error(\"Invalid PNG screenshot\");\n }\n if (buffer.readUInt32BE(0) !== 0x89504e47 || buffer.readUInt32BE(4) !== 0x0d0a1a0a) {\n throw new Error(\"Invalid PNG screenshot\");\n }\n return {\n width: buffer.readUInt32BE(16),\n height: buffer.readUInt32BE(20),\n };\n}\n\n/** Connect to running session. Returns browser + the first page. */\nasync function connectToSession(): Promise<{ browser: Browser; page: Page }> {\n const session = readSession();\n if (!session) {\n console.error(\"No running session. Start one with: cpw open <url>\");\n process.exit(1);\n }\n const browser = await automaton.connect(session.wsEndpoint);\n const targets = await browser.pages();\n if (targets.length === 0) {\n console.error(\"Session has no open pages.\");\n await browser.disconnect();\n process.exit(1);\n }\n const page = await browser.attachPage(targets[0].targetId);\n return { browser, page };\n}\n\n/** Launch standalone browser, navigate, run fn, close. */\nasync function withPage<T>(\n url: string,\n options: { headless?: boolean; maximize?: boolean },\n fn: (page: Page, browser: Browser) => Promise<T>\n): Promise<T> {\n const browser = await automaton.launch({\n headless: options.headless ?? true,\n maximize: options.maximize ?? false,\n args: launchArgs(),\n logLevel: \"warn\",\n });\n try {\n const page = await browser.newPage();\n await page.goto(url, { waitUntil: \"load\" });\n return await fn(page, browser);\n } finally {\n await browser.close();\n }\n}\n\n// --- Commands ---\n\nasync function cmdDownload(rest: string[]) {\n const latest = hasFlag(rest, \"--latest\");\n const mirrorFlag = flagValue(rest, \"--mirror\");\n if (mirrorFlag) process.env.CDPWRIGHT_DOWNLOAD_MIRROR = mirrorFlag;\n const urlFlag = flagValue(rest, \"--url\");\n if (urlFlag) process.env.CDPWRIGHT_DOWNLOAD_URL = urlFlag;\n const manager = new ChromiumManager();\n await manager.download({ latest });\n}\n\nasync function cmdOpen(rest: string[]) {\n const url = positionalArgs(rest)[0];\n if (!url) {\n console.error(\"Usage: cpw open <url>\");\n process.exit(1);\n }\n\n const headless = resolveHeadless(rest, false);\n\n const browser = await automaton.launch({\n headless,\n args: launchArgs(),\n logLevel: \"warn\",\n });\n\n const page = await browser.newPage();\n await page.goto(url, { waitUntil: \"load\" });\n\n // Save session so other terminals can connect\n writeSession({\n wsEndpoint: browser.wsEndpoint,\n pid: browser.pid || process.pid,\n });\n\n console.log(`Browser open at ${url}`);\n console.log(`Session saved. Run commands in another terminal:`);\n console.log(` npx cpw screenshot -o shot.png`);\n console.log(` npx cpw eval \"document.title\"`);\n console.log(` npx cpw close`);\n console.log(`\\nPress Ctrl+C to close.`);\n\n await new Promise<void>((resolve) => {\n process.on(\"SIGINT\", () => {\n console.log(\"\\nClosing browser...\");\n resolve();\n });\n process.on(\"SIGTERM\", () => resolve());\n });\n\n clearSession();\n try {\n await browser.close();\n } catch {\n // browser may have already exited\n }\n}\n\nasync function cmdClose() {\n const session = readSession();\n if (!session) {\n console.error(\"No running session.\");\n process.exit(1);\n }\n try {\n const browser = await automaton.connect(session.wsEndpoint);\n await browser.close();\n } catch {\n // kill the process directly if CDP fails\n try {\n process.kill(session.pid, \"SIGTERM\");\n } catch {\n // ignore\n }\n }\n clearSession();\n console.log(\"Session closed.\");\n}\n\nasync function cmdScreenshot(rest: string[]) {\n const pos = positionalArgs(rest);\n const url = pos[0];\n const output = flagValue(rest, \"-o\") || flagValue(rest, \"--output\");\n if (!output) {\n console.error(\"Usage: cpw screenshot [url] -o <file> [--full-page]\");\n process.exit(1);\n }\n const fullPage = hasFlag(rest, \"--full-page\");\n const format = output.endsWith(\".jpeg\") || output.endsWith(\".jpg\") ? \"jpeg\" as const : \"png\" as const;\n\n if (url) {\n // Standalone: launch, screenshot, close\n const headless = resolveHeadless(rest, true);\n await withPage(url, { headless }, async (page) => {\n await page.screenshot({ path: output, format, fullPage });\n });\n } else {\n // Session: connect to running browser\n const { browser, page } = await connectToSession();\n try {\n await page.screenshot({ path: output, format, fullPage });\n } finally {\n await browser.disconnect();\n }\n }\n\n console.log(`Screenshot saved to ${output}`);\n}\n\nasync function cmdHtml(rest: string[]) {\n const pos = positionalArgs(rest);\n const url = pos[0];\n const output = flagValue(rest, \"-o\") || flagValue(rest, \"--output\");\n if (!output) {\n console.error(\"Usage: cpw html [url] -o <file>\");\n process.exit(1);\n }\n\n const writeHtml = async (page: Page) => {\n const html = await page.content();\n fs.writeFileSync(path.resolve(output), html, \"utf-8\");\n };\n\n if (url) {\n const headless = resolveHeadless(rest, true);\n await withPage(url, { headless }, async (page) => {\n await writeHtml(page);\n });\n } else {\n const { browser, page } = await connectToSession();\n try {\n await writeHtml(page);\n } finally {\n await browser.disconnect();\n }\n }\n\n console.log(`HTML saved to ${output}`);\n}\n\nasync function cmdPdf(rest: string[]) {\n const pos = positionalArgs(rest);\n const url = pos[0];\n const output = flagValue(rest, \"-o\") || flagValue(rest, \"--output\");\n if (!output) {\n console.error(\"Usage: cpw pdf [url] -o <file>\");\n process.exit(1);\n }\n\n const renderVisualPdf = async (browser: Browser, page: Page) => {\n // Print a screenshot-backed helper page so the PDF matches what the user sees on screen.\n const screenshot = await page.screenshotBase64({ format: \"png\" });\n const screenshotSize = pngDimensions(Buffer.from(screenshot, \"base64\"));\n const context = await browser.newContext();\n try {\n const helperPage = await context.newPage();\n const imageDataUrl = `data:image/png;base64,${screenshot}`;\n const screenshotDimensions = await helperPage.evaluate<{ width: number; height: number }>((dataUrl) => {\n document.open();\n document.write(`<!doctype html>\n<html>\n <head>\n <meta charset=\"utf-8\">\n <style>\n html, body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n background: #fff;\n }\n img {\n display: block;\n width: 100%;\n height: auto;\n }\n </style>\n </head>\n <body>\n <img id=\"shot\" alt=\"page screenshot\">\n </body>\n</html>`);\n document.close();\n const img = document.getElementById(\"shot\");\n if (!(img instanceof HTMLImageElement)) {\n throw new Error(\"Failed to create PDF preview image\");\n }\n return new Promise<{ width: number; height: number }>((resolve, reject) => {\n img.onload = () => {\n resolve({ width: img.naturalWidth || 0, height: img.naturalHeight || 0 });\n };\n img.onerror = () => reject(new Error(\"Failed to load screenshot image\"));\n img.src = dataUrl;\n });\n }, imageDataUrl);\n\n await helperPage.pdf({\n path: output,\n printBackground: true,\n paperWidth: Math.max((screenshotDimensions?.width ?? screenshotSize.width) / 96, 1),\n paperHeight: Math.max((screenshotDimensions?.height ?? screenshotSize.height) / 96, 1),\n marginTop: 0,\n marginBottom: 0,\n marginLeft: 0,\n marginRight: 0,\n scale: 1,\n preferCSSPageSize: false,\n });\n } finally {\n await context.close();\n }\n };\n\n if (url) {\n await withPage(url, { headless: true, maximize: true }, async (page, browser) => {\n await renderVisualPdf(browser, page);\n });\n } else {\n const { browser, page } = await connectToSession();\n try {\n await renderVisualPdf(browser, page);\n } finally {\n await browser.disconnect();\n }\n }\n\n console.log(`PDF saved to ${output}`);\n}\n\nasync function cmdEval(rest: string[]) {\n const pos = positionalArgs(rest);\n\n // If session exists and only one positional arg, treat it as script (no URL)\n const session = readSession();\n let url: string | undefined;\n let script: string;\n\n if (pos.length >= 2) {\n url = pos[0];\n script = pos[1];\n } else if (pos.length === 1 && session) {\n script = pos[0];\n } else if (pos.length === 1) {\n // No session, treat as error — need URL\n console.error(\"Usage: cpw eval <url> <script>\\n cpw eval <script> (when a session is running)\");\n process.exit(1);\n return; // unreachable but satisfies TS\n } else {\n console.error(\"Usage: cpw eval [url] <script>\");\n process.exit(1);\n return;\n }\n\n if (url) {\n const headless = resolveHeadless(rest, true);\n await withPage(url, { headless }, async (page) => {\n const result = await page.evaluate(script);\n const output = result === undefined ? \"undefined\" : JSON.stringify(result, null, 2);\n console.log(output);\n });\n } else {\n const { browser, page } = await connectToSession();\n try {\n const result = await page.evaluate(script);\n const output = result === undefined ? \"undefined\" : JSON.stringify(result, null, 2);\n console.log(output);\n } finally {\n await browser.disconnect();\n }\n }\n}\n\nasync function cmdVersion() {\n const pkgPath = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"../package.json\");\n let version = \"unknown\";\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, \"utf-8\"));\n version = pkg.version;\n } catch {\n // fallback\n }\n\n console.log(`cdpwright v${version}`);\n console.log(`Pinned revision: ${PINNED_REVISION}`);\n\n const platform = detectPlatform();\n const cacheRoot = defaultCacheRoot(platform);\n const revision = resolveRevision(process.env.CDPWRIGHT_REVISION);\n const execPath = path.join(cacheRoot, platform, revision, chromiumExecutableRelativePath(platform));\n\n if (fs.existsSync(execPath)) {\n try {\n const ver = await chromiumVersion(execPath);\n console.log(`Chromium: ${ver}`);\n } catch {\n console.log(`Chromium: installed at ${execPath}`);\n }\n } else {\n console.log(\"Chromium: not installed (run 'cpw install')\");\n }\n\n const session = readSession();\n if (session) {\n console.log(`Session: active (pid ${session.pid})`);\n }\n}\n\n// --- Main ---\n\nasync function main() {\n const [, , command, ...rest] = process.argv;\n\n if (!command || command === \"--help\" || command === \"-h\") {\n printHelp();\n process.exit(0);\n }\n\n switch (command) {\n case \"download\":\n case \"install\":\n return cmdDownload(rest);\n case \"open\":\n return cmdOpen(rest);\n case \"close\":\n return cmdClose();\n case \"screenshot\":\n return cmdScreenshot(rest);\n case \"html\":\n return cmdHtml(rest);\n case \"pdf\":\n return cmdPdf(rest);\n case \"eval\":\n return cmdEval(rest);\n case \"version\":\n case \"--version\":\n case \"-v\":\n return cmdVersion();\n default:\n console.error(`Unknown command: ${command}`);\n printHelp();\n process.exit(1);\n }\n}\n\nmain().catch((err) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n","import fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport http from \"http\";\nimport { spawn } from \"child_process\";\nimport { Logger, LogLevel } from \"../logging/Logger.js\";\nimport { AutomationEvents } from \"../core/Events.js\";\nimport { Connection } from \"../cdp/Connection.js\";\nimport { Browser } from \"../core/Browser.js\";\nimport { detectPlatform, defaultCacheRoot, ensureDownloaded, fetchLatestRevision, Platform, chromiumVersion } from \"./Downloader.js\";\nimport { resolveRevision } from \"./Revision.js\";\n\nexport type LaunchOptions = {\n headless?: boolean;\n args?: string[];\n timeoutMs?: number;\n logLevel?: LogLevel;\n logEvents?: boolean;\n logActions?: boolean;\n logAssertions?: boolean;\n executablePath?: string;\n userDataDir?: string;\n maximize?: boolean;\n};\n\nexport type DownloadOptions = {\n latest?: boolean;\n};\n\nexport type ResolvedDownload = {\n cacheRoot: string;\n platform: Platform;\n revision: string;\n executablePath: string;\n revisionDir: string;\n chromiumVersion?: string;\n};\n\nexport class ChromiumManager {\n private logger: Logger;\n\n constructor(logger?: Logger) {\n const envLevel = (process.env.CDPWRIGHT_LOG_LEVEL as LogLevel | undefined) ?? \"info\";\n this.logger = logger ?? new Logger(envLevel);\n }\n\n getLogger() {\n return this.logger;\n }\n\n async download(options: DownloadOptions = {}): Promise<ResolvedDownload> {\n const platform = detectPlatform();\n const cacheRoot = this.resolveCacheRoot(platform);\n const overrideExecutable = process.env.CDPWRIGHT_EXECUTABLE_PATH;\n let revision = options.latest ? await fetchLatestRevision(platform) : resolveRevision(process.env.CDPWRIGHT_REVISION);\n let executablePath: string;\n let revisionDir = \"\";\n if (overrideExecutable) {\n executablePath = path.resolve(overrideExecutable);\n } else {\n const downloaded = await ensureDownloaded({\n cacheRoot,\n platform,\n revision,\n logger: this.logger\n });\n executablePath = downloaded.executablePath;\n revisionDir = downloaded.revisionDir;\n }\n\n if (!fs.existsSync(executablePath)) {\n throw new Error(`Chromium executable not found: ${executablePath}`);\n }\n\n const version = await chromiumVersion(executablePath);\n\n this.logger.info(\"Chromium cache root\", cacheRoot);\n this.logger.info(\"Platform\", platform);\n this.logger.info(\"Revision\", revision);\n this.logger.info(\"Chromium version\", version);\n\n return {\n cacheRoot,\n platform,\n revision,\n executablePath,\n revisionDir,\n chromiumVersion: version\n };\n }\n\n async launch(options: LaunchOptions = {}) {\n const logger = this.logger;\n if (options.logLevel) {\n logger.setLevel(options.logLevel);\n }\n\n const executablePath = options.executablePath || process.env.CDPWRIGHT_EXECUTABLE_PATH;\n let resolvedExecutable = executablePath;\n if (!resolvedExecutable) {\n const platform = detectPlatform();\n const cacheRoot = this.resolveCacheRoot(platform);\n const revision = resolveRevision(process.env.CDPWRIGHT_REVISION);\n const downloaded = await ensureDownloaded({\n cacheRoot,\n platform,\n revision,\n logger\n });\n resolvedExecutable = downloaded.executablePath;\n }\n\n if (!resolvedExecutable || !fs.existsSync(resolvedExecutable)) {\n throw new Error(`Chromium executable not found: ${resolvedExecutable}`);\n }\n const stats = fs.statSync(resolvedExecutable);\n if (!stats.isFile()) {\n throw new Error(`Chromium executable is not a file: ${resolvedExecutable}`);\n }\n ensureExecutable(resolvedExecutable);\n\n const cleanupTasks: Array<() => void> = [];\n let userDataDir = options.userDataDir ?? process.env.CDPWRIGHT_USER_DATA_DIR;\n if (!userDataDir) {\n userDataDir = fs.mkdtempSync(path.join(os.tmpdir(), \"cdpwright-\"));\n cleanupTasks.push(() => fs.rmSync(userDataDir as string, { recursive: true, force: true }));\n }\n\n const args = [\n \"--remote-debugging-port=0\",\n \"--no-first-run\",\n \"--no-default-browser-check\",\n \"--disable-background-networking\",\n \"--disable-background-timer-throttling\",\n \"--disable-backgrounding-occluded-windows\",\n \"--disable-renderer-backgrounding\"\n ];\n if (userDataDir) {\n args.push(`--user-data-dir=${userDataDir}`);\n }\n if (process.platform === \"linux\") {\n args.push(\"--disable-crash-reporter\", \"--disable-crashpad\");\n }\n if (options.headless ?? true) {\n args.push(\"--headless=new\");\n }\n if (options.maximize) {\n args.push(\"--start-maximized\");\n args.push(\"--window-size=1920,1080\");\n }\n if (options.args) {\n args.push(...options.args);\n }\n\n logger.info(\"Launching Chromium\", resolvedExecutable);\n const child = spawn(resolvedExecutable, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n\n const websocketUrl = await waitForWebSocketEndpoint(child, logger, options.timeoutMs ?? 30_000);\n const httpUrl = toHttpVersionUrl(websocketUrl);\n const wsEndpoint = await fetchWebSocketDebuggerUrl(httpUrl);\n\n const connection = new Connection(wsEndpoint, logger);\n await closeInitialPages(connection, logger);\n const events = new AutomationEvents();\n const logEvents = resolveLogFlag(options.logEvents, process.env.CDPWRIGHT_LOG, true);\n const logActions = resolveLogFlag(options.logActions, process.env.CDPWRIGHT_LOG_ACTIONS, true);\n const logAssertions = resolveLogFlag(options.logAssertions, process.env.CDPWRIGHT_LOG_ASSERTIONS, true);\n if (logEvents && logActions) {\n events.on(\"action:end\", (payload) => {\n const selector = payload.sensitive ? undefined : payload.selector;\n const args = buildLogArgs(selector, payload.durationMs);\n logger.info(`Action ${payload.name}`, ...args);\n });\n }\n if (logEvents && logAssertions) {\n events.on(\"assertion:end\", (payload) => {\n const args = buildLogArgs(payload.selector, payload.durationMs);\n logger.info(`Assertion ${payload.name}`, ...args);\n });\n }\n const browser = new Browser(connection, child, logger, events, cleanupTasks, wsEndpoint);\n\n return browser;\n }\n\n private resolveCacheRoot(platform: Platform) {\n const envRoot = process.env.CDPWRIGHT_CACHE_DIR;\n if (envRoot && envRoot.trim()) {\n return path.resolve(envRoot.trim());\n }\n return defaultCacheRoot(platform);\n }\n}\n\nasync function closeInitialPages(connection: Connection, logger: Logger) {\n try {\n const targets = await connection.send<{ targetInfos: Array<{ targetId: string; type: string }> }>(\"Target.getTargets\");\n for (const info of targets.targetInfos) {\n if (info.type === \"page\") {\n await connection.send(\"Target.closeTarget\", { targetId: info.targetId });\n }\n }\n } catch (err) {\n logger.warn(\"Failed to close initial pages\", err);\n }\n}\n\nfunction resolveLogFlag(explicit: boolean | undefined, envValue: string | undefined, defaultValue: boolean) {\n if (explicit !== undefined) {\n return explicit;\n }\n if (envValue == null) {\n return defaultValue;\n }\n const normalized = envValue.trim().toLowerCase();\n return ![\"0\", \"false\", \"no\", \"off\"].includes(normalized);\n}\n\nfunction buildLogArgs(selector?: string, durationMs?: number) {\n const args: string[] = [];\n if (selector) {\n args.push(selector);\n }\n if (typeof durationMs === \"number\") {\n args.push(`${durationMs}ms`);\n }\n return args;\n}\n\nfunction ensureExecutable(executablePath: string) {\n if (process.platform === \"win32\") {\n return;\n }\n try {\n const stat = fs.statSync(executablePath);\n const isExecutable = (stat.mode & 0o111) !== 0;\n if (!isExecutable) {\n fs.chmodSync(executablePath, 0o755);\n }\n } catch {\n // ignore chmod errors\n }\n\n const dir = path.dirname(executablePath);\n const helpers = [\n \"chrome_crashpad_handler\",\n \"chrome_sandbox\",\n \"chrome-wrapper\",\n \"xdg-mime\",\n \"xdg-settings\"\n ];\n for (const name of helpers) {\n const helperPath = path.join(dir, name);\n if (!fs.existsSync(helperPath)) {\n continue;\n }\n try {\n const stat = fs.statSync(helperPath);\n const isExecutable = (stat.mode & 0o111) !== 0;\n if (!isExecutable) {\n fs.chmodSync(helperPath, 0o755);\n }\n } catch {\n // ignore chmod errors\n }\n }\n}\n\nfunction waitForWebSocketEndpoint(child: ReturnType<typeof spawn>, logger: Logger, timeoutMs: number): Promise<string> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n const timeout = setTimeout(() => {\n reject(new Error(\"Timed out waiting for DevTools endpoint\"));\n }, timeoutMs);\n\n const outputLines: string[] = [];\n const pushOutput = (data: Buffer) => {\n const text = data.toString();\n for (const line of text.split(/\\r?\\n/)) {\n if (!line.trim()) continue;\n outputLines.push(line);\n if (outputLines.length > 50) {\n outputLines.shift();\n }\n }\n };\n\n const onData = (data: Buffer) => {\n const text = data.toString();\n const match = text.match(/DevTools listening on (ws:\\/\\/[^\\s]+)/);\n if (match) {\n clearTimeout(timeout);\n cleanup();\n logger.info(\"DevTools endpoint\", match[1]);\n resolve(match[1]);\n }\n pushOutput(data);\n };\n\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n cleanup();\n const tail = outputLines.length ? `\\nChromium output:\\n${outputLines.join(\"\\n\")}` : \"\";\n reject(new Error(`Chromium exited early with code ${code ?? \"null\"} signal ${signal ?? \"null\"}${tail}`));\n };\n\n const cleanup = () => {\n child.stdout?.off(\"data\", onData);\n child.stderr?.off(\"data\", onData);\n child.off(\"exit\", onExit);\n };\n\n child.stdout?.on(\"data\", onData);\n child.stderr?.on(\"data\", onData);\n child.on(\"exit\", onExit);\n\n if (Date.now() - start > timeoutMs) {\n cleanup();\n }\n });\n}\n\nfunction toHttpVersionUrl(wsUrl: string) {\n try {\n const url = new URL(wsUrl);\n const port = url.port || \"9222\";\n return `http://127.0.0.1:${port}/json/version`;\n } catch {\n throw new Error(`Invalid DevTools endpoint: ${wsUrl}`);\n }\n}\n\nfunction fetchWebSocketDebuggerUrl(versionUrl: string): Promise<string> {\n return new Promise((resolve, reject) => {\n http.get(versionUrl, (res) => {\n if (res.statusCode && res.statusCode >= 400) {\n reject(new Error(`Failed to fetch /json/version: ${res.statusCode}`));\n return;\n }\n let data = \"\";\n res.on(\"data\", (chunk) => (data += chunk.toString()));\n res.on(\"end\", () => {\n try {\n const parsed = JSON.parse(data);\n if (!parsed.webSocketDebuggerUrl) {\n reject(new Error(\"webSocketDebuggerUrl missing\"));\n return;\n }\n resolve(parsed.webSocketDebuggerUrl);\n } catch (err) {\n reject(err);\n }\n });\n }).on(\"error\", reject);\n });\n}\n","export type LogLevel = \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4\n};\n\nconst REDACT_KEYS = [\"password\", \"token\", \"secret\", \"authorization\", \"cookie\"];\n\nfunction redactValue(value: unknown): string {\n if (typeof value === \"string\") {\n try {\n const url = new URL(value);\n if (url.search) {\n url.search = \"?redacted\";\n }\n return url.toString();\n } catch {\n return value;\n }\n }\n if (value && typeof value === \"object\") {\n return JSON.stringify(value, (key, val) => {\n if (REDACT_KEYS.some((k) => key.toLowerCase().includes(k))) {\n return \"[redacted]\";\n }\n return val;\n });\n }\n return String(value);\n}\n\nexport class Logger {\n private level: LogLevel;\n\n constructor(level: LogLevel = \"info\") {\n this.level = level;\n }\n\n setLevel(level: LogLevel) {\n this.level = level;\n }\n\n error(message: string, ...args: unknown[]) {\n this.log(\"error\", message, ...args);\n }\n\n warn(message: string, ...args: unknown[]) {\n this.log(\"warn\", message, ...args);\n }\n\n info(message: string, ...args: unknown[]) {\n this.log(\"info\", message, ...args);\n }\n\n debug(message: string, ...args: unknown[]) {\n this.log(\"debug\", message, ...args);\n }\n\n trace(message: string, ...args: unknown[]) {\n this.log(\"trace\", message, ...args);\n }\n\n log(level: LogLevel, message: string, ...args: unknown[]) {\n if (LEVEL_ORDER[level] > LEVEL_ORDER[this.level]) {\n return;\n }\n const time = new Date().toISOString();\n const suffix = args.length ? \" \" + args.map(redactValue).join(\" \") : \"\";\n const line = `[${time}] [${level}] ${message}${suffix}`;\n if (level === \"error\") {\n console.error(line);\n } else if (level === \"warn\") {\n console.warn(line);\n } else {\n console.log(line);\n }\n }\n}\n","import { EventEmitter } from \"events\";\n\nexport type ActionEvent = {\n name: string;\n selector?: string;\n frameId?: string;\n durationMs?: number;\n sensitive?: boolean;\n status?: \"passed\" | \"failed\";\n};\n\nexport type AssertionEvent = {\n name: string;\n selector?: string;\n frameId?: string;\n durationMs?: number;\n status?: \"passed\" | \"failed\";\n};\n\nexport type AutomationEventMap = {\n \"action:start\": ActionEvent;\n \"action:end\": ActionEvent;\n \"assertion:start\": AssertionEvent;\n \"assertion:end\": AssertionEvent;\n};\n\nexport class AutomationEvents {\n private emitter = new EventEmitter();\n\n on<K extends keyof AutomationEventMap>(event: K, handler: (payload: AutomationEventMap[K]) => void) {\n this.emitter.on(event, handler);\n }\n\n off<K extends keyof AutomationEventMap>(event: K, handler: (payload: AutomationEventMap[K]) => void) {\n this.emitter.off(event, handler);\n }\n\n emit<K extends keyof AutomationEventMap>(event: K, payload: AutomationEventMap[K]) {\n this.emitter.emit(event, payload);\n }\n}\n","import WebSocket from \"ws\";\nimport { EventEmitter } from \"events\";\nimport { Logger } from \"../logging/Logger.js\";\nimport { Session } from \"./Session.js\";\n\nexport type CDPResponse = {\n id: number;\n result?: unknown;\n error?: { message: string; data?: unknown };\n sessionId?: string;\n};\n\nexport type CDPEvent = {\n method: string;\n params?: unknown;\n sessionId?: string;\n};\n\nexport class Connection {\n private ws: WebSocket;\n private id = 0;\n private callbacks = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void; method: string; start: number }>();\n private sessions = new Map<string, Session>();\n private emitter = new EventEmitter();\n private logger: Logger;\n private closed = false;\n\n constructor(url: string, logger: Logger) {\n this.logger = logger;\n this.ws = new WebSocket(url);\n this.ws.on(\"message\", (data: WebSocket.RawData) => this.onMessage(data.toString()));\n this.ws.on(\"error\", (err: Error) => this.onError(err));\n this.ws.on(\"close\", (code: number, reason: Buffer) => this.onClose(code, reason));\n }\n\n async waitForOpen() {\n if (this.ws.readyState === WebSocket.OPEN) {\n return;\n }\n if (this.ws.readyState === WebSocket.CLOSED) {\n throw new Error(\"CDP socket is closed\");\n }\n await new Promise<void>((resolve, reject) => {\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (err: Error) => {\n cleanup();\n reject(err);\n };\n const onClose = () => {\n cleanup();\n reject(new Error(\"CDP socket closed before opening\"));\n };\n const cleanup = () => {\n this.ws.off(\"open\", onOpen);\n this.ws.off(\"error\", onError);\n this.ws.off(\"close\", onClose);\n };\n this.ws.on(\"open\", onOpen);\n this.ws.on(\"error\", onError);\n this.ws.on(\"close\", onClose);\n });\n }\n\n createSession(sessionId: string): Session {\n const session = new Session(this, sessionId);\n this.sessions.set(sessionId, session);\n return session;\n }\n\n removeSession(sessionId: string) {\n this.sessions.delete(sessionId);\n }\n\n on(event: string, handler: (params: unknown) => void) {\n this.emitter.on(event, handler);\n }\n\n async send<T = unknown>(method: string, params: Record<string, unknown> = {}, sessionId?: string): Promise<T> {\n await this.waitForOpen();\n const id = ++this.id;\n const payload = sessionId ? { id, method, params, sessionId } : { id, method, params };\n const start = Date.now();\n const promise = new Promise<T>((resolve, reject) => {\n this.callbacks.set(id, { resolve: resolve as (value: unknown) => void, reject, method, start });\n });\n if (this.logger) {\n this.logger.trace(\"CDP send\", method);\n }\n this.ws.send(JSON.stringify(payload));\n return promise;\n }\n\n async close() {\n if (this.ws.readyState === WebSocket.CLOSED) {\n return;\n }\n await new Promise<void>((resolve) => {\n this.ws.once(\"close\", () => resolve());\n if (this.ws.readyState === WebSocket.CLOSING) {\n return;\n }\n this.ws.close();\n });\n }\n\n private onError(err: unknown) {\n this.logger.error(\"CDP socket error\", err);\n }\n\n private onClose(code: number, reason: Buffer) {\n if (this.closed) {\n return;\n }\n this.closed = true;\n const reasonText = reason.toString() || \"no reason\";\n this.failPending(new Error(`CDP socket closed (${code}): ${reasonText}`));\n this.sessions.clear();\n }\n\n private failPending(error: Error) {\n if (this.callbacks.size === 0) {\n return;\n }\n for (const [, callback] of this.callbacks) {\n callback.reject(error);\n }\n this.callbacks.clear();\n }\n\n private onMessage(message: string) {\n let parsed: CDPResponse & CDPEvent;\n try {\n parsed = JSON.parse(message) as CDPResponse & CDPEvent;\n } catch (err) {\n this.logger.warn(\"Failed to parse CDP message\", err);\n return;\n }\n if (typeof parsed.id === \"number\") {\n const callback = this.callbacks.get(parsed.id);\n if (!callback) {\n return;\n }\n this.callbacks.delete(parsed.id);\n const duration = Date.now() - callback.start;\n this.logger.debug(\"CDP recv\", callback.method, `${duration}ms`);\n if (parsed.error) {\n callback.reject(new Error(parsed.error.message));\n } else {\n callback.resolve(parsed.result);\n }\n return;\n }\n\n if (parsed.sessionId) {\n const session = this.sessions.get(parsed.sessionId);\n if (session) {\n session.dispatch(parsed.method, parsed.params);\n }\n return;\n }\n\n if (parsed.method) {\n this.emitter.emit(parsed.method, parsed.params);\n }\n }\n}\n","import { EventEmitter } from \"events\";\nimport { Connection } from \"./Connection.js\";\n\nexport class Session {\n private connection: Connection;\n private sessionId: string;\n private emitter = new EventEmitter();\n\n constructor(connection: Connection, sessionId: string) {\n this.connection = connection;\n this.sessionId = sessionId;\n }\n\n on(event: string, handler: (params: unknown) => void) {\n this.emitter.on(event, handler);\n }\n\n once(event: string, handler: (params: unknown) => void) {\n this.emitter.once(event, handler);\n }\n\n async send<T = unknown>(method: string, params: Record<string, unknown> = {}): Promise<T> {\n return this.connection.send<T>(method, params, this.sessionId);\n }\n\n dispatch(method: string, params: unknown) {\n this.emitter.emit(method, params);\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { Session } from \"../cdp/Session.js\";\nimport { Logger } from \"../logging/Logger.js\";\nimport { AutomationEvents } from \"./Events.js\";\nimport { Frame } from \"./Frame.js\";\nimport { ensureAllowedUrl } from \"./UrlGuard.js\";\nimport { waitFor } from \"./Waiter.js\";\n\nexport type GotoOptions = {\n waitUntil?: \"domcontentloaded\" | \"load\";\n timeoutMs?: number;\n allowFileUrl?: boolean;\n};\n\nexport type ScreenshotOptions = {\n path?: string;\n format?: \"png\" | \"jpeg\";\n quality?: number;\n fullPage?: boolean;\n};\n\nexport type PdfOptions = {\n path?: string;\n landscape?: boolean;\n printBackground?: boolean;\n scale?: number;\n paperWidth?: number;\n paperHeight?: number;\n marginTop?: number;\n marginBottom?: number;\n marginLeft?: number;\n marginRight?: number;\n pageRanges?: string;\n preferCSSPageSize?: boolean;\n};\n\nfunction assertPdfBuffer(buffer: Buffer) {\n if (buffer.length < 5 || buffer.subarray(0, 5).toString(\"utf-8\") !== \"%PDF-\") {\n throw new Error(\"PDF generation failed: Chromium did not return a valid PDF\");\n }\n}\n\nexport class Page {\n private session: Session;\n private logger: Logger;\n private events: AutomationEvents;\n private framesById = new Map<string, Frame>();\n private mainFrameId?: string;\n private lifecycleEvents = new Map<string, Set<string>>();\n private defaultTimeout = 30_000;\n\n constructor(session: Session, logger: Logger, events: AutomationEvents) {\n this.session = session;\n this.logger = logger;\n this.events = events;\n }\n\n async initialize() {\n await this.session.send(\"Page.enable\");\n await this.session.send(\"DOM.enable\");\n await this.session.send(\"Runtime.enable\");\n await this.session.send(\"Network.enable\");\n await this.session.send(\"Page.setLifecycleEventsEnabled\", { enabled: true });\n\n this.session.on(\"Page.frameAttached\", (params) => this.onFrameAttached(params as any));\n this.session.on(\"Page.frameNavigated\", (params) => this.onFrameNavigated(params as any));\n this.session.on(\"Page.frameDetached\", (params) => this.onFrameDetached(params as any));\n this.session.on(\"Runtime.executionContextCreated\", (params) => this.onExecutionContextCreated(params as any));\n this.session.on(\"Runtime.executionContextDestroyed\", (params) => this.onExecutionContextDestroyed(params as any));\n this.session.on(\"Runtime.executionContextsCleared\", () => this.onExecutionContextsCleared());\n this.session.on(\"Page.lifecycleEvent\", (params) => this.onLifecycleEvent(params as any));\n\n const tree = await this.session.send<{ frameTree: { frame: { id: string; name?: string; url?: string; parentId?: string }; childFrames?: any[] } }>(\"Page.getFrameTree\");\n this.buildFrameTree(tree.frameTree);\n }\n\n frames() {\n return Array.from(this.framesById.values());\n }\n\n mainFrame() {\n if (!this.mainFrameId) {\n throw new Error(\"Main frame not initialized\");\n }\n const frame = this.framesById.get(this.mainFrameId);\n if (!frame) {\n throw new Error(\"Main frame missing\");\n }\n return frame;\n }\n\n frame(options: { name?: string; urlIncludes?: string; predicate?: (frame: Frame) => boolean }) {\n for (const frame of this.framesById.values()) {\n if (options.name && frame.name !== options.name) continue;\n if (options.urlIncludes && !frame.url?.includes(options.urlIncludes)) continue;\n if (options.predicate && !options.predicate(frame)) continue;\n return frame;\n }\n return null;\n }\n\n locator(selector: string) {\n return this.mainFrame().locator(selector);\n }\n\n getByText(text: string | RegExp, options: { exact?: boolean; timeoutMs?: number } = {}) {\n return this.mainFrame().getByText(text, options);\n }\n\n getByRole(role: string, options: { name?: string | RegExp; exact?: boolean; includeHidden?: boolean; timeoutMs?: number } = {}) {\n return this.mainFrame().getByRole(role, options);\n }\n\n async goto(url: string, options: GotoOptions = {}) {\n ensureAllowedUrl(url, { allowFileUrl: options.allowFileUrl });\n const waitUntil = options.waitUntil ?? \"load\";\n const lifecycleName = waitUntil === \"domcontentloaded\" ? \"DOMContentLoaded\" : waitUntil === \"load\" ? \"load\" : null;\n if (!lifecycleName) {\n throw new Error(`Invalid waitUntil \"${waitUntil}\". Use \"load\" or \"domcontentloaded\".`);\n }\n const timeoutMs = options.timeoutMs ?? this.defaultTimeout;\n\n this.events.emit(\"action:start\", { name: \"goto\", selector: url, frameId: this.mainFrameId });\n const start = Date.now();\n // Clear any stale lifecycle state from prior navigations before issuing a new navigate.\n this.lifecycleEvents.clear();\n const navigation = await this.session.send<{ errorText?: string }>(\"Page.navigate\", { url });\n if (navigation?.errorText) {\n throw new Error(`Navigation failed: ${navigation.errorText}`);\n }\n await this.waitForLifecycle(this.mainFrameId, lifecycleName, timeoutMs);\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"goto\", selector: url, frameId: this.mainFrameId, durationMs: duration });\n this.logger.debug(\"Goto\", url, `${duration}ms`);\n }\n\n async query(selector: string) {\n return this.mainFrame().query(selector);\n }\n\n async queryAll(selector: string) {\n return this.mainFrame().queryAll(selector);\n }\n\n async queryXPath(selector: string) {\n return this.mainFrame().queryXPath(selector);\n }\n\n async queryAllXPath(selector: string) {\n return this.mainFrame().queryAllXPath(selector);\n }\n\n async click(selector: string, options?: { timeoutMs?: number }) {\n return this.mainFrame().click(selector, options);\n }\n\n async dblclick(selector: string, options?: { timeoutMs?: number }) {\n return this.mainFrame().dblclick(selector, options);\n }\n\n async type(selector: string, text: string, options?: { timeoutMs?: number }) {\n return this.mainFrame().type(selector, text, options);\n }\n\n async typeSecure(selector: string, text: string, options?: { timeoutMs?: number }) {\n return this.mainFrame().typeSecure(selector, text, options);\n }\n\n async fillInput(selector: string, value: string, options: { timeoutMs?: number } = {}) {\n return this.mainFrame().fillInput(selector, value, options);\n }\n\n async evaluate<T = unknown>(fnOrString: string | ((...args: any[]) => any), ...args: any[]): Promise<T> {\n return this.mainFrame().evaluate(fnOrString, ...args);\n }\n\n async textSecure(selector: string) {\n return this.mainFrame().textSecure(selector);\n }\n\n async valueSecure(selector: string) {\n return this.mainFrame().valueSecure(selector);\n }\n\n async selectOption(selector: string, value: string) {\n return this.mainFrame().selectOption(selector, value);\n }\n\n async setFileInput(selector: string, name: string, contents: string, options: { mimeType?: string } = {}) {\n return this.mainFrame().setFileInput(selector, name, contents, options);\n }\n\n async findLocators(options: { highlight?: boolean } = {}) {\n return this.mainFrame().findLocators(options);\n }\n\n async content(): Promise<string> {\n await this.waitForLoad();\n return this.mainFrame().evaluate<string>(() => {\n const doctype = document.doctype;\n const doctypeText = doctype\n ? `<!DOCTYPE ${doctype.name}${doctype.publicId ? ` PUBLIC \"${doctype.publicId}\"` : \"\"}${doctype.systemId ? ` \"${doctype.systemId}\"` : \"\"}>`\n : \"<!doctype html>\";\n return `${doctypeText}\\n${document.documentElement.outerHTML}`;\n });\n }\n\n async screenshot(options: ScreenshotOptions = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"screenshot\", frameId: this.mainFrameId });\n await this.waitForLoad();\n const result = await this.session.send<{ data: string }>(\"Page.captureScreenshot\", {\n format: options.format ?? \"png\",\n quality: options.quality,\n fromSurface: true,\n captureBeyondViewport: options.fullPage ?? false\n });\n const buffer = Buffer.from(result.data, \"base64\");\n if (options.path) {\n const resolved = path.resolve(options.path);\n fs.writeFileSync(resolved, buffer);\n }\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"screenshot\", frameId: this.mainFrameId, durationMs: duration });\n return buffer;\n }\n\n async screenshotBase64(options: Omit<ScreenshotOptions, \"path\"> = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"screenshotBase64\", frameId: this.mainFrameId });\n await this.waitForLoad();\n const result = await this.session.send<{ data: string }>(\"Page.captureScreenshot\", {\n format: options.format ?? \"png\",\n quality: options.quality,\n fromSurface: true,\n captureBeyondViewport: options.fullPage ?? false\n });\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"screenshotBase64\", frameId: this.mainFrameId, durationMs: duration });\n return result.data;\n }\n\n async pdf(options: PdfOptions = {}): Promise<Buffer> {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"pdf\", frameId: this.mainFrameId });\n await this.waitForLoad();\n await this.session.send(\"Emulation.setEmulatedMedia\", { media: \"screen\" });\n let buffer: Buffer;\n try {\n const result = await this.session.send<{ data: string }>(\"Page.printToPDF\", {\n landscape: options.landscape ?? false,\n printBackground: options.printBackground ?? true,\n scale: options.scale,\n paperWidth: options.paperWidth,\n paperHeight: options.paperHeight,\n marginTop: options.marginTop,\n marginBottom: options.marginBottom,\n marginLeft: options.marginLeft,\n marginRight: options.marginRight,\n pageRanges: options.pageRanges,\n preferCSSPageSize: options.preferCSSPageSize,\n });\n buffer = Buffer.from(result.data, \"base64\");\n assertPdfBuffer(buffer);\n if (options.path) {\n const resolved = path.resolve(options.path);\n fs.writeFileSync(resolved, buffer);\n }\n } finally {\n try {\n await this.session.send(\"Emulation.setEmulatedMedia\", { media: \"\" });\n } catch {\n // ignore reset failures\n }\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"pdf\", frameId: this.mainFrameId, durationMs: duration });\n }\n return buffer!;\n }\n\n getEvents() {\n return this.events;\n }\n\n getDefaultTimeout() {\n return this.defaultTimeout;\n }\n\n async waitForLoad(timeoutMs: number = this.defaultTimeout) {\n const frame = this.mainFrame();\n await waitFor(async () => {\n const readyState = await frame.evaluate<string>(\"document.readyState\");\n return readyState === \"complete\";\n }, { timeoutMs, description: \"page load\" });\n }\n\n private buildFrameTree(tree: { frame: { id: string; name?: string; url?: string; parentId?: string }; childFrames?: any[] }) {\n const frame = this.ensureFrame(tree.frame.id);\n frame.setMeta({ name: tree.frame.name, url: tree.frame.url, parentId: tree.frame.parentId });\n if (!tree.frame.parentId) {\n this.mainFrameId = tree.frame.id;\n }\n if (tree.childFrames) {\n for (const child of tree.childFrames) {\n this.buildFrameTree(child);\n }\n }\n }\n\n private ensureFrame(id: string) {\n let frame = this.framesById.get(id);\n if (!frame) {\n frame = new Frame(id, this.session, this.logger, this.events);\n this.framesById.set(id, frame);\n }\n return frame;\n }\n\n private onFrameAttached(params: { frameId: string; parentFrameId?: string }) {\n const frame = this.ensureFrame(params.frameId);\n frame.setMeta({ parentId: params.parentFrameId });\n }\n\n private onFrameNavigated(params: { frame: { id: string; name?: string; url?: string; parentId?: string } }) {\n const frame = this.ensureFrame(params.frame.id);\n frame.setMeta({ name: params.frame.name, url: params.frame.url, parentId: params.frame.parentId });\n if (!params.frame.parentId) {\n this.mainFrameId = params.frame.id;\n }\n }\n\n private onFrameDetached(params: { frameId: string }) {\n this.framesById.delete(params.frameId);\n }\n\n private onExecutionContextCreated(params: { context: { id: number; auxData?: { frameId?: string } } }) {\n const frameId = params.context.auxData?.frameId;\n if (!frameId) {\n return;\n }\n const frame = this.ensureFrame(frameId);\n frame.setExecutionContext(params.context.id);\n }\n\n private onExecutionContextDestroyed(params: { executionContextId: number }) {\n for (const frame of this.framesById.values()) {\n if (frame.getExecutionContext() === params.executionContextId) {\n frame.setExecutionContext(undefined);\n }\n }\n }\n\n private onExecutionContextsCleared() {\n for (const frame of this.framesById.values()) {\n frame.setExecutionContext(undefined);\n }\n }\n\n private onLifecycleEvent(params: { frameId: string; name: string }) {\n if (!this.lifecycleEvents.has(params.frameId)) {\n this.lifecycleEvents.set(params.frameId, new Set());\n }\n this.lifecycleEvents.get(params.frameId)!.add(params.name);\n }\n\n private async waitForLifecycle(frameId: string | undefined, eventName: string, timeoutMs: number) {\n if (!frameId) {\n throw new Error(\"Missing frame id for lifecycle wait\");\n }\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n const events = this.lifecycleEvents.get(frameId);\n if (events && events.has(eventName)) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n throw new Error(`Timeout waiting for lifecycle event: ${eventName}`);\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport { Session } from \"../cdp/Session.js\";\nimport { Logger } from \"../logging/Logger.js\";\nimport { AutomationEvents } from \"./Events.js\";\nimport { waitFor } from \"./Waiter.js\";\nimport { parseSelector } from \"./Selectors.js\";\nimport { serializeShadowDomHelpers } from \"./ShadowDom.js\";\nimport { Locator } from \"./Locator.js\";\nimport type { LocatorQuery } from \"./Locator.js\";\n\nexport type FrameSelectorOptions = {\n pierceShadowDom?: boolean;\n timeoutMs?: number;\n};\n\nexport type TextLocatorOptions = {\n exact?: boolean;\n timeoutMs?: number;\n};\n\nexport type RoleLocatorOptions = {\n name?: string | RegExp;\n exact?: boolean;\n includeHidden?: boolean;\n timeoutMs?: number;\n};\n\nexport type ClickOptions = {\n timeoutMs?: number;\n};\n\nexport type TypeOptions = {\n timeoutMs?: number;\n sensitive?: boolean;\n};\n\nexport type QueryResult = {\n objectId: string;\n contextId: number;\n};\n\ntype ElementBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n visible: boolean;\n};\n\nexport class Frame {\n readonly id: string;\n name?: string;\n url?: string;\n parentId?: string;\n private session: Session;\n private logger: Logger;\n private events: AutomationEvents;\n private contextId?: number;\n private defaultTimeout = 30_000;\n\n constructor(id: string, session: Session, logger: Logger, events: AutomationEvents) {\n this.id = id;\n this.session = session;\n this.logger = logger;\n this.events = events;\n }\n\n setExecutionContext(contextId?: number) {\n this.contextId = contextId;\n }\n\n getExecutionContext() {\n return this.contextId;\n }\n\n setMeta(meta: { name?: string; url?: string; parentId?: string }) {\n this.name = meta.name;\n this.url = meta.url;\n this.parentId = meta.parentId;\n }\n\n getEvents() {\n return this.events;\n }\n\n async evaluate<T = unknown>(fnOrString: string | ((...args: any[]) => any), ...args: any[]): Promise<T> {\n return this.evaluateInContext(fnOrString, args);\n }\n\n async query(selector: string, options: FrameSelectorOptions = {}): Promise<QueryResult | null> {\n return this.querySelectorInternal(selector, options, false);\n }\n\n async queryAll(selector: string, options: FrameSelectorOptions = {}): Promise<QueryResult[]> {\n return this.querySelectorAllInternal(selector, options, false);\n }\n\n async queryXPath(selector: string, options: FrameSelectorOptions = {}): Promise<QueryResult | null> {\n return this.querySelectorInternal(selector, options, true);\n }\n\n async queryAllXPath(selector: string, options: FrameSelectorOptions = {}): Promise<QueryResult[]> {\n return this.querySelectorAllInternal(selector, options, true);\n }\n\n locator(selector: string, options: FrameSelectorOptions = {}) {\n return new Locator(this, { kind: \"selector\", selector, options });\n }\n\n getByText(text: string | RegExp, options: TextLocatorOptions = {}) {\n return new Locator(this, { kind: \"text\", text, options });\n }\n\n getByRole(role: string, options: RoleLocatorOptions = {}) {\n return new Locator(this, { kind: \"role\", role, options });\n }\n\n async click(selector: string, options: ClickOptions = {}) {\n await this.performClick(selector, options, false);\n }\n\n async dblclick(selector: string, options: ClickOptions = {}) {\n await this.performClick(selector, options, true);\n }\n\n async type(selector: string, text: string, options: TypeOptions = {}) {\n const start = Date.now();\n const parsed = parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n this.events.emit(\"action:start\", { name: \"type\", selector, frameId: this.id, sensitive: options.sensitive });\n await waitFor(async () => {\n const box = await this.resolveElementBox(selector, options);\n if (!box || !box.visible) {\n return false;\n }\n return true;\n }, { timeoutMs: options.timeoutMs ?? this.defaultTimeout, description: `type ${selector}` });\n\n const helpers = serializeShadowDomHelpers();\n const focusExpression = `(function() {\n const querySelectorDeep = ${helpers.querySelectorDeep};\n const root = document;\n const selector = ${JSON.stringify(selector)};\n const el = ${pierce ? \"querySelectorDeep(root, selector)\" : \"root.querySelector(selector)\"};\n if (!el) {\n return;\n }\n el.focus();\n })()`;\n const focusParams: Record<string, unknown> = {\n expression: focusExpression,\n returnByValue: true\n };\n if (this.contextId) {\n focusParams.contextId = this.contextId;\n }\n await this.session.send(\"Runtime.evaluate\", focusParams);\n\n await this.session.send(\"Input.insertText\", { text });\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"type\", selector, frameId: this.id, durationMs: duration, sensitive: options.sensitive });\n this.logger.debug(\"Type\", selector, `${duration}ms`);\n }\n\n async typeSecure(selector: string, text: string, options: TypeOptions = {}) {\n return this.type(selector, text, { ...options, sensitive: true });\n }\n\n async fillInput(selector: string, value: string, options: { timeoutMs?: number } = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"fillInput\", selector, frameId: this.id });\n await waitFor(async () => {\n const expression = `(function() {\n const selector = ${JSON.stringify(selector)};\n const findDeep = (sel) => {\n if (sel.includes(\">>>\")) {\n const parts = sel.split(\">>>\").map((s) => s.trim()).filter(Boolean);\n let scope = [document];\n for (const part of parts) {\n const next = [];\n for (const node of scope) {\n const roots = [node];\n if (node instanceof Element && node.shadowRoot) roots.push(node.shadowRoot);\n for (const root of roots) {\n next.push(...root.querySelectorAll(part));\n }\n }\n if (!next.length) return null;\n scope = next;\n }\n return scope[0] || null;\n }\n return document.querySelector(sel);\n };\n const el = findDeep(selector);\n if (!el) return false;\n if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement)) {\n return false;\n }\n el.value = ${JSON.stringify(value)};\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n })()`;\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: boolean } }>(\"Runtime.evaluate\", params);\n return Boolean(result.result?.value);\n }, { timeoutMs: options.timeoutMs ?? this.defaultTimeout, description: `fillInput ${selector}` });\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"fillInput\", selector, frameId: this.id, durationMs: duration });\n this.logger.debug(\"FillInput\", selector, `${duration}ms`);\n }\n\n async findLocators(options: { highlight?: boolean; outputPath?: string; outputJson?: string; outputHtml?: string } = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"findLocators\", frameId: this.id });\n const artifactsDir = path.resolve(process.cwd(), \"artifacts\");\n try {\n fs.mkdirSync(artifactsDir, { recursive: true });\n } catch {\n // ignore dir creation errors\n }\n const resolveOut = (name?: string) => {\n if (!name) return null;\n const base = path.basename(name);\n return path.join(artifactsDir, base);\n };\n const outputJson = resolveOut(options.outputJson || options.outputPath);\n const outputHtml = resolveOut(options.outputHtml);\n const expression = `(function() {\n const highlight = ${options.highlight !== false};\n const previous = Array.from(document.querySelectorAll(\".__cdpwright-locator-overlay\"));\n previous.forEach((el) => el.remove());\n\n const cssEscape = (value) => {\n if (typeof CSS !== \"undefined\" && CSS.escape) return CSS.escape(value);\n return value.replace(/[^a-zA-Z0-9_-]/g, (c) => \"\\\\\\\\\" + c.charCodeAt(0).toString(16) + \" \");\n };\n\n const visible = (el) => {\n const rect = el.getBoundingClientRect();\n const style = window.getComputedStyle(el);\n return rect.width > 0 && rect.height > 0 && style.visibility !== \"hidden\" && style.display !== \"none\" && Number(style.opacity || \"1\") > 0;\n };\n\n const siblingsIndex = (el) => {\n if (!el.parentElement) return 1;\n const sibs = Array.from(el.parentElement.children).filter((n) => n.tagName === el.tagName);\n return sibs.indexOf(el) + 1;\n };\n\n const xpathFor = (el) => {\n const parts = [];\n let node = el;\n while (node && node.nodeType === 1 && node !== document.documentElement) {\n const idx = siblingsIndex(node);\n parts.unshift(node.tagName.toLowerCase() + \"[\" + idx + \"]\");\n node = node.parentElement;\n }\n return \"//\" + parts.join(\"/\");\n };\n\n const buildLocator = (el) => {\n const testid = el.getAttribute(\"data-testid\");\n const id = el.id;\n const name = el.getAttribute(\"name\");\n const aria = el.getAttribute(\"aria-label\");\n const labelledBy = el.getAttribute(\"aria-labelledby\");\n const placeholder = el.getAttribute(\"placeholder\");\n const role = el.getAttribute(\"role\");\n const labelText = (() => {\n if (labelledBy) {\n const ref = document.getElementById(labelledBy);\n if (ref) return ref.textContent?.trim() || \"\";\n }\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n const idRef = el.id && document.querySelector(\"label[for='\" + el.id.replace(/'/g, \"\\\\\\\\'\") + \"']\");\n if (idRef) return idRef.textContent?.trim() || \"\";\n const wrap = el.closest(\"label\");\n if (wrap) return wrap.textContent?.trim() || \"\";\n }\n return \"\";\n })();\n\n let css = \"\";\n let quality = \"low\";\n let reason = \"fallback\";\n if (testid) {\n css = \"[data-testid=\\\"\" + testid.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"high\";\n reason = \"data-testid\";\n } else if (id) {\n css = \"#\" + cssEscape(id);\n quality = \"high\";\n reason = \"id\";\n } else if (name) {\n css = \"[name=\\\"\" + name.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"ok\";\n reason = \"name\";\n } else if (aria) {\n css = \"[aria-label=\\\"\" + aria.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"ok\";\n reason = \"aria-label\";\n } else if (placeholder) {\n css = \"[placeholder=\\\"\" + placeholder.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"low\";\n reason = \"placeholder\";\n } else if (labelText) {\n css = el.tagName.toLowerCase() + \"[aria-label=\\\"\" + labelText.replace(/\"/g, '\\\\\\\\\"') + \"\\\"]\";\n quality = \"low\";\n reason = \"label text\";\n } else {\n const nth = siblingsIndex(el);\n css = el.tagName.toLowerCase() + \":nth-of-type(\" + nth + \")\";\n quality = \"low\";\n reason = \"nth-of-type\";\n }\n\n const tag = el.tagName.toLowerCase();\n const type = el.getAttribute(\"type\") || \"\";\n const text = (el.textContent || \"\").trim().slice(0, 80);\n\n return {\n name: labelText || aria || placeholder || name || testid || id || tag,\n css,\n xpath: xpathFor(el),\n quality,\n reason,\n visible: true,\n tag,\n type,\n role,\n text,\n id,\n nameAttr: name,\n dataTestid: testid\n };\n };\n\n const preferredSelectors = [\"input\", \"select\", \"textarea\", \"button\", \"a[href]\", \"[role='button']\", \"[contenteditable='true']\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"label\", \"legend\", \"fieldset\"];\n let nodes = Array.from(document.querySelectorAll(preferredSelectors.join(\", \")));\n if (nodes.length === 0) {\n nodes = Array.from(document.querySelectorAll(\"*\")).filter((el) => {\n if (!(el instanceof HTMLElement)) return false;\n const tag = el.tagName.toLowerCase();\n if (preferredSelectors.includes(tag)) return true;\n if (tag === \"a\" && el.hasAttribute(\"href\")) return true;\n if (el.getAttribute(\"role\") === \"button\") return true;\n if (el.hasAttribute(\"contenteditable\")) return true;\n return false;\n });\n }\n const results = [];\n nodes.forEach((el) => {\n const isVisible = visible(el);\n const locator = buildLocator(el);\n locator.visible = isVisible;\n results.push(locator);\n });\n\n if (highlight) {\n results.forEach((loc, index) => {\n const el = nodes[index];\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const overlay = document.createElement(\"div\");\n overlay.className = \"__cdpwright-locator-overlay\";\n overlay.style.position = \"absolute\";\n overlay.style.left = rect.x + window.scrollX + \"px\";\n overlay.style.top = rect.y + window.scrollY + \"px\";\n overlay.style.width = rect.width + \"px\";\n overlay.style.height = rect.height + \"px\";\n overlay.style.border = \"2px solid #e67e22\";\n overlay.style.borderRadius = \"6px\";\n overlay.style.pointerEvents = \"none\";\n overlay.style.zIndex = \"99999\";\n const badge = document.createElement(\"div\");\n badge.textContent = String(index);\n badge.style.position = \"absolute\";\n badge.style.top = \"-10px\";\n badge.style.left = \"-10px\";\n badge.style.background = \"#e67e22\";\n badge.style.color = \"#fff\";\n badge.style.fontSize = \"12px\";\n badge.style.padding = \"2px 6px\";\n badge.style.borderRadius = \"10px\";\n overlay.appendChild(badge);\n document.body.appendChild(overlay);\n });\n }\n\n if (console && console.table) {\n console.table(results.map((r, idx) => ({ idx, name: r.name, css: r.css, quality: r.quality, reason: r.reason, tag: r.tag, type: r.type })));\n }\n return results;\n })()`;\n\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n let result = await this.session.send<{ result: { value?: any[] } }>(\"Runtime.evaluate\", params);\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"findLocators\", frameId: this.id, durationMs: duration });\n const value = (result.result?.value as any[]) ?? [];\n if (Array.isArray(value) && value.length > 0) {\n this.logger.info(\"FindLocators\", `${value.length} candidates`, value.slice(0, 5).map((v) => v.css || v.name || v.tag));\n if (outputJson) {\n try {\n fs.writeFileSync(outputJson, JSON.stringify(value, null, 2), \"utf-8\");\n this.logger.info(\"FindLocators\", `written to ${outputJson}`);\n } catch (err) {\n this.logger.warn(\"FindLocators write failed\", err);\n }\n }\n if (outputHtml) {\n this.writeLocatorHtml(outputHtml, value);\n }\n return value;\n }\n // Fallback: filtered scan to avoid empty results while ignoring document chrome\n result = await this.session.send<{ result: { value?: any[] } }>(\"Runtime.evaluate\", {\n expression: `(function() {\n const allowed = [\"input\",\"select\",\"textarea\",\"button\",\"a\",\"label\",\"legend\",\"fieldset\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"];\n const skip = [\"html\",\"head\",\"body\",\"meta\",\"link\",\"script\",\"style\"];\n return Array.from(document.querySelectorAll(\"*\"))\n .filter((el) => {\n if (!(el instanceof HTMLElement)) return false;\n const tag = el.tagName.toLowerCase();\n if (skip.includes(tag)) return false;\n if (tag === \"a\" && el.hasAttribute(\"href\")) return true;\n if (el.getAttribute(\"role\") === \"button\") return true;\n if (el.hasAttribute(\"contenteditable\")) return true;\n return allowed.includes(tag);\n })\n .slice(0, 200)\n .map((el, idx) => ({\n name: el.getAttribute(\"aria-label\") || el.getAttribute(\"name\") || el.getAttribute(\"data-testid\") || el.id || el.tagName.toLowerCase() + \"-\" + idx,\n css: el.id ? \"#\" + el.id : el.getAttribute(\"data-testid\") ? \"[data-testid=\\\\\"\" + el.getAttribute(\"data-testid\") + \"\\\\\"]\" : el.tagName.toLowerCase(),\n xpath: \"\",\n quality: \"low\",\n reason: \"fallback\",\n visible: true,\n tag: el.tagName.toLowerCase(),\n type: el.getAttribute(\"type\") || \"\",\n role: el.getAttribute(\"role\") || \"\"\n }));\n })()`,\n returnByValue: true\n });\n const fallback = (result.result?.value as any[]) ?? [];\n this.logger.info(\"FindLocators\", `${fallback.length} candidates`, fallback.slice(0, 5).map((v) => v.css || v.name || v.tag));\n if (outputJson) {\n try {\n fs.writeFileSync(outputJson, JSON.stringify(fallback, null, 2), \"utf-8\");\n this.logger.info(\"FindLocators\", `written to ${outputJson}`);\n } catch (err) {\n this.logger.warn(\"FindLocators write failed\", err);\n }\n }\n if (outputHtml) {\n this.writeLocatorHtml(outputHtml, fallback);\n }\n return fallback;\n }\n\n private writeLocatorHtml(filePath: string, data: any[]) {\n const html = `<!doctype html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <title>Locators</title>\n <style>\n body { font-family: \"Segoe UI\", system-ui, -apple-system, sans-serif; padding: 16px; background: #f8f9fa; color: #222; }\n h1 { font-size: 20px; margin-bottom: 12px; }\n table { border-collapse: collapse; width: 100%; background: #fff; box-shadow: 0 2px 6px rgba(0,0,0,0.08); }\n th, td { border: 1px solid #e5e7eb; padding: 8px; font-size: 13px; text-align: left; }\n th { background: linear-gradient(180deg, #f6f7fb, #edf0f7); font-weight: 600; }\n tr:nth-child(even) { background: #fafbfc; }\n .copy { color: #2563eb; text-decoration: underline dotted; cursor: pointer; font-size: 12px; background: none; border: none; padding: 0; opacity: 0; transition: opacity 0.15s ease; }\n tr:hover .copy { opacity: 1; }\n .copy:hover { color: #1d4ed8; }\n .loc-value { margin-left: 6px; font-family: ui-monospace, SFMono-Regular, SFMono, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; }\n </style>\n</head>\n<body>\n <h1>Locator candidates</h1>\n <table>\n <thead>\n <tr><th>#</th><th>Name</th><th>CSS</th><th>XPath</th><th>Quality</th><th>Reason</th><th>Visible</th></tr>\n </thead>\n <tbody id=\"rows\"></tbody>\n </table>\n <script>\n const data = ${JSON.stringify(data)};\n const rows = document.getElementById(\"rows\");\n data.forEach((loc, idx) => {\n const tr = document.createElement(\"tr\");\n const cells = [\n idx,\n loc.name || \"\",\n loc.css || \"\",\n loc.xpath || \"\",\n loc.quality || \"\",\n loc.reason || \"\",\n String(loc.visible)\n ];\n cells.forEach((val, i) => {\n const td = document.createElement(\"td\");\n if (i === 2 || i === 3) {\n const link = document.createElement(\"button\");\n link.className = \"copy\";\n link.textContent = \"copy\";\n link.addEventListener(\"click\", async (e) => {\n e.preventDefault();\n try { await navigator.clipboard.writeText(val); link.textContent = \"copied\"; setTimeout(() => link.textContent = \"copy\", 1000); }\n catch { link.textContent = \"error\"; }\n });\n const span = document.createElement(\"span\");\n span.className = \"loc-value\";\n span.textContent = val;\n td.appendChild(link);\n td.appendChild(span);\n } else {\n td.textContent = val;\n }\n tr.appendChild(td);\n });\n rows.appendChild(tr);\n });\n </script>\n</body>\n</html>`;\n try {\n fs.writeFileSync(filePath, html, \"utf-8\");\n this.logger.info(\"FindLocators\", `HTML written to ${filePath}`);\n } catch (err) {\n this.logger.warn(\"FindLocators HTML write failed\", err);\n }\n }\n\n async exists(selector: string, options: FrameSelectorOptions = {}) {\n const handle = await this.query(selector, options);\n if (handle) {\n await this.releaseObject(handle.objectId);\n return true;\n }\n return false;\n }\n\n async isVisible(selector: string, options: FrameSelectorOptions = {}) {\n const box = await this.resolveElementBox(selector, options);\n return Boolean(box && box.visible);\n }\n\n async clickLocator(query: LocatorQuery, options: ClickOptions = {}) {\n await this.performClickLocator(query, options, false);\n }\n\n async dblclickLocator(query: LocatorQuery, options: ClickOptions = {}) {\n await this.performClickLocator(query, options, true);\n }\n\n async typeLocator(query: LocatorQuery, text: string, options: TypeOptions = {}) {\n const start = Date.now();\n const description = this.locatorDescription(query);\n this.events.emit(\"action:start\", { name: \"type\", selector: description, frameId: this.id, sensitive: options.sensitive });\n await waitFor(async () => {\n const box = await this.resolveLocatorElementBox(query, options);\n if (!box || !box.visible) {\n return false;\n }\n return true;\n }, { timeoutMs: options.timeoutMs ?? this.defaultTimeout, description: `type ${description}` });\n\n const focusExpression = this.buildLocatorExpression(query, `\n if (!el) {\n return;\n }\n el.focus();\n `);\n const focusParams: Record<string, unknown> = {\n expression: focusExpression,\n returnByValue: true\n };\n if (this.contextId) {\n focusParams.contextId = this.contextId;\n }\n await this.session.send(\"Runtime.evaluate\", focusParams);\n await this.session.send(\"Input.insertText\", { text });\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"type\", selector: description, frameId: this.id, durationMs: duration, sensitive: options.sensitive });\n this.logger.debug(\"Type\", description, `${duration}ms`);\n }\n\n async existsLocator(query: LocatorQuery) {\n return Boolean(await this.evalOnLocator<boolean | null>(query, false, `\n return Boolean(el);\n `));\n }\n\n async isVisibleLocator(query: LocatorQuery) {\n return this.evalOnLocator<boolean | null>(query, false, `\n if (!el) {\n return null;\n }\n const rect = el.getBoundingClientRect();\n const style = window.getComputedStyle(el);\n return rect.width > 0 && rect.height > 0 && style.visibility !== \"hidden\" && style.display !== \"none\" && Number(style.opacity || \"1\") > 0;\n `);\n }\n\n async isEnabledLocator(query: LocatorQuery) {\n return this.evalOnLocator<boolean | null>(query, false, `\n if (!el) {\n return null;\n }\n const disabled = Boolean(el.disabled) || el.hasAttribute(\"disabled\");\n const ariaDisabled = el.getAttribute && el.getAttribute(\"aria-disabled\") === \"true\";\n return !(disabled || ariaDisabled);\n `);\n }\n\n async isCheckedLocator(query: LocatorQuery) {\n return this.evalOnLocator<boolean | null>(query, false, `\n if (!el) {\n return null;\n }\n const aria = el.getAttribute && el.getAttribute(\"aria-checked\");\n if (aria === \"true\") {\n return true;\n }\n if (aria === \"false\") {\n return false;\n }\n if (\"checked\" in el) {\n return Boolean(el.checked);\n }\n return null;\n `);\n }\n\n async textLocator(query: LocatorQuery) {\n return this.evalOnLocator<string | null>(query, false, `\n if (!el) {\n return null;\n }\n if (el instanceof HTMLInputElement) {\n const type = (el.getAttribute(\"type\") || \"text\").toLowerCase();\n if (type === \"button\" || type === \"submit\" || type === \"reset\") {\n return el.value || \"\";\n }\n }\n return el.textContent || \"\";\n `);\n }\n\n async valueLocator(query: LocatorQuery) {\n return this.evalOnLocator<string | null>(query, false, `\n if (!el) {\n return null;\n }\n if (\"value\" in el) {\n return el.value ?? \"\";\n }\n return el.getAttribute(\"value\");\n `);\n }\n\n async attributeLocator(query: LocatorQuery, name: string) {\n return this.evalOnLocator<string | null>(query, false, `\n if (!el || !(el instanceof Element)) {\n return null;\n }\n return el.getAttribute(${JSON.stringify(name)});\n `);\n }\n\n async classesLocator(query: LocatorQuery) {\n return this.evalOnLocator<string[] | null>(query, false, `\n if (!el) {\n return null;\n }\n if (!el.classList) {\n return [];\n }\n return Array.from(el.classList);\n `);\n }\n\n async cssLocator(query: LocatorQuery, property: string) {\n return this.evalOnLocator<string | null>(query, false, `\n if (!el) {\n return null;\n }\n const style = window.getComputedStyle(el);\n return style.getPropertyValue(${JSON.stringify(property)}) || \"\";\n `);\n }\n\n async hasFocusLocator(query: LocatorQuery) {\n return this.evalOnLocator<boolean | null>(query, false, `\n if (!el) {\n return null;\n }\n return document.activeElement === el;\n `);\n }\n\n async isInViewportLocator(query: LocatorQuery, fully = false) {\n return this.evalOnLocator<boolean | null>(query, false, `\n if (!el) {\n return null;\n }\n const rect = el.getBoundingClientRect();\n const viewWidth = window.innerWidth || document.documentElement.clientWidth;\n const viewHeight = window.innerHeight || document.documentElement.clientHeight;\n if (${fully ? \"true\" : \"false\"}) {\n return rect.top >= 0 && rect.left >= 0 && rect.bottom <= viewHeight && rect.right <= viewWidth;\n }\n return rect.bottom > 0 && rect.right > 0 && rect.top < viewHeight && rect.left < viewWidth;\n `);\n }\n\n async isEditableLocator(query: LocatorQuery) {\n return this.evalOnLocator<boolean | null>(query, false, `\n if (!el) {\n return null;\n }\n const disabled = Boolean(el.disabled) || el.hasAttribute(\"disabled\");\n const readOnly = Boolean(el.readOnly) || el.hasAttribute(\"readonly\");\n const ariaDisabled = el.getAttribute && el.getAttribute(\"aria-disabled\") === \"true\";\n return !(disabled || readOnly || ariaDisabled);\n `);\n }\n\n async countLocator(query: LocatorQuery) {\n return this.evalOnLocator<number>(query, true, `\n return elements.length;\n `);\n }\n\n async text(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n return el.textContent || \"\";\n `);\n }\n\n async textSecure(selector: string, options: FrameSelectorOptions = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"text\", selector, frameId: this.id, sensitive: true });\n const result = await this.text(selector, options);\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"text\", selector, frameId: this.id, durationMs: duration, sensitive: true });\n return result;\n }\n\n async selectOption(selector: string, value: string) {\n await this.evaluate(\n (sel, val) => {\n const el = document.querySelector(sel);\n if (!(el instanceof HTMLSelectElement)) return false;\n el.value = val;\n el.dispatchEvent(new Event(\"input\", { bubbles: true }));\n el.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n },\n selector,\n value\n );\n }\n\n async setFileInput(selector: string, name: string, contents: string, options: { mimeType?: string } = {}) {\n await this.evaluate(\n (sel, fileName, text, mime) => {\n const input = document.querySelector(sel);\n if (!(input instanceof HTMLInputElement)) return false;\n const file = new File([text], fileName, { type: mime || \"text/plain\" });\n const data = new DataTransfer();\n data.items.add(file);\n input.files = data.files;\n input.dispatchEvent(new Event(\"input\", { bubbles: true }));\n input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n return true;\n },\n selector,\n name,\n contents,\n options.mimeType || \"text/plain\"\n );\n }\n\n async attribute(selector: string, name: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string | null>(selector, options, false, `\n if (!el || !(el instanceof Element)) {\n return null;\n }\n return el.getAttribute(${JSON.stringify(name)});\n `);\n }\n\n async value(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n if (\"value\" in el) {\n return el.value ?? \"\";\n }\n return el.getAttribute(\"value\");\n `);\n }\n\n async valueSecure(selector: string, options: FrameSelectorOptions = {}) {\n const start = Date.now();\n this.events.emit(\"action:start\", { name: \"value\", selector, frameId: this.id, sensitive: true });\n const result = await this.value(selector, options);\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: \"value\", selector, frameId: this.id, durationMs: duration, sensitive: true });\n return result;\n }\n\n async isEnabled(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const disabled = Boolean(el.disabled) || el.hasAttribute(\"disabled\");\n const ariaDisabled = el.getAttribute && el.getAttribute(\"aria-disabled\") === \"true\";\n return !(disabled || ariaDisabled);\n `);\n }\n\n async isChecked(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const aria = el.getAttribute && el.getAttribute(\"aria-checked\");\n if (aria === \"true\") {\n return true;\n }\n if (aria === \"false\") {\n return false;\n }\n if (\"checked\" in el) {\n return Boolean(el.checked);\n }\n return null;\n `);\n }\n\n async count(selector: string, options: FrameSelectorOptions = {}) {\n const parsed = parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n const expression = parsed.type === \"xpath\"\n ? `(function() {\n const result = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\n return result.snapshotLength;\n })()`\n : `(function() {\n const querySelectorAllDeep = ${helpers.querySelectorAllDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n const nodes = ${pierce ? \"querySelectorAllDeep(root, selector)\" : \"root.querySelectorAll(selector)\"};\n return nodes.length;\n })()`;\n\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: number } }>(\"Runtime.evaluate\", params);\n return result.result.value ?? 0;\n }\n\n async classes(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string[] | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n if (!el.classList) {\n return [];\n }\n return Array.from(el.classList);\n `);\n }\n\n async css(selector: string, property: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<string | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const style = window.getComputedStyle(el);\n return style.getPropertyValue(${JSON.stringify(property)}) || \"\";\n `);\n }\n\n async hasFocus(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n return document.activeElement === el;\n `);\n }\n\n async isInViewport(selector: string, options: FrameSelectorOptions = {}, fully = false) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const rect = el.getBoundingClientRect();\n const viewWidth = window.innerWidth || document.documentElement.clientWidth;\n const viewHeight = window.innerHeight || document.documentElement.clientHeight;\n if (${fully ? \"true\" : \"false\"}) {\n return rect.top >= 0 && rect.left >= 0 && rect.bottom <= viewHeight && rect.right <= viewWidth;\n }\n return rect.bottom > 0 && rect.right > 0 && rect.top < viewHeight && rect.left < viewWidth;\n `);\n }\n\n async isEditable(selector: string, options: FrameSelectorOptions = {}) {\n return this.evalOnSelector<boolean | null>(selector, options, false, `\n if (!el) {\n return null;\n }\n const disabled = Boolean(el.disabled) || el.hasAttribute(\"disabled\");\n const readOnly = Boolean(el.readOnly) || el.hasAttribute(\"readonly\");\n const ariaDisabled = el.getAttribute && el.getAttribute(\"aria-disabled\") === \"true\";\n return !(disabled || readOnly || ariaDisabled);\n `);\n }\n\n private async performClickLocator(query: LocatorQuery, options: ClickOptions, isDouble: boolean) {\n const start = Date.now();\n const actionName = isDouble ? \"dblclick\" : \"click\";\n const description = this.locatorDescription(query);\n this.events.emit(\"action:start\", { name: actionName, selector: description, frameId: this.id });\n const box = await waitFor(async () => {\n const result = await this.resolveLocatorElementBox(query, options);\n if (!result || !result.visible) {\n return null;\n }\n return result;\n }, { timeoutMs: options.timeoutMs ?? this.defaultTimeout, description: `${actionName} ${description}` });\n\n const centerX = box.x + box.width / 2;\n const centerY = box.y + box.height / 2;\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseMoved\", x: centerX, y: centerY });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mousePressed\", x: centerX, y: centerY, button: \"left\", clickCount: 1, buttons: 1 });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseReleased\", x: centerX, y: centerY, button: \"left\", clickCount: 1, buttons: 0 });\n\n if (isDouble) {\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseMoved\", x: centerX, y: centerY });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mousePressed\", x: centerX, y: centerY, button: \"left\", clickCount: 2, buttons: 1 });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseReleased\", x: centerX, y: centerY, button: \"left\", clickCount: 2, buttons: 0 });\n }\n\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: actionName, selector: description, frameId: this.id, durationMs: duration });\n this.logger.debug(\"Click\", description, `${duration}ms`);\n }\n\n private locatorDescription(query: LocatorQuery) {\n switch (query.kind) {\n case \"selector\":\n return query.selector;\n case \"text\":\n return typeof query.text === \"string\" ? `text=${JSON.stringify(query.text)}` : `text=${query.text.toString()}`;\n case \"role\":\n return `role=${query.role}${query.options?.name ? ` name=${typeof query.options.name === \"string\" ? JSON.stringify(query.options.name) : query.options.name.toString()}` : \"\"}`;\n }\n }\n\n private async resolveLocatorElementBox(query: LocatorQuery, options: { timeoutMs?: number }): Promise<ElementBox | null> {\n return this.evalOnLocator(query, false, `\n if (!el) {\n return null;\n }\n el.scrollIntoView({ block: \"center\", inline: \"center\" });\n const rect = el.getBoundingClientRect();\n const style = window.getComputedStyle(el);\n return {\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height,\n visible: rect.width > 0 && rect.height > 0 && style.visibility !== \"hidden\" && style.display !== \"none\" && Number(style.opacity || \"1\") > 0\n };\n `);\n }\n\n private async evalOnLocator<T>(query: LocatorQuery, all: boolean, body: string): Promise<T> {\n const expression = this.buildLocatorExpression(query, body, all);\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: T } }>(\"Runtime.evaluate\", params);\n return result.result.value as T;\n }\n\n private buildLocatorExpression(query: LocatorQuery, body: string, all = false) {\n const helpers = serializeShadowDomHelpers();\n const serializedQuery = this.serializeLocatorQuery(query);\n return `(function() {\n const querySelectorAllDeep = ${helpers.querySelectorAllDeep};\n const normalizeWhitespace = (value) => String(value ?? \"\").replace(/\\\\s+/g, \" \").trim();\n const cssEscape = (value) => {\n if (typeof CSS !== \"undefined\" && CSS.escape) return CSS.escape(value);\n return String(value).replace(/[^a-zA-Z0-9_-]/g, (c) => \"\\\\\\\\\" + c.charCodeAt(0).toString(16) + \" \");\n };\n const textFromElement = (el) => {\n if (!el) return \"\";\n if (el instanceof HTMLInputElement) {\n const type = (el.getAttribute(\"type\") || \"\").toLowerCase();\n if (type === \"button\" || type === \"submit\" || type === \"reset\" || type === \"image\") {\n return el.value || el.getAttribute(\"alt\") || \"\";\n }\n }\n return el.textContent || \"\";\n };\n const isHidden = (el) => {\n if (!el || !(el instanceof Element)) return true;\n const style = window.getComputedStyle(el);\n if (el.hidden || el.getAttribute(\"aria-hidden\") === \"true\") return true;\n return style.display === \"none\" || style.visibility === \"hidden\" || Number(style.opacity || \"1\") <= 0;\n };\n const getLabelText = (el) => {\n if (!el || !(el instanceof Element)) return \"\";\n const ariaLabel = el.getAttribute(\"aria-label\");\n if (ariaLabel) return normalizeWhitespace(ariaLabel);\n const labelledBy = el.getAttribute(\"aria-labelledby\");\n if (labelledBy) {\n const parts = labelledBy.split(/\\\\s+/).filter(Boolean).map((id) => document.getElementById(id)?.textContent || \"\");\n const text = normalizeWhitespace(parts.join(\" \"));\n if (text) return text;\n }\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement) {\n if (el.id) {\n const label = document.querySelector(\"label[for=\\\"\" + cssEscape(el.id) + \"\\\"]\");\n if (label) {\n const text = normalizeWhitespace(label.textContent || \"\");\n if (text) return text;\n }\n }\n const wrap = el.closest(\"label\");\n if (wrap) {\n const text = normalizeWhitespace(wrap.textContent || \"\");\n if (text) return text;\n }\n }\n if (el instanceof HTMLImageElement) {\n return normalizeWhitespace(el.getAttribute(\"alt\") || el.getAttribute(\"title\") || \"\");\n }\n return normalizeWhitespace(el.getAttribute(\"title\") || \"\");\n };\n const getImplicitRole = (el) => {\n if (!el || !(el instanceof Element)) return \"\";\n const explicitRole = (el.getAttribute(\"role\") || \"\").trim().split(/\\\\s+/)[0];\n if (explicitRole) return explicitRole;\n const tag = el.tagName.toLowerCase();\n if (tag === \"button\") return \"button\";\n if (tag === \"summary\") return \"button\";\n if (tag === \"a\" && el.hasAttribute(\"href\")) return \"link\";\n if (tag === \"input\") {\n const type = (el.getAttribute(\"type\") || \"text\").toLowerCase();\n if (type === \"checkbox\") return \"checkbox\";\n if (type === \"radio\") return \"radio\";\n if (type === \"range\") return \"slider\";\n if (type === \"submit\" || type === \"button\" || type === \"reset\") return \"button\";\n if (type === \"file\") return \"button\";\n return \"textbox\";\n }\n if (tag === \"textarea\") return \"textbox\";\n if (tag === \"select\") return \"combobox\";\n if (tag === \"img\") return \"img\";\n if (tag === \"ul\" || tag === \"ol\") return \"list\";\n if (tag === \"li\") return \"listitem\";\n if (tag === \"table\") return \"table\";\n if (tag === \"tr\") return \"row\";\n if (tag === \"td\") return \"cell\";\n if (tag === \"th\") return \"columnheader\";\n if (/^h[1-6]$/.test(tag)) return \"heading\";\n if (tag === \"option\") return \"option\";\n if (tag === \"fieldset\") return \"group\";\n if (tag === \"form\") return \"form\";\n if (el.hasAttribute(\"contenteditable\")) return \"textbox\";\n return explicitRole;\n };\n const matchText = (actual, expected, exact) => {\n const normalizedActual = normalizeWhitespace(actual);\n if (expected && expected.kind === \"regex\") {\n const regex = new RegExp(expected.source, expected.flags);\n return regex.test(normalizedActual);\n }\n const normalizedExpected = normalizeWhitespace(expected.value);\n if (exact) {\n return normalizedActual === normalizedExpected;\n }\n return normalizedActual.toLowerCase().includes(normalizedExpected.toLowerCase());\n };\n const matchName = (actual, expected, exact) => {\n const normalizedActual = normalizeWhitespace(actual);\n if (expected && expected.kind === \"regex\") {\n const regex = new RegExp(expected.source, expected.flags);\n return regex.test(normalizedActual);\n }\n const normalizedExpected = normalizeWhitespace(expected.value);\n if (exact) {\n return normalizedActual === normalizedExpected;\n }\n return normalizedActual.toLowerCase().includes(normalizedExpected.toLowerCase());\n };\n const query = ${serializedQuery};\n const nodes = Array.from(querySelectorAllDeep(document, \"*\"));\n const selectorMatches = () => {\n if (query.kind !== \"selector\") {\n return [];\n }\n if (query.selector.includes(\">>>\")) {\n return querySelectorAllDeep(document, query.selector);\n }\n if (query.parsed?.type === \"xpath\") {\n const result = document.evaluate(query.parsed.value, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\n const list = [];\n for (let i = 0; i < result.snapshotLength; i += 1) {\n const item = result.snapshotItem(i);\n if (item instanceof Element) {\n list.push(item);\n }\n }\n return list;\n }\n return Array.from(document.querySelectorAll(query.selector));\n };\n const selectorMatchSet = selectorMatches();\n const matches = nodes.filter((el) => {\n if (!(el instanceof Element)) return false;\n if (query.kind === \"selector\") {\n return selectorMatchSet.includes(el);\n }\n if (query.kind === \"text\") {\n const text = textFromElement(el);\n return matchText(text, query.text, Boolean(query.options?.exact));\n }\n const role = getImplicitRole(el);\n if (!role || role !== query.role) {\n return false;\n }\n if (!query.options?.includeHidden && isHidden(el)) {\n return false;\n }\n if (query.options?.name == null) {\n return true;\n }\n const name = getLabelText(el) || textFromElement(el);\n return matchName(name, query.options.name, Boolean(query.options?.exact));\n });\n const textMatches = query.kind === \"text\"\n ? matches.filter((el) => !matches.some((other) => other !== el && el.contains(other)))\n : matches;\n const elements = ${all ? \"textMatches\" : \"textMatches.slice(0, 1)\"};\n const el = elements[0] || null;\n ${body}\n })()`;\n }\n\n private serializeLocatorQuery(query: LocatorQuery) {\n switch (query.kind) {\n case \"selector\":\n return JSON.stringify({ kind: \"selector\", selector: query.selector, options: query.options, parsed: parseSelector(query.selector) });\n case \"text\":\n return JSON.stringify({\n kind: \"text\",\n text: this.serializeTextQuery(query.text),\n options: query.options\n });\n case \"role\":\n return JSON.stringify({\n kind: \"role\",\n role: query.role,\n options: query.options ? {\n ...query.options,\n name: query.options.name != null ? this.serializeTextQuery(query.options.name) : undefined\n } : undefined\n });\n }\n }\n\n private serializeTextQuery(text: string | RegExp) {\n if (text instanceof RegExp) {\n return { kind: \"regex\", source: text.source, flags: text.flags.replace(\"g\", \"\") };\n }\n return { kind: \"string\", value: text };\n }\n\n private async performClick(selector: string, options: ClickOptions, isDouble: boolean) {\n const start = Date.now();\n const actionName = isDouble ? \"dblclick\" : \"click\";\n this.events.emit(\"action:start\", { name: actionName, selector, frameId: this.id });\n const box = await waitFor(async () => {\n const result = await this.resolveElementBox(selector, options);\n if (!result || !result.visible) {\n return null;\n }\n return result;\n }, { timeoutMs: options.timeoutMs ?? this.defaultTimeout, description: `${actionName} ${selector}` });\n\n const centerX = box.x + box.width / 2;\n const centerY = box.y + box.height / 2;\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseMoved\", x: centerX, y: centerY });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mousePressed\", x: centerX, y: centerY, button: \"left\", clickCount: 1, buttons: 1 });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseReleased\", x: centerX, y: centerY, button: \"left\", clickCount: 1, buttons: 0 });\n\n if (isDouble) {\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseMoved\", x: centerX, y: centerY });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mousePressed\", x: centerX, y: centerY, button: \"left\", clickCount: 2, buttons: 1 });\n await this.session.send(\"Input.dispatchMouseEvent\", { type: \"mouseReleased\", x: centerX, y: centerY, button: \"left\", clickCount: 2, buttons: 0 });\n }\n\n const duration = Date.now() - start;\n this.events.emit(\"action:end\", { name: actionName, selector, frameId: this.id, durationMs: duration });\n this.logger.debug(\"Click\", selector, `${duration}ms`);\n }\n\n private async resolveElementBox(selector: string, options: FrameSelectorOptions): Promise<ElementBox | null> {\n const parsed = parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n const expression = parsed.type === \"xpath\"\n ? `(function() {\n const result = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n if (!result || !(result instanceof Element)) {\n return null;\n }\n result.scrollIntoView({ block: 'center', inline: 'center' });\n const rect = result.getBoundingClientRect();\n const style = window.getComputedStyle(result);\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height, visible: rect.width > 0 && rect.height > 0 && style.visibility !== 'hidden' && style.display !== 'none' && Number(style.opacity || '1') > 0 };\n })()`\n : `(function() {\n const querySelectorDeep = ${helpers.querySelectorDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n const el = ${pierce ? \"querySelectorDeep(root, selector)\" : \"root.querySelector(selector)\"};\n if (!el) {\n return null;\n }\n el.scrollIntoView({ block: 'center', inline: 'center' });\n const rect = el.getBoundingClientRect();\n const style = window.getComputedStyle(el);\n return { x: rect.x, y: rect.y, width: rect.width, height: rect.height, visible: rect.width > 0 && rect.height > 0 && style.visibility !== 'hidden' && style.display !== 'none' && Number(style.opacity || '1') > 0 };\n })()`;\n\n const boxParams: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n boxParams.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value: ElementBox | null } }>(\"Runtime.evaluate\", boxParams);\n\n return result?.result?.value ?? null;\n }\n\n private async querySelectorInternal(selector: string, options: FrameSelectorOptions, forceXPath: boolean): Promise<QueryResult | null> {\n const parsed = forceXPath ? { type: \"xpath\", value: selector.trim(), pierceShadowDom: undefined } : parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n const expression = parsed.type === \"xpath\"\n ? `(function() {\n const result = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n return result || null;\n })()`\n : `(function() {\n const querySelectorDeep = ${helpers.querySelectorDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n return ${pierce ? \"querySelectorDeep(root, selector)\" : \"root.querySelector(selector)\"};\n })()`;\n\n const queryParams: Record<string, unknown> = {\n expression,\n returnByValue: false\n };\n if (this.contextId) {\n queryParams.contextId = this.contextId;\n }\n const response = await this.session.send<{ result: { subtype?: string; objectId?: string } }>(\"Runtime.evaluate\", queryParams);\n\n if (response.result?.subtype === \"null\" || !response.result?.objectId) {\n return null;\n }\n\n return { objectId: response.result.objectId, contextId: this.contextId ?? 0 };\n }\n\n private async querySelectorAllInternal(selector: string, options: FrameSelectorOptions, forceXPath: boolean): Promise<QueryResult[]> {\n const parsed = forceXPath ? { type: \"xpath\", value: selector.trim(), pierceShadowDom: undefined } : parseSelector(selector);\n const pierce = Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n const expression = parsed.type === \"xpath\"\n ? `(function() {\n const result = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\n const nodes = [];\n for (let i = 0; i < result.snapshotLength; i += 1) {\n nodes.push(result.snapshotItem(i));\n }\n return nodes;\n })()`\n : `(function() {\n const querySelectorAllDeep = ${helpers.querySelectorAllDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n return ${pierce ? \"querySelectorAllDeep(root, selector)\" : \"Array.from(root.querySelectorAll(selector))\"};\n })()`;\n\n const listParams: Record<string, unknown> = {\n expression,\n returnByValue: false\n };\n if (this.contextId) {\n listParams.contextId = this.contextId;\n }\n const response = await this.session.send<{ result: { objectId?: string } }>(\"Runtime.evaluate\", listParams);\n\n if (!response.result?.objectId) {\n return [];\n }\n\n const properties = await this.session.send<{ result: Array<{ name?: string; value?: { objectId?: string } }> }>(\"Runtime.getProperties\", {\n objectId: response.result.objectId,\n ownProperties: true\n });\n\n const handles: QueryResult[] = [];\n for (const prop of properties.result) {\n if (prop.name && !/^\\d+$/.test(prop.name)) {\n continue;\n }\n const objectId = prop.value?.objectId;\n if (objectId) {\n handles.push({ objectId, contextId: this.contextId ?? 0 });\n }\n }\n\n await this.releaseObject(response.result.objectId);\n return handles;\n }\n\n private async evaluateInContext(fnOrString: string | ((...args: any[]) => any), args: any[]): Promise<any> {\n if (typeof fnOrString === \"string\") {\n const params: Record<string, unknown> = {\n expression: fnOrString,\n returnByValue: true,\n awaitPromise: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: unknown } }>(\"Runtime.evaluate\", params);\n return result.result.value;\n }\n\n const serializedArgs = args.map((arg) => serializeArgument(arg)).join(\", \");\n const expression = `(${fnOrString.toString()})(${serializedArgs})`;\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true,\n awaitPromise: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: unknown } }>(\"Runtime.evaluate\", params);\n return result.result.value;\n }\n\n private async releaseObject(objectId: string) {\n try {\n await this.session.send(\"Runtime.releaseObject\", { objectId });\n } catch {\n // ignore release errors\n }\n }\n\n private buildElementExpression(selector: string, options: FrameSelectorOptions, forceXPath: boolean, body: string) {\n const parsed = forceXPath ? { type: \"xpath\", value: selector.trim(), pierceShadowDom: undefined } : parseSelector(selector);\n const pierce = options.pierceShadowDom ?? Boolean(parsed.pierceShadowDom);\n const helpers = serializeShadowDomHelpers();\n if (parsed.type === \"xpath\") {\n return `(function() {\n const el = document.evaluate(${JSON.stringify(parsed.value)}, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;\n ${body}\n })()`;\n }\n return `(function() {\n const querySelectorDeep = ${helpers.querySelectorDeep};\n const root = document;\n const selector = ${JSON.stringify(parsed.value)};\n const el = ${pierce ? \"querySelectorDeep(root, selector)\" : \"root.querySelector(selector)\"};\n ${body}\n })()`;\n }\n\n private async evalOnSelector<T>(selector: string, options: FrameSelectorOptions, forceXPath: boolean, body: string): Promise<T> {\n const expression = this.buildElementExpression(selector, options, forceXPath, body);\n const params: Record<string, unknown> = {\n expression,\n returnByValue: true\n };\n if (this.contextId) {\n params.contextId = this.contextId;\n }\n const result = await this.session.send<{ result: { value?: T } }>(\"Runtime.evaluate\", params);\n return result.result.value as T;\n }\n}\n\nfunction serializeArgument(value: unknown) {\n if (value === undefined) {\n return \"undefined\";\n }\n return JSON.stringify(value);\n}\n","export type WaitForOptions = {\n timeoutMs?: number;\n intervalMs?: number;\n description?: string;\n};\n\nexport async function waitFor<T>(predicate: () => Promise<T> | T, options: WaitForOptions = {}): Promise<NonNullable<T>> {\n const timeoutMs = options.timeoutMs ?? 30_000;\n const intervalMs = options.intervalMs ?? 100;\n const start = Date.now();\n\n let lastError: unknown;\n while (Date.now() - start < timeoutMs) {\n try {\n const result = await predicate();\n if (result) {\n return result as NonNullable<T>;\n }\n } catch (err) {\n lastError = err;\n }\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n const description = options.description ? ` (${options.description})` : \"\";\n const error = new Error(`Timeout after ${timeoutMs}ms${description}`);\n (error as Error & { cause?: unknown }).cause = lastError;\n throw error;\n}\n","export type SelectorType = \"css\" | \"xpath\";\n\nexport type ParsedSelector = {\n type: SelectorType;\n value: string;\n pierceShadowDom?: boolean;\n};\n\nfunction isXPathSelector(input: string): boolean {\n if (input.startsWith(\"/\")) return true;\n if (input.startsWith(\"./\")) return true;\n if (input.startsWith(\".//\")) return true;\n if (input.startsWith(\"..\")) return true;\n if (input.startsWith(\"(\")) {\n const trimmed = input.trimStart();\n if (trimmed.startsWith(\"(\")) {\n const inner = trimmed.slice(1).trimStart();\n return inner.startsWith(\"/\") || inner.startsWith(\".\");\n }\n }\n return false;\n}\n\nexport function parseSelector(input: string): ParsedSelector {\n const value = input.trim();\n const pierceShadowDom = value.includes(\">>>\");\n return {\n type: isXPathSelector(value) ? \"xpath\" : \"css\",\n value,\n pierceShadowDom\n };\n}\n","type RootNode = Document | ShadowRoot | Element;\n\nfunction getElementCtor(root: RootNode): typeof Element | null {\n if (typeof Element !== \"undefined\") return Element;\n const doc = (root as Document | ShadowRoot | Element & { ownerDocument?: Document }).ownerDocument;\n const view = (doc || (root as any)).defaultView;\n return view?.Element ?? null;\n}\n\nfunction isElementNode(node: RootNode, ElementCtor: typeof Element): node is Element {\n return node instanceof ElementCtor;\n}\n\nfunction nodeChildren(node: RootNode): Element[] {\n if (!(\"children\" in node)) {\n return [];\n }\n return Array.from(node.children as unknown as Iterable<Element>);\n}\n\nexport function querySelectorDeep(root: RootNode, selector: string): Element | null {\n const ElementCtor = getElementCtor(root);\n if (!ElementCtor) return null;\n const elementCtor = ElementCtor;\n function walk(node: RootNode, sel: string, results: Element[]) {\n if (isElementNode(node, elementCtor) && node.matches(sel)) {\n results.push(node);\n }\n if (isElementNode(node, elementCtor) && node.shadowRoot) {\n walk(node.shadowRoot, sel, results);\n }\n for (const child of nodeChildren(node)) {\n walk(child, sel, results);\n }\n }\n\n function findAll(rootNode: RootNode, sel: string) {\n const results: Element[] = [];\n walk(rootNode, sel, results);\n return results;\n }\n\n if (selector.includes(\">>>\")) {\n const parts = selector.split(\">>>\").map((p) => p.trim()).filter(Boolean);\n let scope: RootNode[] = [root];\n for (const part of parts) {\n const matches: Element[] = [];\n for (const item of scope) {\n matches.push(...findAll(item, part));\n }\n if (matches.length === 0) return null;\n scope = matches;\n }\n return (scope[0] as Element) ?? null;\n }\n const results = findAll(root, selector);\n return results[0] ?? null;\n}\n\nexport function querySelectorAllDeep(root: Document | ShadowRoot | Element, selector: string): Element[] {\n const ElementCtor = getElementCtor(root);\n if (!ElementCtor) return [];\n const elementCtor = ElementCtor;\n function walk(node: RootNode, sel: string, results: Element[]) {\n if (isElementNode(node, elementCtor) && node.matches(sel)) {\n results.push(node);\n }\n if (isElementNode(node, elementCtor) && node.shadowRoot) {\n walk(node.shadowRoot, sel, results);\n }\n for (const child of nodeChildren(node)) {\n walk(child, sel, results);\n }\n }\n\n function findAll(rootNode: RootNode, sel: string) {\n const results: Element[] = [];\n walk(rootNode, sel, results);\n return results;\n }\n\n if (selector.includes(\">>>\")) {\n const parts = selector.split(\">>>\").map((p) => p.trim()).filter(Boolean);\n let scope: RootNode[] = [root];\n for (const part of parts) {\n const matches: Element[] = [];\n for (const item of scope) {\n matches.push(...findAll(item, part));\n }\n scope = matches;\n if (scope.length === 0) return [];\n }\n return scope.filter((el): el is Element => el instanceof Element);\n }\n return findAll(root, selector);\n}\n\nexport function serializeShadowDomHelpers() {\n return {\n querySelectorDeep: querySelectorDeep.toString(),\n querySelectorAllDeep: querySelectorAllDeep.toString()\n };\n}\n","import type { Frame } from \"./Frame.js\";\n\nexport type SelectorLocatorOptions = {\n pierceShadowDom?: boolean;\n timeoutMs?: number;\n};\n\nexport type TextLocatorOptions = {\n exact?: boolean;\n timeoutMs?: number;\n};\n\nexport type RoleLocatorOptions = {\n name?: string | RegExp;\n exact?: boolean;\n includeHidden?: boolean;\n timeoutMs?: number;\n};\n\nexport type LocatorQuery =\n | { kind: \"selector\"; selector: string; options?: SelectorLocatorOptions }\n | { kind: \"text\"; text: string | RegExp; options?: TextLocatorOptions }\n | { kind: \"role\"; role: string; options?: RoleLocatorOptions };\n\nexport class Locator {\n private frame: Frame;\n private query: LocatorQuery;\n\n constructor(frame: Frame, query: LocatorQuery) {\n this.frame = frame;\n this.query = query;\n }\n\n getEvents() {\n return this.frame.getEvents();\n }\n\n getFrameId() {\n return this.frame.id;\n }\n\n describe() {\n switch (this.query.kind) {\n case \"selector\":\n return this.query.selector;\n case \"text\":\n return typeof this.query.text === \"string\" ? `text=${JSON.stringify(this.query.text)}` : `text=${this.query.text.toString()}`;\n case \"role\":\n return `role=${this.query.role}${this.query.options?.name ? ` name=${typeof this.query.options.name === \"string\" ? JSON.stringify(this.query.options.name) : this.query.options.name.toString()}` : \"\"}`;\n }\n }\n\n async click(options: { timeoutMs?: number } = {}) {\n return this.frame.clickLocator(this.query, { ...this.queryTimeoutOptions(), ...options });\n }\n\n async dblclick(options: { timeoutMs?: number } = {}) {\n return this.frame.dblclickLocator(this.query, { ...this.queryTimeoutOptions(), ...options });\n }\n\n async type(text: string, options: { timeoutMs?: number } = {}) {\n return this.frame.typeLocator(this.query, text, { ...this.queryTimeoutOptions(), ...options });\n }\n\n async exists() {\n return this.frame.existsLocator(this.query);\n }\n\n async isVisible() {\n return this.frame.isVisibleLocator(this.query);\n }\n\n async isEnabled() {\n return this.frame.isEnabledLocator(this.query);\n }\n\n async isChecked() {\n return this.frame.isCheckedLocator(this.query);\n }\n\n async text() {\n return this.frame.textLocator(this.query);\n }\n\n async value() {\n return this.frame.valueLocator(this.query);\n }\n\n async attribute(name: string) {\n return this.frame.attributeLocator(this.query, name);\n }\n\n async classes() {\n return this.frame.classesLocator(this.query);\n }\n\n async css(property: string) {\n return this.frame.cssLocator(this.query, property);\n }\n\n async hasFocus() {\n return this.frame.hasFocusLocator(this.query);\n }\n\n async isInViewport(fully = false) {\n return this.frame.isInViewportLocator(this.query, fully);\n }\n\n async isEditable() {\n return this.frame.isEditableLocator(this.query);\n }\n\n async count() {\n return this.frame.countLocator(this.query);\n }\n\n private queryTimeoutOptions() {\n return \"options\" in this.query && this.query.options?.timeoutMs ? { timeoutMs: this.query.options.timeoutMs } : {};\n }\n}\n","export type UrlGuardOptions = {\n allowFileUrl?: boolean;\n};\n\nexport function ensureAllowedUrl(url: string, options: UrlGuardOptions = {}) {\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new Error(`Invalid URL: ${url}`);\n }\n if (parsed.protocol === \"http:\" || parsed.protocol === \"https:\") {\n return;\n }\n if (parsed.protocol === \"file:\" && options.allowFileUrl) {\n return;\n }\n throw new Error(`URL protocol not allowed: ${parsed.protocol}`);\n}\n","import { ChildProcess } from \"child_process\";\nimport { Connection } from \"../cdp/Connection.js\";\nimport { Session } from \"../cdp/Session.js\";\nimport { Logger } from \"../logging/Logger.js\";\nimport { AutomationEvents } from \"./Events.js\";\nimport { Page } from \"./Page.js\";\n\nexport class BrowserContext {\n private browser: Browser;\n private id: string;\n\n constructor(browser: Browser, id: string) {\n this.browser = browser;\n this.id = id;\n }\n\n getId() {\n return this.id;\n }\n\n async newPage() {\n return this.browser.newPage({ browserContextId: this.id });\n }\n\n async close() {\n await this.browser.disposeContext(this.id);\n }\n}\n\nexport class Browser {\n private connection: Connection;\n private process: ChildProcess | null;\n private logger: Logger;\n private events: AutomationEvents;\n private cleanupTasks: Array<() => void>;\n private contexts = new Set<string>();\n readonly wsEndpoint: string;\n readonly pid: number;\n\n constructor(connection: Connection, child: ChildProcess | null, logger: Logger, events: AutomationEvents, cleanupTasks: Array<() => void> = [], wsEndpoint: string = \"\") {\n this.connection = connection;\n this.process = child;\n this.logger = logger;\n this.events = events;\n this.cleanupTasks = cleanupTasks;\n this.wsEndpoint = wsEndpoint;\n this.pid = child?.pid ?? 0;\n }\n\n on(event: \"action:start\" | \"action:end\" | \"assertion:start\" | \"assertion:end\", handler: (payload: any) => void) {\n this.events.on(event, handler as any);\n }\n\n async newContext() {\n const { browserContextId } = await this.connection.send<{ browserContextId: string }>(\"Target.createBrowserContext\");\n this.contexts.add(browserContextId);\n return new BrowserContext(this, browserContextId);\n }\n\n async newPage(options: { browserContextId?: string } = {}) {\n const { browserContextId } = options;\n const { targetId } = await this.connection.send<{ targetId: string }>(\"Target.createTarget\", {\n url: \"about:blank\",\n browserContextId\n });\n const { sessionId } = await this.connection.send<{ sessionId: string }>(\"Target.attachToTarget\", { targetId, flatten: true });\n const session = this.connection.createSession(sessionId);\n const page = new Page(session, this.logger, this.events);\n await page.initialize();\n return page;\n }\n\n /** Attach to an existing page by target ID. */\n async attachPage(targetId: string) {\n const { sessionId } = await this.connection.send<{ sessionId: string }>(\"Target.attachToTarget\", { targetId, flatten: true });\n const session = this.connection.createSession(sessionId);\n const page = new Page(session, this.logger, this.events);\n await page.initialize();\n return page;\n }\n\n /** List open page targets. */\n async pages(): Promise<Array<{ targetId: string; url: string; title: string }>> {\n const result = await this.connection.send<{ targetInfos: Array<{ targetId: string; type: string; url: string; title: string }> }>(\"Target.getTargets\");\n return result.targetInfos\n .filter((t) => t.type === \"page\")\n .map((t) => ({ targetId: t.targetId, url: t.url, title: t.title }));\n }\n\n /** Disconnect without killing the browser process. */\n async disconnect() {\n await this.connection.close();\n }\n\n async disposeContext(contextId: string) {\n if (!contextId) return;\n try {\n await this.connection.send(\"Target.disposeBrowserContext\", { browserContextId: contextId });\n } catch {\n // ignore dispose failures\n }\n this.contexts.delete(contextId);\n }\n\n async close() {\n if (this.contexts.size > 0) {\n for (const contextId of Array.from(this.contexts)) {\n await this.disposeContext(contextId);\n }\n }\n try {\n await this.connection.send(\"Browser.close\");\n } catch {\n // ignore\n }\n await this.connection.close();\n if (this.process && !this.process.killed) {\n this.process.kill();\n }\n for (const task of this.cleanupTasks) {\n try {\n task();\n } catch {\n // ignore cleanup errors\n }\n }\n }\n}\n","import fs from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport http from \"http\";\nimport https from \"https\";\nimport { spawn } from \"child_process\";\nimport yauzl from \"yauzl\";\nimport { Logger } from \"../logging/Logger.js\";\n\nexport type Platform = \"linux\" | \"mac\" | \"win\";\n\nconst SNAPSHOT_BASE = \"https://commondatastorage.googleapis.com/chromium-browser-snapshots\";\n\nexport function detectPlatform(platform = process.platform): Platform {\n if (platform === \"linux\") return \"linux\";\n if (platform === \"darwin\") return \"mac\";\n if (platform === \"win32\") return \"win\";\n throw new Error(`Unsupported platform: ${platform}`);\n}\n\nexport function platformFolder(platform: Platform) {\n if (platform === \"linux\") return \"Linux_x64\";\n if (platform === \"mac\") return \"Mac\";\n return \"Win\";\n}\n\nexport function defaultCacheRoot(platform: Platform) {\n if (platform === \"win\") {\n const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), \"AppData\", \"Local\");\n return path.join(localAppData, \"cdpwright\");\n }\n return path.join(os.homedir(), \".cache\", \"cdpwright\");\n}\n\nexport function ensureWithinRoot(root: string, target: string) {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n if (resolvedTarget === resolvedRoot) {\n return;\n }\n if (!resolvedTarget.startsWith(resolvedRoot + path.sep)) {\n throw new Error(`Path escapes cache root: ${resolvedTarget}`);\n }\n}\n\nexport function chromiumExecutableRelativePath(platform: Platform) {\n if (platform === \"linux\") return path.join(\"chrome-linux\", \"chrome\");\n if (platform === \"mac\") return path.join(\"chrome-mac\", \"Chromium.app\", \"Contents\", \"MacOS\", \"Chromium\");\n return path.join(\"chrome-win\", \"chrome.exe\");\n}\n\nfunction httpGet(url: string): typeof https {\n return url.startsWith(\"http://\") ? http as any : https;\n}\n\nfunction resolveSnapshotBase(): string {\n const mirror = process.env.CDPWRIGHT_DOWNLOAD_MIRROR;\n if (mirror && mirror.trim()) {\n return mirror.trim().replace(/\\/+$/, \"\");\n }\n return SNAPSHOT_BASE;\n}\n\nexport async function fetchLatestRevision(platform: Platform): Promise<string> {\n const base = resolveSnapshotBase();\n const folder = platformFolder(platform);\n const url = `${base}/${folder}/LAST_CHANGE`;\n return new Promise((resolve, reject) => {\n httpGet(url).get(url, (res) => {\n if (res.statusCode && res.statusCode >= 400) {\n reject(new Error(`Failed to fetch LAST_CHANGE: ${res.statusCode}`));\n return;\n }\n let data = \"\";\n res.on(\"data\", (chunk) => (data += chunk.toString()));\n res.on(\"end\", () => resolve(data.trim()));\n }).on(\"error\", reject);\n });\n}\n\nexport type DownloadOptions = {\n cacheRoot: string;\n platform: Platform;\n revision: string;\n logger: Logger;\n};\n\nexport async function ensureDownloaded(options: DownloadOptions) {\n const { cacheRoot, platform, revision, logger } = options;\n ensureWithinRoot(cacheRoot, cacheRoot);\n const platformDir = path.join(cacheRoot, platform);\n const revisionDir = path.join(platformDir, revision);\n ensureWithinRoot(cacheRoot, revisionDir);\n\n const executablePath = path.join(revisionDir, chromiumExecutableRelativePath(platform));\n const markerFile = path.join(revisionDir, \"INSTALLATION_COMPLETE\");\n\n if (fs.existsSync(executablePath) && fs.existsSync(markerFile)) {\n return { executablePath, revisionDir };\n }\n\n fs.mkdirSync(revisionDir, { recursive: true });\n\n const folder = platformFolder(platform);\n const zipName = platform === \"win\" ? \"chrome-win.zip\" : platform === \"mac\" ? \"chrome-mac.zip\" : \"chrome-linux.zip\";\n\n const explicitUrl = process.env.CDPWRIGHT_DOWNLOAD_URL?.trim();\n const base = resolveSnapshotBase();\n const downloadUrl = explicitUrl || `${base}/${folder}/${revision}/${zipName}`;\n\n const tempZipPath = path.join(os.tmpdir(), `cdpwright-${platform}-${revision}.zip`);\n\n logger.info(\"Downloading Chromium snapshot\", downloadUrl);\n await downloadFile(downloadUrl, tempZipPath, logger);\n logger.info(\"Extracting Chromium snapshot\", tempZipPath);\n await extractZipSafe(tempZipPath, revisionDir);\n fs.writeFileSync(markerFile, new Date().toISOString());\n fs.unlinkSync(tempZipPath);\n\n if (!fs.existsSync(executablePath)) {\n throw new Error(`Executable not found after extraction: ${executablePath}`);\n }\n ensureExecutable(executablePath, platform);\n\n return { executablePath, revisionDir };\n}\n\nfunction downloadFile(url: string, dest: string, logger: Logger): Promise<void> {\n return new Promise((resolve, reject) => {\n const file = fs.createWriteStream(dest);\n httpGet(url).get(url, (res) => {\n if (res.statusCode && res.statusCode >= 400) {\n reject(new Error(`Failed to download: ${res.statusCode}`));\n return;\n }\n const total = Number(res.headers[\"content-length\"] || 0);\n let downloaded = 0;\n let lastLoggedPercent = -1;\n let lastLoggedTime = Date.now();\n res.pipe(file);\n res.on(\"data\", (chunk) => {\n downloaded += chunk.length;\n if (!total) {\n const now = Date.now();\n if (now - lastLoggedTime > 2000) {\n logger.info(\"Download progress\", `${(downloaded / (1024 * 1024)).toFixed(1)} MB`);\n lastLoggedTime = now;\n }\n return;\n }\n const percent = Math.floor((downloaded / total) * 100);\n if (percent >= lastLoggedPercent + 5) {\n logger.info(\"Download progress\", `${percent}%`);\n lastLoggedPercent = percent;\n }\n });\n file.on(\"finish\", () => file.close(() => resolve()));\n }).on(\"error\", (err) => {\n fs.unlink(dest, () => reject(err));\n });\n });\n}\n\nexport async function extractZipSafe(zipPath: string, destDir: string): Promise<void> {\n return new Promise((resolve, reject) => {\n yauzl.open(zipPath, { lazyEntries: true }, (err, zipfile) => {\n if (err || !zipfile) {\n reject(err || new Error(\"Unable to open zip\"));\n return;\n }\n\n zipfile.readEntry();\n zipfile.on(\"entry\", (entry) => {\n const entryPath = entry.fileName.replace(/\\\\/g, \"/\");\n const targetPath = path.join(destDir, entryPath);\n try {\n ensureWithinRoot(destDir, targetPath);\n } catch (error) {\n zipfile.close();\n reject(error);\n return;\n }\n\n if (/\\/$/.test(entry.fileName)) {\n fs.mkdirSync(targetPath, { recursive: true });\n zipfile.readEntry();\n return;\n }\n\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n zipfile.openReadStream(entry, (streamErr, readStream) => {\n if (streamErr || !readStream) {\n zipfile.close();\n reject(streamErr || new Error(\"Unable to read zip entry\"));\n return;\n }\n const rawMode = entry.externalFileAttributes ? (entry.externalFileAttributes >>> 16) & 0xffff : 0;\n const mode = rawMode > 0 ? rawMode : undefined;\n const writeStream = fs.createWriteStream(targetPath);\n readStream.pipe(writeStream);\n writeStream.on(\"error\", (writeErr) => {\n zipfile.close();\n reject(writeErr);\n });\n writeStream.on(\"close\", () => {\n if (mode && mode <= 0o777) {\n try {\n fs.chmodSync(targetPath, mode);\n } catch {\n // ignore chmod errors\n }\n }\n zipfile.readEntry();\n });\n });\n });\n\n zipfile.on(\"end\", () => {\n zipfile.close();\n resolve();\n });\n\n zipfile.on(\"error\", (zipErr) => {\n zipfile.close();\n reject(zipErr);\n });\n });\n });\n}\n\nexport async function chromiumVersion(executablePath: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = spawn(executablePath, [\"--version\"], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let output = \"\";\n child.stdout.on(\"data\", (chunk) => (output += chunk.toString()));\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(output.trim());\n } else {\n reject(new Error(`Failed to get Chromium version: ${code}`));\n }\n });\n child.on(\"error\", reject);\n });\n}\n\nfunction ensureExecutable(executablePath: string, platform: Platform) {\n if (platform === \"win\") {\n return;\n }\n try {\n const stat = fs.statSync(executablePath);\n const isExecutable = (stat.mode & 0o111) !== 0;\n if (!isExecutable) {\n fs.chmodSync(executablePath, 0o755);\n }\n } catch {\n // ignore chmod errors\n }\n}\n","export const PINNED_REVISION = \"1567454\";\n\nexport function resolveRevision(envRevision?: string) {\n if (envRevision && envRevision.trim()) {\n return envRevision.trim();\n }\n return PINNED_REVISION;\n}\n","export class AssertionError extends Error {\n selector?: string;\n timeoutMs?: number;\n lastState?: unknown;\n\n constructor(message: string, options: { selector?: string; timeoutMs?: number; lastState?: unknown } = {}) {\n super(message);\n this.name = \"AssertionError\";\n this.selector = options.selector;\n this.timeoutMs = options.timeoutMs;\n this.lastState = options.lastState;\n }\n}\n","import { AssertionError } from \"./AssertionError.js\";\nimport { waitFor } from \"../core/Waiter.js\";\nimport { Page } from \"../core/Page.js\";\nimport { Frame } from \"../core/Frame.js\";\nimport { AutomationEvents } from \"../core/Events.js\";\nimport { Locator } from \"../core/Locator.js\";\n\nexport type ExpectSelectorOptions = {\n timeoutMs?: number;\n};\n\ntype ExpectTarget = {\n label: string;\n frameId: string;\n exists(): Promise<boolean>;\n isVisible(): Promise<boolean | null>;\n isEnabled(): Promise<boolean | null>;\n isChecked(): Promise<boolean | null>;\n text(): Promise<string | null>;\n value(): Promise<string | null>;\n attribute(name: string): Promise<string | null>;\n count(): Promise<number>;\n classes(): Promise<string[] | null>;\n css(property: string): Promise<string | null>;\n hasFocus(): Promise<boolean | null>;\n isInViewport(fully?: boolean): Promise<boolean | null>;\n isEditable(): Promise<boolean | null>;\n};\n\nclass ElementExpectation {\n private target: ExpectTarget;\n private options: ExpectSelectorOptions;\n private negate: boolean;\n private events: AutomationEvents;\n\n constructor(target: ExpectTarget, options: ExpectSelectorOptions, negate: boolean, events: AutomationEvents) {\n this.target = target;\n this.options = options;\n this.negate = negate;\n this.events = events;\n }\n\n get not() {\n return new ElementExpectation(this.target, this.options, !this.negate, this.events);\n }\n\n async toExist() {\n return this.assert(async () => {\n const exists = await this.target.exists();\n return this.negate ? !exists : exists;\n }, this.negate ? \"Expected element not to exist\" : \"Expected element to exist\");\n }\n\n async toBeVisible() {\n return this.assert(async () => {\n const visible = await this.target.isVisible();\n if (visible == null) return this.negate ? true : false;\n return this.negate ? !visible : visible;\n }, this.negate ? \"Expected element not to be visible\" : \"Expected element to be visible\");\n }\n\n async toBeHidden() {\n return this.assert(async () => {\n const visible = await this.target.isVisible();\n if (visible == null) return this.negate ? true : false;\n return this.negate ? visible : !visible;\n }, this.negate ? \"Expected element not to be hidden\" : \"Expected element to be hidden\");\n }\n\n async toBeEnabled() {\n return this.assert(async () => {\n const enabled = await this.target.isEnabled();\n if (enabled == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !enabled : enabled;\n }, this.negate ? \"Expected element not to be enabled\" : \"Expected element to be enabled\");\n }\n\n async toBeDisabled() {\n return this.assert(async () => {\n const enabled = await this.target.isEnabled();\n if (enabled == null) {\n return this.negate ? true : false;\n }\n const disabled = !enabled;\n return this.negate ? !disabled : disabled;\n }, this.negate ? \"Expected element not to be disabled\" : \"Expected element to be disabled\");\n }\n\n async toBeChecked() {\n return this.assert(async () => {\n const checked = await this.target.isChecked();\n if (checked == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !checked : checked;\n }, this.negate ? \"Expected element not to be checked\" : \"Expected element to be checked\");\n }\n\n async toBeUnchecked() {\n return this.assert(async () => {\n const checked = await this.target.isChecked();\n if (checked == null) {\n return this.negate ? true : false;\n }\n const unchecked = !checked;\n return this.negate ? !unchecked : unchecked;\n }, this.negate ? \"Expected element not to be unchecked\" : \"Expected element to be unchecked\");\n }\n\n async toHaveText(textOrRegex: string | RegExp) {\n const expected = textOrRegex;\n return this.assert(async () => {\n const text = await this.target.text();\n if (text == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(text)\n : text.includes(expected);\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element text not to match\" : \"Expected element text to match\", { expected });\n }\n\n async toHaveExactText(textOrRegex: string | RegExp) {\n const expected = textOrRegex;\n return this.assert(async () => {\n const text = await this.target.text();\n if (text == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(text)\n : text === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element text not to match exactly\" : \"Expected element text to match exactly\", { expected });\n }\n\n async toContainText(textOrRegex: string | RegExp) {\n const expected = textOrRegex;\n return this.assert(async () => {\n const text = await this.target.text();\n if (text == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(text)\n : text.includes(expected);\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element text not to contain\" : \"Expected element text to contain\", { expected });\n }\n\n async toHaveValue(valueOrRegex: string | RegExp) {\n const expected = valueOrRegex;\n return this.assert(async () => {\n const value = await this.target.value();\n if (value == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(value)\n : value === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element value not to match\" : \"Expected element value to match\", { expected });\n }\n\n async toHaveAttribute(name: string, valueOrRegex?: string | RegExp) {\n const expected = valueOrRegex;\n return this.assert(async () => {\n const value = await this.target.attribute(name);\n if (expected === undefined) {\n const exists = value != null;\n return this.negate ? !exists : exists;\n }\n if (value == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(value)\n : value === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element attribute not to match\" : \"Expected element attribute to match\", { expected, name });\n }\n\n async toHaveId(idOrRegex: string | RegExp) {\n return this.toHaveAttribute(\"id\", idOrRegex);\n }\n\n async toHaveName(nameOrRegex: string | RegExp) {\n return this.toHaveAttribute(\"name\", nameOrRegex);\n }\n\n async toHaveCount(expected: number) {\n return this.assert(async () => {\n const count = await this.target.count();\n const matches = count === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element count not to match\" : \"Expected element count to match\", { expected });\n }\n\n async toHaveClass(nameOrRegex: string | RegExp) {\n const expected = nameOrRegex;\n return this.assert(async () => {\n const classes = await this.target.classes();\n if (classes == null) {\n return this.negate ? true : false;\n }\n const matches = expected instanceof RegExp\n ? classes.some((value) => new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(value))\n : classes.includes(expected);\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element class not to match\" : \"Expected element class to match\", { expected });\n }\n\n async toHaveClasses(expected: string[]) {\n return this.assert(async () => {\n const classes = await this.target.classes();\n if (classes == null) {\n return this.negate ? true : false;\n }\n const matches = expected.every((value) => classes.includes(value));\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element classes not to match\" : \"Expected element classes to match\", { expected });\n }\n\n async toHaveCss(property: string, valueOrRegex: string | RegExp) {\n const expected = valueOrRegex;\n return this.assert(async () => {\n const value = await this.target.css(property);\n if (value == null) {\n return this.negate ? true : false;\n }\n const actual = value.trim();\n const matches = expected instanceof RegExp\n ? new RegExp(expected.source, expected.flags.replace(\"g\", \"\")).test(actual)\n : actual === expected;\n return this.negate ? !matches : matches;\n }, this.negate ? \"Expected element css not to match\" : \"Expected element css to match\", { expected, property });\n }\n\n async toHaveFocus() {\n return this.assert(async () => {\n const focused = await this.target.hasFocus();\n if (focused == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !focused : focused;\n }, this.negate ? \"Expected element not to have focus\" : \"Expected element to have focus\");\n }\n\n async toBeInViewport(options: { fully?: boolean } = {}) {\n return this.assert(async () => {\n const inViewport = await this.target.isInViewport(Boolean(options.fully));\n if (inViewport == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !inViewport : inViewport;\n }, this.negate ? \"Expected element not to be in viewport\" : \"Expected element to be in viewport\");\n }\n\n async toBeEditable() {\n return this.assert(async () => {\n const editable = await this.target.isEditable();\n if (editable == null) {\n return this.negate ? true : false;\n }\n return this.negate ? !editable : editable;\n }, this.negate ? \"Expected element not to be editable\" : \"Expected element to be editable\");\n }\n\n private async assert(predicate: () => Promise<boolean>, message: string, details: Record<string, unknown> = {}) {\n const timeoutMs = this.options.timeoutMs ?? 30_000;\n const start = Date.now();\n this.events.emit(\"assertion:start\", { name: message, selector: this.target.label, frameId: this.target.frameId });\n\n let lastState: unknown;\n try {\n await waitFor(async () => {\n const result = await predicate();\n lastState = result;\n return result;\n }, { timeoutMs, description: message });\n } catch {\n const duration = Date.now() - start;\n this.events.emit(\"assertion:end\", { name: message, selector: this.target.label, frameId: this.target.frameId, durationMs: duration, status: \"failed\" });\n throw new AssertionError(message, { selector: this.target.label, timeoutMs, lastState: { lastState, ...details } });\n }\n\n const duration = Date.now() - start;\n this.events.emit(\"assertion:end\", { name: message, selector: this.target.label, frameId: this.target.frameId, durationMs: duration, status: \"passed\" });\n }\n}\n\nfunction frameTarget(frame: Frame, selector: string, options: ExpectSelectorOptions): ExpectTarget {\n return {\n label: selector,\n frameId: frame.id,\n exists: () => frame.exists(selector, options),\n isVisible: () => frame.isVisible(selector, options),\n isEnabled: () => frame.isEnabled(selector, options),\n isChecked: () => frame.isChecked(selector, options),\n text: () => frame.text(selector, options),\n value: () => frame.value(selector, options),\n attribute: (name: string) => frame.attribute(selector, name, options),\n count: () => frame.count(selector, options),\n classes: () => frame.classes(selector, options),\n css: (property: string) => frame.css(selector, property, options),\n hasFocus: () => frame.hasFocus(selector, options),\n isInViewport: (fully = false) => frame.isInViewport(selector, options, fully),\n isEditable: () => frame.isEditable(selector, options)\n };\n}\n\nfunction locatorTarget(locator: Locator): ExpectTarget {\n return {\n label: locator.describe(),\n frameId: locator.getFrameId(),\n exists: () => locator.exists(),\n isVisible: () => locator.isVisible(),\n isEnabled: () => locator.isEnabled(),\n isChecked: () => locator.isChecked(),\n text: () => locator.text(),\n value: () => locator.value(),\n attribute: (name: string) => locator.attribute(name),\n count: () => locator.count(),\n classes: () => locator.classes(),\n css: (property: string) => locator.css(property),\n hasFocus: () => locator.hasFocus(),\n isInViewport: (fully = false) => locator.isInViewport(fully),\n isEditable: () => locator.isEditable()\n };\n}\n\nclass ExpectFrame {\n private frame: Frame;\n private events: AutomationEvents;\n\n constructor(frame: Frame, events: AutomationEvents) {\n this.frame = frame;\n this.events = events;\n }\n\n element(selector: string, options: ExpectSelectorOptions = {}) {\n return new ElementExpectation(frameTarget(this.frame, selector, options), options, false, this.events);\n }\n}\n\nexport function expect(page: Page): { element: (selector: string, options?: ExpectSelectorOptions) => ElementExpectation; frame: (options: { name?: string; urlIncludes?: string; predicate?: (frame: Frame) => boolean }) => ExpectFrame };\nexport function expect(locator: Locator): ElementExpectation;\nexport function expect(target: Page | Locator) {\n if (target instanceof Locator) {\n return new ElementExpectation(locatorTarget(target), {}, false, target.getEvents());\n }\n return {\n element: (selector: string, options: ExpectSelectorOptions = {}) => new ElementExpectation(frameTarget(target.mainFrame(), selector, options), options, false, target.getEvents()),\n frame: (options: { name?: string; urlIncludes?: string; predicate?: (frame: Frame) => boolean }) => {\n const frame = target.frame(options);\n if (!frame) {\n throw new AssertionError(\"Frame not found\", { selector: JSON.stringify(options) });\n }\n return new ExpectFrame(frame, target.getEvents());\n }\n };\n}\n\nexport type { ElementExpectation, ExpectFrame };\n\n// Convenience: page.expect().element(\"selector\") or page.expect(\"selector\").toExist()\ndeclare module \"../core/Page.js\" {\n interface Page {\n expect(): ReturnType<typeof expect>;\n expect(selector: string, options?: ExpectSelectorOptions): ElementExpectation;\n expect(locator: Locator): ElementExpectation;\n find: {\n locators: (options?: { highlight?: boolean; outputPath?: string; outputJson?: string; outputHtml?: string }) => Promise<any[]>;\n };\n findLocators(options?: { highlight?: boolean; outputPath?: string; outputJson?: string; outputHtml?: string }): Promise<any[]>;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(Page.prototype as any).expect = function(target?: string | Locator, options?: ExpectSelectorOptions) {\n const builder = expect(this as Page);\n if (target instanceof Locator) {\n return expect(target);\n }\n if (target) {\n return builder.element(target, options);\n }\n return builder;\n};\n\nObject.defineProperty(Page.prototype, \"find\", {\n get: function() {\n return {\n locators: (options?: { highlight?: boolean; outputPath?: string; outputJson?: string; outputHtml?: string }) =>\n (this as Page).findLocators(options)\n };\n }\n});\n","import { ChromiumManager, LaunchOptions } from \"./browser/ChromiumManager.js\";\nimport { Connection } from \"./cdp/Connection.js\";\nimport { Browser, BrowserContext } from \"./core/Browser.js\";\nimport { Page } from \"./core/Page.js\";\nimport { Frame } from \"./core/Frame.js\";\nimport { Locator } from \"./core/Locator.js\";\nimport { Logger, LogLevel } from \"./logging/Logger.js\";\nimport { AutomationEvents } from \"./core/Events.js\";\nimport { expect } from \"./assert/expect.js\";\nimport { AssertionError } from \"./assert/AssertionError.js\";\n\nexport type AutomatonLaunchOptions = LaunchOptions & {\n logger?: Logger;\n};\n\nexport type ConnectOptions = {\n logLevel?: LogLevel;\n logger?: Logger;\n logEvents?: boolean;\n logActions?: boolean;\n logAssertions?: boolean;\n};\n\nexport const automaton = {\n async launch(options: AutomatonLaunchOptions = {}): Promise<Browser> {\n const manager = new ChromiumManager(options.logger);\n return manager.launch(options);\n },\n\n async connect(wsEndpoint: string, options: ConnectOptions = {}): Promise<Browser> {\n const logger = options.logger ?? new Logger(options.logLevel ?? \"warn\");\n const connection = new Connection(wsEndpoint, logger);\n await connection.waitForOpen();\n const events = new AutomationEvents();\n const logEvents = options.logEvents ?? true;\n const logActions = options.logActions ?? true;\n const logAssertions = options.logAssertions ?? true;\n if (logEvents && logActions) {\n events.on(\"action:end\", (payload) => {\n const selector = payload.sensitive ? undefined : payload.selector;\n const args: string[] = [];\n if (selector) args.push(selector);\n if (typeof payload.durationMs === \"number\") args.push(`${payload.durationMs}ms`);\n logger.info(`Action ${payload.name}`, ...args);\n });\n }\n if (logEvents && logAssertions) {\n events.on(\"assertion:end\", (payload) => {\n const args: string[] = [];\n if (payload.selector) args.push(payload.selector);\n if (typeof payload.durationMs === \"number\") args.push(`${payload.durationMs}ms`);\n logger.info(`Assertion ${payload.name}`, ...args);\n });\n }\n return new Browser(connection, null, logger, events, [], wsEndpoint);\n }\n};\n\nexport const chromium = automaton;\n\nexport { Browser, BrowserContext, Page, Frame, Locator, Logger, LogLevel, AutomationEvents, expect, AssertionError };\n"],"mappings":"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","names":["fs","path","fs","path","os","http","spawn","EventEmitter","EventEmitter","EventEmitter","fs","path","results","params","result","path","fs","fs","path","path","fs","ensureExecutable","os","spawn","args","http","duration","path","fs"]}