// apps/web/e2e/pages/patient-detail.page.ts import type { Page } from '@playwright/test'; export class PatientDetailPage { readonly page: Page; constructor(page: Page) { this.page = page; } async goto(id: string) { await this.page.goto(`/#/health/patients/${id}`); await this.page.waitForSelector('.ant-descriptions, .ant-tabs', { timeout: 10000 }); } async getPatientName(): Promise { const el = this.page.locator('div[style*="font-weight"]').first(); return el.textContent() ?? ''; } async clickTab(tabName: string) { await this.page.click(`.ant-tabs-tab:has-text("${tabName}")`); await this.page.waitForTimeout(500); } async getVitalSignsCount(): Promise { return this.page.locator('.ant-table-tbody tr').count(); } async clickAssignDoctor() { await this.page.click('button:has-text("分配医生")'); await this.page.waitForSelector('.ant-modal, .ant-drawer', { timeout: 5000 }); } async selectDoctor(doctorName: string) { await this.page.click('.ant-select'); await this.page.click(`.ant-select-item-option:has-text("${doctorName}")`); } async confirmAssign() { await this.page.click('.ant-modal button[type="submit"], .ant-btn-primary'); await this.page.waitForSelector('.ant-message-success', { timeout: 5000 }); } }