import { test, expect } from '@playwright/test'; import { RoleFactory } from '../../roles/role-factory'; import { AuthHelper } from '../../shared/auth-helper'; test.describe('登出流程测试', () => { let authHelper: AuthHelper; test.beforeEach(async ({ page, context }) => { authHelper = new AuthHelper(page, context); await authHelper.loginAsRole('admin'); }); test('用户登出成功', async ({ page }) => { await page.goto('/dashboard'); await page.click('.el-dropdown'); await page.waitForSelector('.el-dropdown-menu', { state: 'visible' }); await page.click('text=退出登录'); await expect(page).toHaveURL(/\/login/, { timeout: 10000 }); const loginButton = page.locator('button:has-text("登录")'); await expect(loginButton).toBeVisible(); }); test('登出后无法访问受保护页面', async ({ page }) => { await page.goto('/dashboard'); await page.click('.el-dropdown'); await page.waitForSelector('.el-dropdown-menu', { state: 'visible' }); await page.click('text=退出登录'); await expect(page).toHaveURL(/\/login/); await page.goto('/users'); await expect(page).toHaveURL(/\/login/); }); test('登出后Token被清除', async ({ page, context }) => { await page.goto('/dashboard'); await page.click('.el-dropdown'); await page.waitForSelector('.el-dropdown-menu', { state: 'visible' }); await page.click('text=退出登录'); await expect(page).toHaveURL(/\/login/); const cookies = await context.cookies(); const tokenCookie = cookies.find(c => c.name === 'token'); expect(tokenCookie).toBeUndefined(); const localStorageToken = await page.evaluate(() => { return localStorage.getItem('token'); }); expect(localStorageToken).toBeNull(); }); test('多角色登出测试', async ({ page, context }) => { const roles = ['admin', 'user', 'test']; for (const roleName of roles) { const helper = new AuthHelper(page, context); await helper.clearAuth(); await helper.loginAsRole(roleName); await page.goto('/dashboard'); await page.click('.el-dropdown'); await page.waitForSelector('.el-dropdown-menu', { state: 'visible' }); await page.click('text=退出登录'); await expect(page).toHaveURL(/\/login/, { timeout: 10000 }); } }); });