From c0599fd7b1cc97849b8fe616936570f71bee4ab4 Mon Sep 17 00:00:00 2001 From: zhangxiang Date: Sun, 12 Apr 2026 08:50:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(user-management):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86=E6=B5=8B=E8=AF=95=20-=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7=E5=88=9B=E5=BB=BAAPI?= =?UTF-8?q?=E5=92=8C=E6=A8=A1=E6=80=81=E6=A1=86=E7=AD=89=E5=BE=85=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - 用户管理页面输入框缺少name属性 - API缺少POST方法处理用户创建 - 测试未等待模态框打开 修复: 1. 应用代码:为创建/编辑模态框的输入框添加name属性 2. API:添加POST方法处理用户创建请求 3. 测试:增加模态框等待逻辑和详细日志 测试结果: - Chromium: ✓ 通过 - Firefox: ✓ 通过 --- e2e/pages/AdminUserPage.ts | 51 +++++++++++++++++++++++++++++--- src/app/admin/users/page.tsx | 8 +++++ src/app/api/admin/users/route.ts | 41 ++++++++++++++++++++++++- 3 files changed, 95 insertions(+), 5 deletions(-) diff --git a/e2e/pages/AdminUserPage.ts b/e2e/pages/AdminUserPage.ts index df2e802..062ead8 100644 --- a/e2e/pages/AdminUserPage.ts +++ b/e2e/pages/AdminUserPage.ts @@ -17,15 +17,30 @@ export class AdminUserPage { } async createUser(data: UserData) { - await this.goto(); + console.log('开始创建用户:', data.email); + await this.goto(); await this.page.waitForLoadState('domcontentloaded'); - await this.page.waitForTimeout(1000); + + console.log('页面加载完成,准备点击添加用户按钮'); const addButton = this.page.locator('button:has-text("添加用户")'); await addButton.waitFor({ timeout: 10000, state: 'visible' }); await addButton.click(); + console.log('已点击添加用户按钮,等待模态框打开'); + + await this.page.waitForTimeout(500); + + await this.page.waitForSelector('.fixed.inset-0.bg-black.bg-opacity-50', { + timeout: 5000, + state: 'visible' + }); + + console.log('模态框已打开,等待表单加载'); + + await this.page.waitForTimeout(300); + await this.page.waitForSelector('input[name="email"]', { timeout: 5000, state: 'visible' }); await this.page.fill('input[name="email"]', data.email); await this.page.fill('input[name="password"]', data.password); @@ -38,12 +53,40 @@ export class AdminUserPage { await this.page.selectOption('select[name="role"]', data.role); } + console.log('表单填写完成,准备提交'); + await this.page.click('button:has-text("创建")'); + + console.log('用户创建请求已提交'); } async expectUserInList(email: string) { + console.log(`检查用户是否在列表中: ${email}`); + await this.goto(); - const row = this.page.locator(`tr:has-text("${email}")`); - await expect(row).toBeVisible(); + await this.page.waitForLoadState('domcontentloaded'); + await this.page.waitForTimeout(1000); + + let row = this.page.locator(`tr:has-text("${email}")`); + let isVisible = await row.count() > 0; + + if (!isVisible) { + console.log('用户不在列表中,尝试刷新页面'); + await this.page.reload({ waitUntil: 'domcontentloaded' }); + await this.page.waitForSelector('table tbody tr', { timeout: 5000 }); + await this.page.waitForTimeout(1000); + + row = this.page.locator(`tr:has-text("${email}")`); + isVisible = await row.count() > 0; + } + + if (!isVisible) { + const allRows = await this.page.locator('table tbody tr').allTextContents(); + console.log('当前列表中的用户:'); + allRows.forEach((text, i) => console.log(`行 ${i + 1}: ${text}`)); + } + + await expect(row).toBeVisible({ timeout: 10000 }); + console.log(`✅ 用户已在列表中: ${email}`); } } diff --git a/src/app/admin/users/page.tsx b/src/app/admin/users/page.tsx index 4af9c0d..bc537a7 100644 --- a/src/app/admin/users/page.tsx +++ b/src/app/admin/users/page.tsx @@ -262,6 +262,7 @@ export default function UsersPage() { setFormData({ ...formData, email: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#C41E3A]" @@ -271,6 +272,7 @@ export default function UsersPage() { setFormData({ ...formData, name: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#C41E3A]" @@ -280,6 +282,7 @@ export default function UsersPage() { setFormData({ ...formData, password: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#C41E3A]" @@ -288,6 +291,7 @@ export default function UsersPage() {
setFormData({ ...formData, email: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#C41E3A]" @@ -339,6 +344,7 @@ export default function UsersPage() { setFormData({ ...formData, name: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#C41E3A]" @@ -348,6 +354,7 @@ export default function UsersPage() { setFormData({ ...formData, password: e.target.value })} className="w-full px-3 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-[#C41E3A]" @@ -356,6 +363,7 @@ export default function UsersPage() {