/** * 超管端 E2E 测试 - 退出登录 */ import { test, expect } from '@playwright/test'; import { loginAsAdmin, logout } from './helpers'; import { ADMIN_CONFIG } from './fixtures'; test.describe('退出登录', () => { test('点击退出登录', async ({ page }) => { // 先登录 await loginAsAdmin(page); // 查找退出登录按钮并点击 const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i }); if (await logoutButton.isVisible()) { await logoutButton.click(); } else { // 尝试点击用户菜单后再找退出按钮 const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]')); if (await userMenu.isVisible()) { await userMenu.click(); await page.waitForTimeout(200); const dropdownLogout = page.getByText(/退出登录 | 退出/); if (await dropdownLogout.isVisible()) { await dropdownLogout.click(); } } } // 等待跳转到登录页 await page.waitForURL('**/login*'); await expect(page).toHaveURL(/\/login/); }); test('验证跳转回登录页', async ({ page }) => { // 先登录 await loginAsAdmin(page); // 退出登录 const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i }); if (await logoutButton.isVisible()) { await logoutButton.click(); } else { const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]')); if (await userMenu.isVisible()) { await userMenu.click(); await page.waitForTimeout(200); const dropdownLogout = page.getByText(/退出登录 | 退出/); if (await dropdownLogout.isVisible()) { await dropdownLogout.click(); } } } // 验证在登录页面 await page.waitForURL('**/login*'); await expect(page).toHaveURL(/\/login/); // 验证登录表单存在 await expect(page.getByPlaceholder('请输入账号')).toBeVisible(); await expect(page.getByPlaceholder('请输入密码')).toBeVisible(); }); test('验证 token 已清除', async ({ page }) => { // 先登录 await loginAsAdmin(page); // 获取当前 token const tokenBeforeLogout = await page.evaluate(() => localStorage.getItem('token')); expect(tokenBeforeLogout).toBeTruthy(); // 退出登录 const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i }); if (await logoutButton.isVisible()) { await logoutButton.click(); } else { const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]')); if (await userMenu.isVisible()) { await userMenu.click(); await page.waitForTimeout(200); const dropdownLogout = page.getByText(/退出登录 | 退出/); if (await dropdownLogout.isVisible()) { await dropdownLogout.click(); } } } // 等待跳转完成 await page.waitForTimeout(500); // 验证 token 已清除 const tokenAfterLogout = await page.evaluate(() => localStorage.getItem('token')); expect(tokenAfterLogout).toBeFalsy(); // 验证 sessionStorage 中的用户信息也已清除 const userInfo = await page.evaluate(() => sessionStorage.getItem('userInfo')); expect(userInfo).toBeFalsy(); }); test('退出后无法访问管理页面', async ({ page }) => { // 先登录 await loginAsAdmin(page); // 退出登录 const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i }); if (await logoutButton.isVisible()) { await logoutButton.click(); } else { const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]')); if (await userMenu.isVisible()) { await userMenu.click(); await page.waitForTimeout(200); const dropdownLogout = page.getByText(/退出登录 | 退出/); if (await dropdownLogout.isVisible()) { await dropdownLogout.click(); } } } // 等待跳转完成 await page.waitForTimeout(500); // 尝试直接访问管理页面 await page.goto('/admin/dashboard'); // 应该被重定向到登录页 await page.waitForURL('**/login*'); await expect(page).toHaveURL(/\/login/); }); });