import type { Page } from "playwright"; /** * A single step in a keyboard interaction sequence. * * - `focus` — focuses a DOM element via CSS selector. * - `type` — types text character by character with a humanlike delay. * - `press` — sends a single named key (e.g. "ArrowDown", "Enter", "Escape", "Tab"). * - `wait` — pauses execution for the given number of milliseconds. */ export type KbStep = | { kind: "focus"; selector: string } | { kind: "type"; text: string; delayMs?: number } | { kind: "press"; key: string } | { kind: "wait"; ms: number }; /** * pw_keyboard_sequence — executes an ordered sequence of keyboard interactions on a Playwright Page. * * Use to script realistic input flows such as typing into an autocomplete field and then * navigating its dropdown with arrow keys before pressing Enter. */ export async function pw_keyboard_sequence( page: Page, sequence: KbStep[] ): Promise { for (const step of sequence) { switch (step.kind) { case "focus": await page.locator(step.selector).first().focus(); break; case "type": await page.keyboard.type(step.text, { delay: step.delayMs ?? 30 }); break; case "press": await page.keyboard.press(step.key); break; case "wait": await page.waitForTimeout(step.ms); break; default: { // TypeScript exhaustiveness check — will also throw at runtime for JS callers. const _exhaustive: never = step; throw new Error( `pw_keyboard_sequence: unknown step kind "${(step as KbStep & { kind: string }).kind}"` ); } } } }