import type { Page, Locator } from '@playwright/test'; export class RecoverPage { readonly page: Page; readonly nameInput: Locator; readonly pinInput: Locator; readonly submitButton: Locator; readonly errorMessage: Locator; constructor(page: Page) { this.page = page; this.nameInput = page.getByTestId('recover-name-input'); this.pinInput = page.getByTestId('recover-pin-input'); this.submitButton = page.getByTestId('recover-submit'); this.errorMessage = page.getByTestId('recover-error'); } async goto() { await this.page.goto('/recover'); } async recover(name: string, pin: string) { await this.nameInput.fill(name); // Filling the 4th digit fires the form's auto-submit ($effect on // pin.length === 4, see pin-auto-submit.spec). An explicit submit click would // race the ensuing navigation and detach mid-click, so only click as a // fallback if the button is still around (e.g. a partial / failed PIN). await this.pinInput.fill(pin); if (await this.submitButton.isEnabled().catch(() => false)) { await this.submitButton.click().catch(() => { /* auto-submit already navigated — nothing to click */ }); } } }