626d06327c
New domain `browser` under frontend/functions/ with 6 Playwright helpers: - pw_launch_browser: chromium + context + page bootstrap with storageState support and baseUrl navigation. - pw_kanban_login: authenticates a Page against /api/auth/login; sets the kanban_session cookie via shared storageState; verifies login page no longer visible after navigation. - pw_drag_drop: human-like pointer drag (mousedown + activateOffset + stepped move + mouseup) compatible with @dnd-kit/core's 8px activation threshold; supports hoverMs for time-based dropzones. - pw_keyboard_sequence: ordered focus/type/press/wait steps for scripting realistic input flows (typing then arrow-key navigating autocompletes). - pw_wait_predicate: thin wrapper over page.waitForFunction with friendlier defaults and custom error messages. - pw_assert_class: poll-based assertion that a Locator has/lacks a CSS class within a timeout; useful for visual-state checks. Each function ships with vitest tests (5-8 cases each) covering both happy and error paths, plus self-documenting .md (Ejemplo + Cuando usarla + Gotchas + frontmatter with params/output schema). Adds frontend/functions/package.json with `"type": "module"` so consumers can ESM-import the .ts files from anywhere in the registry (Playwright's tsx loader respects nearest package.json). Capability page docs/capabilities/playwright.md documents the group with a canonical end-to-end example, frontiers, prerequisites, and gotchas. Index updated. First consumer (issue 0088): apps/kanban requester-input.spec.ts. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2.7 KiB
2.7 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params | output | tested | tests | test_file_path | file_path | |||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| pw_wait_predicate | function | ts | browser | 1.0.0 | impure | async <T = unknown>(page: Page, predicate: string | ((arg?: unknown) => unknown), opts?: PwWaitOptions) => Promise<T> | Polls an arbitrary predicate inside the page context until it returns truthy or times out. Thin wrapper around page.waitForFunction with friendlier defaults and custom error messages. Use to wait for CSS class changes, DOM counts, or any computed condition. |
|
false | error_go_core |
|
Resolved value of the predicate (page.waitForFunction jsonValue). | true |
|
frontend/functions/browser/pw_wait_predicate.test.ts | frontend/functions/browser/pw_wait_predicate.ts |
Ejemplo
import { pw_wait_predicate } from "./pw_wait_predicate";
// Wait for at least one red-bordered card to appear
await pw_wait_predicate(
page,
() => document.querySelectorAll('[data-card-id].border-red').length > 0,
{ timeoutMs: 2000, message: "no red-bordered card appeared" },
);
// Wait for exactly 1 highlighted card using an arg
await pw_wait_predicate(
page,
(sel) => document.querySelectorAll(sel as string).length === 1,
{ arg: ".highlighted", timeoutMs: 3000, pollMs: 50 },
);
Cuando usarla
Cuando waitForSelector no basta porque la condicion depende de una clase CSS compuesta, un conteo exacto de elementos, o cualquier expresion calculada en el contexto de la pagina. Usar antes de assertions que requieren un estado DOM especifico que tarda en estabilizarse.
Gotchas
predicatese ejecuta en el contexto de la pagina (sandbox del browser), no en Node. No puede cerrar sobre variables de Node; usaopts.argpara pasar datos.- Si
predicatees una funcion, Playwright la serializa a string para enviarla al browser. No uses referencias externas ni closures de Node dentro de ella. opts.messagesolo se usa cuandowaitForFunctionlanza; no modifica el valor de retorno en caso de exito.playwrightdebe estar instalada en el proyecto consumidor como peer dependency. El registry no la instala.- Con
polling: number, Playwright hace polling activo (busy loop con sleeps cortos). UnpollMsmuy bajo (< 50) puede saturar la CPU del browser en tests largos.