Files
fn_registry/frontend/functions/browser/pw_wait_predicate.md
T
egutierrez 626d06327c feat(registry): add playwright capability group (6 TS browser fns)
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>
2026-05-14 12:57:30 +02:00

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.
playwright
e2e
browser
wait
false error_go_core
name desc
page Playwright Page.
name desc
predicate JS expression as string OR function evaluated in page context. Returns truthy to stop polling.
name desc
opts {timeoutMs?, pollMs?, arg?, message?}.
Resolved value of the predicate (page.waitForFunction jsonValue). true
defaults applied
arg passed through
jsonValue returned
message wraps timeout
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

  • predicate se ejecuta en el contexto de la pagina (sandbox del browser), no en Node. No puede cerrar sobre variables de Node; usa opts.arg para pasar datos.
  • Si predicate es una funcion, Playwright la serializa a string para enviarla al browser. No uses referencias externas ni closures de Node dentro de ella.
  • opts.message solo se usa cuando waitForFunction lanza; no modifica el valor de retorno en caso de exito.
  • playwright debe 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). Un pollMs muy bajo (< 50) puede saturar la CPU del browser en tests largos.