Shuffle/e2e/support/flutter.ts
cschlaefke b9c41bee64 test(catalog): Playwright-E2E fuer die Katalogsuche (web und api)
Web: Suche per Schaltflaeche, Relevanz, alternative Titel, Verlage, Filter,
Nachladen, leere Zustaende, URL/Reload/Zurueck, Offline. API: RPC als anon
ueber Kong inkl. Fehlerfaellen. Eigene Datensets je Spec-Datei.

Refs #3

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 19:18:57 +01:00

44 lines
1.8 KiB
TypeScript

/**
* Flutter-Web-Helfer ohne Abhaengigkeit von `auth-config.ts` (Projekte `web` und `perf`).
*
* Flutter zeichnet auf ein Canvas; Playwright sieht Elemente erst, wenn der Semantics-Baum
* eingeschaltet ist (Platzhalter `flt-semantics-placeholder`). `perf` darf gegen eine fremde
* Umgebung laufen und importiert deshalb nichts, was lokale Auth-Konstanten voraussetzt.
*/
import { expect, type Locator, type Page } from '@playwright/test';
/**
* Sichtbarer Text im Semantics-Baum. Flutter legt Texte teils als Textknoten, teils als
* `aria-label` ab (z. B. der Inhalt der CheckEmail-Seite).
*/
export function textOf(page: Page, text: string | RegExp): Locator {
return page.getByText(text).or(page.getByLabel(text)).first();
}
/** Schaltet den Semantics-Baum ein (einmal je Seitenladen). */
export async function enableSemantics(page: Page): Promise<void> {
const placeholder = page.locator('flt-semantics-placeholder');
await placeholder.waitFor({ state: 'attached' });
await placeholder.evaluate((el: HTMLElement) => el.click());
await page.locator('flt-semantics').first().waitFor({ state: 'attached' });
}
/** Navigiert und schaltet Semantics ein. */
export async function open(page: Page, path: string): Promise<void> {
await page.goto(path);
await enableSemantics(page);
}
/**
* Fuellt ein Flutter-Textfeld. Das Semantics-Textfeld legt das echte <input> erst beim Fokus an;
* `fill` allein geht dann gelegentlich verloren. Deshalb klicken, fuellen und den Wert pruefen
* (mit Wiederholung).
*/
export async function fillField(field: Locator, value: string): Promise<void> {
await expect(async () => {
await field.click();
await field.fill('');
await field.pressSequentially(value);
await expect(field).toHaveValue(value, { timeout: 1_000 });
}).toPass({ timeout: 15_000 });
}