# Instructions - Following Playwright test failed. - Explain why, be concise, respect Playwright best practices. - Provide a snippet of code with the fix, if possible. # Test info - Name: tenant-isolation.spec.ts >> 多租户隔离 >> 顶部导航栏显示用户信息 - Location: e2e\tenant-isolation.spec.ts:19:3 # Error details ``` Error: expect(locator).toBeVisible() failed Locator: locator('.ant-layout-header').locator('text=系统管理员') Expected: visible Timeout: 5000ms Error: element(s) not found Call log: - Expect "toBeVisible" with timeout 5000ms - waiting for locator('.ant-layout-header').locator('text=系统管理员') ``` # Page snapshot ```yaml - generic [ref=e2]: - link "跳转到主要内容" [ref=e3] [cursor=pointer]: - /url: "#root" - generic [ref=e4]: - generic [ref=e8]: - img "safety-certificate" [ref=e10]: - img [ref=e11] - heading "ERP Platform" [level=1] [ref=e13] - paragraph [ref=e14]: 新一代模块化企业资源管理平台 - paragraph [ref=e15]: 身份权限 · 工作流引擎 · 消息中心 · 系统配置 - generic [ref=e16]: - generic [ref=e17]: - generic [ref=e18]: SaaS - generic [ref=e19]: 多租户架构 - generic [ref=e20]: - generic [ref=e21]: 可插拔 - generic [ref=e22]: 模块化设计 - generic [ref=e23]: - generic [ref=e24]: 可扩展 - generic [ref=e25]: 事件驱动 - main [ref=e26]: - generic [ref=e27]: - heading "欢迎回来" [level=2] [ref=e28] - paragraph [ref=e29]: 请登录您的账户以继续 - separator [ref=e30] - generic [ref=e31]: - generic [ref=e37]: - img "user" [ref=e39]: - img [ref=e40] - textbox "用户名" [ref=e42] - generic [ref=e48]: - img "lock" [ref=e50]: - img [ref=e51] - textbox "密码" [ref=e53] - img "eye-invisible" [ref=e55] [cursor=pointer]: - img [ref=e56] - button "登 录" [ref=e64] [cursor=pointer]: - generic [ref=e65]: 登 录 - paragraph [ref=e67]: ERP Platform v0.1.0 · Powered by Rust + React ``` # Test source ```ts 1 | import { test, expect } from '@playwright/test'; 2 | 3 | test.describe('多租户隔离', () => { 4 | test('侧边栏按模块分组显示', async ({ page }) => { 5 | await page.goto('/#/'); 6 | 7 | // 验证侧边栏基础模块分组 8 | const sidebar = page.locator('.ant-layout-sider'); 9 | await expect(sidebar.locator('text=基础模块')).toBeVisible(); 10 | await expect(sidebar.locator('text=业务模块')).toBeVisible(); 11 | await expect(sidebar.locator('text=系统')).toBeVisible(); 12 | 13 | // 验证关键菜单项存在 14 | await expect(sidebar.locator('text=工作台')).toBeVisible(); 15 | await expect(sidebar.locator('text=用户管理')).toBeVisible(); 16 | await expect(sidebar.locator('text=插件管理')).toBeVisible(); 17 | }); 18 | 19 | test('顶部导航栏显示用户信息', async ({ page }) => { 20 | await page.goto('/#/'); 21 | 22 | // 验证顶部导航栏元素 23 | const header = page.locator('.ant-layout-header'); > 24 | await expect(header.locator('text=系统管理员')).toBeVisible(); | ^ Error: expect(locator).toBeVisible() failed 25 | }); 26 | 27 | test('页面间导航正常工作', async ({ page }) => { 28 | await page.goto('/#/'); 29 | 30 | // 点击用户管理 31 | await page.locator('.ant-layout-sider').locator('text=用户管理').click(); 32 | await expect(page).toHaveURL(/#\/users/); 33 | 34 | // 点击工作台返回 35 | await page.locator('.ant-layout-sider').locator('text=工作台').click(); 36 | await expect(page).toHaveURL(/#\/$/); 37 | }); 38 | }); 39 | ```