// apps/web/e2e/pages/login.page.ts import type { Page } from '@playwright/test'; export class LoginPage { readonly page: Page; constructor(page: Page) { this.page = page; } async goto() { await this.page.goto('/#/login'); await this.page.waitForSelector('.ant-card, .ant-form'); } async fillUsername(username: string) { await this.page.fill('input[id="username"], input[placeholder*="用户名"]', username); } async fillPassword(password: string) { await this.page.fill('input[type="password"]', password); } async clickSubmit() { await this.page.click('button[type="submit"]'); } async login(username: string, password: string) { await this.goto(); await this.fillUsername(username); await this.fillPassword(password); await this.clickSubmit(); } async getErrorMessage(): Promise { const el = this.page.locator('.ant-form-item-explain-error, .ant-message-error, .ant-alert-error'); return el.first().textContent() ?? ''; } async isLoggedIn(): Promise { try { await this.page.waitForURL('**/#/', { timeout: 5000 }); return true; } catch { return false; } } }