Status: ready-for-dev
作为测试开发者, 我想要创建订单管理的 Page Object, 以便组织订单管理相关的页面元素和操作。
Given Epic 9 的 Page Object 模式已验证
When 创建 web/tests/e2e/pages/admin/order-management.page.ts
Then 定义订单列表页面的选择器和操作方法
And 定义创建订单表单的选择器和操作方法
And 定义编辑订单表单的选择器和操作方法
And 定义订单详情对话框的选择器和操作方法
And 定义人员关联相关的选择器和操作方法
And 定义附件上传相关的选择器和操作方法
And 遵循现有 Page Object 设计模式
And 所有方法有完整的 TypeScript 类型定义
参考:
web/tests/e2e/pages/admin/disability-person.page.ts 作为参考web/tests/e2e/pages/admin/region-management.page.ts 作为参考Epic 10: 订单管理 E2E 测试 (Epic C - 业务测试 Epic)
依赖:
根据 epics.md,订单管理涉及以下核心功能:
本项目已建立成熟的 Page Object 设计模式,参考以下文件:
1. disability-person.page.ts (残疾人管理 - 复杂表单示例)
web/tests/e2e/pages/admin/disability-person.page.ts@d8d/e2e-test-utils 的 selectRadixOption 和 selectProvinceCityconsole.debug2. region-management.page.ts (区域管理 - 业务模块示例)
web/tests/e2e/pages/admin/region-management.page.ts导入依赖:
import { Page, Locator } from '@playwright/test';
import { selectRadixOption, selectRadixOptionAsync } from '@d8d/e2e-test-utils';
选择器策略:
data-testid 属性role + name 组合(如 getByRole('button', { name: '新增订单' }))exact: true 避免误匹配网络响应监听模式:
// 收集网络响应
const responses: NetworkResponse[] = [];
// 监听所有网络请求
this.page.on('response', async (response: Response) => {
const url = response.url();
if (url.includes('/orders') || url.includes('order')) {
// 收集响应数据
}
});
// 执行操作后等待网络空闲
await this.page.waitForLoadState('networkidle', { timeout: 10000 });
Toast 消息验证:
const errorToast = this.page.locator('[data-sonner-toast][data-type="error"]');
const successToast = this.page.locator('[data-sonner-toast][data-type="success"]');
文件位置:
web/tests/e2e/pages/admin/order-management.page.tsweb/tests/e2e/specs/admin/web/tests/e2e/fixtures/对齐统一项目结构:
project-context.md 中的 TypeScript 严格模式规则any 类型遵循以下测试标准文档(来自 epics.md):
docs/standards/testing-standards.md - 测试规范docs/standards/web-ui-testing-standards.md - Web UI 测试规范docs/standards/e2e-radix-testing.md - Radix UI E2E 测试标准(核心)选择器优先级(来自 e2e-radix-testing.md):
data-testid - 最高优先级aria-label + roletext content + role - 兜底错误消息格式标准:
Error: 操作失败
上下文信息
💡 修复建议
基于 region-management.page.ts 的类型定义模式:
/**
* 订单状态常量
*/
export const ORDER_STATUS = {
DRAFT: 'draft',
CONFIRMED: 'confirmed',
IN_PROGRESS: 'in_progress',
COMPLETED: 'completed',
} as const;
/**
* 工作状态常量
*/
export const WORK_STATUS = {
NOT_EMPLOYED: 'not_employed',
PENDING: 'pending',
EMPLOYED: 'employed',
RESIGNED: 'resigned',
} as const;
/**
* 订单数据接口
*/
export interface OrderData {
/** 订单名称 */
name: string;
/** 预计开始日期 */
expectedStartDate?: string;
/** 平台ID */
platformId?: number;
/** 公司ID */
companyId?: number;
/** 渠道ID */
channelId?: number;
/** 订单状态 */
status?: typeof ORDER_STATUS[keyof typeof ORDER_STATUS];
/** 工作状态 */
workStatus?: typeof WORK_STATUS[keyof typeof WORK_STATUS];
}
/**
* 订单人员数据接口
*/
export interface OrderPersonData {
/** 残疾人ID */
disabledPersonId: number;
/** 入职日期 */
hireDate?: string;
/** 薪资 */
salary?: number;
/** 工作状态 */
workStatus?: typeof WORK_STATUS[keyof typeof WORK_STATUS];
/** 实际入职日期 */
actualHireDate?: string;
/** 离职日期 */
resignDate?: string;
}
/**
* 网络响应数据
*/
export interface NetworkResponse {
url: string;
method: string;
status: number;
ok: boolean;
responseHeaders: Record<string, string>;
responseBody: unknown;
}
/**
* 表单提交结果
*/
export interface FormSubmitResult {
/** 提交是否成功 */
success: boolean;
/** 是否有错误 */
hasError: boolean;
/** 是否有成功消息 */
hasSuccess: boolean;
/** 错误消息 */
errorMessage?: string;
/** 成功消息 */
successMessage?: string;
/** 网络响应列表 */
responses?: NetworkResponse[];
}
注意: 以下元素基于 PRD 描述,实际实现时需要通过浏览器开发工具验证 DOM 结构。
订单列表页面:
/admin/orders(待确认)订单表单:
订单详情对话框:
人员管理对话框:
附件上传对话框:
表单调试:
// 在 form.handleSubmit 的第二个参数中添加 console.debug
form.handleSubmit(handleSubmit, (errors) => console.debug('表单验证错误:', errors))
E2E 测试失败调试:
test-results/**/error-context.mdtimeout 命令限制运行时间timeout 60 pnpm test:e2e:chromium <测试文件名>claude-opus-4-5-20251101