Status: done
作为测试开发者, 我想要创建订单管理的 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
✅ Story 10.1 完成实现
创建了订单管理 Page Object (web/tests/e2e/pages/admin/order-management.page.ts),包含以下功能:
类型定义和常量:
ORDER_STATUS - 订单状态常量(草稿、已确认、进行中、已完成)WORK_STATUS - 工作状态常量(未就业、待就业、已就业、已离职)ORDER_STATUS_LABELS / WORK_STATUS_LABELS - 状态显示名称映射OrderData 接口 - 订单数据类型OrderPersonData 接口 - 订单人员数据类型NetworkResponse 接口 - 网络响应类型FormSubmitResult 接口 - 表单提交结果类型页面基础功能:
goto() - 导航到订单管理页面expectToBeVisible() - 验证关键元素可见搜索和筛选:
searchByName() - 按订单名称搜索openFilterDialog() - 打开高级筛选对话框setFilters() - 设置筛选条件(状态、平台、公司、渠道、日期范围)applyFilters() - 应用筛选clearFilters() - 清空筛选订单 CRUD:
openCreateDialog() - 打开创建订单对话框openEditDialog() - 打开编辑订单对话框openDeleteDialog() - 打开删除确认对话框fillOrderForm() - 填写订单表单submitForm() - 提交表单(包含网络响应监听和 Toast 消息验证)cancelDialog() - 取消对话框confirmDelete() - 确认删除cancelDelete() - 取消删除orderExists() - 验证订单是否存在高级操作(完整流程):
createOrder() - 创建订单(完整流程)editOrder() - 编辑订单(完整流程)deleteOrder() - 删除订单(完整流程)订单详情:
openDetailDialog() - 打开订单详情对话框getOrderDetailInfo() - 获取订单详情中的基本信息人员关联管理:
openPersonManagementDialog() - 打开人员管理对话框addPersonToOrder() - 添加人员到订单updatePersonWorkStatus() - 修改人员工作状态附件管理:
openAddAttachmentDialog() - 打开添加附件对话框uploadAttachment() - 上传附件实现要点:
@d8d/e2e-test-utils 的 selectRadixOption 和 selectRadixOptionAsync 处理 Radix UI 组件role + name 组合选择器,符合项目无障碍测试标准data-sonner-toast 属性)注意: 实际 DOM 结构和选择器可能需要根据实际页面实现进行调整,建议在编写测试时通过浏览器开发工具验证。
web/tests/e2e/pages/admin/order-management.page.ts)