// apps/web/e2e/pages/patient-list.page.ts import type { Page } from '@playwright/test'; export class PatientListPage { readonly page: Page; constructor(page: Page) { this.page = page; } async goto() { await this.page.goto('/#/health/patients'); await this.page.waitForSelector('.ant-table', { timeout: 15000 }); } async clickCreate() { await this.page.click('button:has-text("新增"), button:has-text("新建"), button:has-text("创建")'); await this.page.waitForSelector('.ant-modal, .ant-drawer', { timeout: 5000 }); } async fillCreateForm(data: { name: string; gender?: string; birth_date?: string }) { const drawer = this.page.locator('.ant-drawer'); await drawer.locator('input').first().waitFor({ state: 'visible' }); await this.page.locator('.ant-drawer [name="name"] input, .ant-drawer input').first().fill(data.name); if (data.gender) { await drawer.locator('.ant-select').first().click(); await this.page.locator(`.ant-select-item-option:has-text("${data.gender === 'male' ? '男' : '女'}")`).first().click(); } if (data.birth_date) { await drawer.locator('[name="birth_date"] input, input[placeholder*="出生"]').fill(data.birth_date); } } async submitForm() { await this.page.click('.ant-drawer button.ant-btn-primary, button:has-text("保存"), .ant-modal .ant-btn-primary'); await this.page.waitForSelector('.ant-message-success', { timeout: 10000 }); } async searchPatient(name: string) { const searchInput = this.page.locator('input[placeholder*="搜索"]').first(); await searchInput.fill(name); await searchInput.press('Enter'); await this.page.waitForTimeout(1000); } async clickPatientRow(row: number) { const rows = this.page.locator('.ant-table-tbody tr'); await rows.nth(row).click(); } async clickPatientByName(name: string) { await this.searchPatient(name); const row = this.page.locator(`.ant-table-tbody tr:has-text("${name}")`).first(); await row.click(); } async getTableRowCount(): Promise { return this.page.locator('.ant-table-tbody tr').count(); } async hasPatientInTable(name: string): Promise { await this.searchPatient(name); const count = await this.page.locator(`.ant-table-tbody tr:has-text("${name}")`).count(); return count > 0; } }