import { expect, test, type Page } from '@playwright/test' async function openAdmin(page: Page) { await page.goto('/admin-vue/') await expect(page.locator('.admin-topbar h1')).toHaveText('用户管理') } test('test_task_020_shell_browser_smoke_normal_primary_path', async ({ page }) => { await openAdmin(page) await expect(page.getByRole('navigation', { name: '侧边栏菜单' })).toBeVisible() await expect(page.locator('.admin-user-meta strong')).toHaveText('admin') await expect(page.locator('.admin-user-role')).toHaveText('超级管理员') await expect(page.getByText('账号权限', { exact: true }).first()).toBeVisible() }) test('test_task_020_shell_browser_smoke_normal_variant_input', async ({ page }) => { await openAdmin(page) // 侧边栏菜单导航到「数据权限分组」,标题与面包屑跟随(对齐现状:无收起按钮)。 await page.getByRole('menuitem', { name: '数据权限分组' }).click() await expect(page.locator('.admin-topbar h1')).toHaveText('数据权限分组') await expect(page.locator('.admin-breadcrumb')).toBeVisible() }) test('test_task_020_shell_browser_smoke_normal_repeated_operation_is_idempotent', async ({ page }) => { await openAdmin(page) await page.reload() await expect(page.locator('.admin-topbar h1')).toHaveText('用户管理') await expect(page.locator('.global-error-stack')).toHaveCount(0) }) test('test_task_020_shell_browser_smoke_boundary_empty_input', async ({ page }) => { await page.goto('/admin-vue/definitely/not/exists') await expect(page.locator('.not-found')).toBeVisible() await expect(page.locator('.not-found')).toContainText('404') }) test('test_task_020_shell_browser_smoke_boundary_single_item', async ({ page }) => { await openAdmin(page) await page.getByRole('button', { name: '退出登录' }).click() await expect(page.locator('.el-message-box')).toBeVisible() await expect(page.locator('.el-message-box')).toContainText('确定要退出当前账号吗?') await page.locator('.el-message-box').getByRole('button', { name: '取消' }).click() await expect(page.locator('.el-message-box')).toHaveCount(0) await expect(page).toHaveURL(/\/admin-vue\//) await expect(page.locator('.admin-topbar h1')).toHaveText('用户管理') }) test('test_task_020_shell_browser_smoke_boundary_limit_or_missing_field', async ({ page }) => { await openAdmin(page) await page.getByRole('button', { name: '退出登录' }).click() await page.locator('.el-message-box').getByRole('button', { name: '退出' }).click() await page.waitForURL(/\/login/, { timeout: 10_000 }) }) test('test_task_020_shell_browser_smoke_invalid_input_rejected', async ({ page }) => { // 整段冒烟无未捕获脚本错误(错误不会静默遗留到控制台)。 const errors: string[] = [] page.on('pageerror', (error) => errors.push(error.message)) await openAdmin(page) await page.goto('/admin-vue/account/menus') await expect(page.locator('.admin-topbar h1')).toHaveText('菜单管理') await page.goto('/admin-vue/account/groups') await expect(page.locator('.admin-topbar h1')).toHaveText('数据权限分组') expect(errors).toEqual([]) }) test('test_task_020_shell_browser_smoke_dependency_failure_returns_actionable_message', async ({ page }) => { await openAdmin(page) // 取消确认后无“可见”的遮罩/弹层残留(隐藏的对话框 DOM 不算);继续导航正常。 await page.getByRole('button', { name: '退出登录' }).click() await page.locator('.el-message-box').getByRole('button', { name: '取消' }).click() await expect(page.locator('.el-overlay:visible')).toHaveCount(0) await page.locator('.admin-brand-copy, .admin-topbar h1').first().click({ force: true }) await expect(page.locator('.admin-topbar h1')).toHaveText('用户管理') })