fix(用户管理): 修复用户列表页面加载失败问题
修复用户列表页面加载失败导致测试超时的问题,确保页面元素正确渲染
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
# 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: users.spec.ts >> 用户管理 >> 搜索框可输入
|
||||
- Location: e2e\users.spec.ts:31:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Test timeout of 30000ms exceeded.
|
||||
```
|
||||
|
||||
```
|
||||
Error: locator.fill: Test timeout of 30000ms exceeded.
|
||||
Call log:
|
||||
- waiting for locator('input[placeholder*="搜索"]')
|
||||
|
||||
```
|
||||
|
||||
# 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('/#/users');
|
||||
6 | // 标题
|
||||
7 | await expect(page.locator('h4')).toContainText('用户管理');
|
||||
8 | // 新建用户按钮
|
||||
9 | await expect(page.locator('button:has-text("新建用户")')).toBeVisible();
|
||||
10 | // 搜索框
|
||||
11 | await expect(page.locator('input[placeholder*="搜索"]')).toBeVisible();
|
||||
12 | // 表格列头
|
||||
13 | await expect(page.locator('text=用户')).toBeVisible();
|
||||
14 | await expect(page.locator('text=状态')).toBeVisible();
|
||||
15 | });
|
||||
16 |
|
||||
17 | test('新建用户弹窗表单验证', async ({ page }) => {
|
||||
18 | await page.goto('/#/users');
|
||||
19 | // 点击新建
|
||||
20 | await page.click('button:has-text("新建用户")');
|
||||
21 | // 弹窗出现
|
||||
22 | await expect(page.locator('.ant-modal')).toBeVisible();
|
||||
23 | // 直接提交应显示验证错误
|
||||
24 | await page.click('.ant-modal button:has-text("确 定")');
|
||||
25 | // Ant Design 应显示验证错误(用户名 + 密码必填)
|
||||
26 | await expect(page.locator('.ant-form-item-explain-error')).toHaveCount(2);
|
||||
27 | // 关闭弹窗
|
||||
28 | await page.click('.ant-modal-close');
|
||||
29 | });
|
||||
30 |
|
||||
31 | test('搜索框可输入', async ({ page }) => {
|
||||
32 | await page.goto('/#/users');
|
||||
33 | const searchInput = page.locator('input[placeholder*="搜索"]');
|
||||
> 34 | await searchInput.fill('admin');
|
||||
| ^ Error: locator.fill: Test timeout of 30000ms exceeded.
|
||||
35 | await expect(searchInput).toHaveValue('admin');
|
||||
36 | });
|
||||
37 | });
|
||||
38 |
|
||||
```
|
||||
@@ -0,0 +1,115 @@
|
||||
# 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 |
|
||||
```
|
||||
@@ -0,0 +1,112 @@
|
||||
# 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:27:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Test timeout of 30000ms exceeded.
|
||||
```
|
||||
|
||||
```
|
||||
Error: locator.click: Test timeout of 30000ms exceeded.
|
||||
Call log:
|
||||
- waiting for locator('.ant-layout-sider').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();
|
||||
25 | });
|
||||
26 |
|
||||
27 | test('页面间导航正常工作', async ({ page }) => {
|
||||
28 | await page.goto('/#/');
|
||||
29 |
|
||||
30 | // 点击用户管理
|
||||
> 31 | await page.locator('.ant-layout-sider').locator('text=用户管理').click();
|
||||
| ^ Error: locator.click: Test timeout of 30000ms exceeded.
|
||||
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 |
|
||||
```
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,114 @@
|
||||
# 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: users.spec.ts >> 用户管理 >> 用户列表页面加载并显示表格
|
||||
- Location: e2e\users.spec.ts:4:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Error: expect(locator).toContainText(expected) failed
|
||||
|
||||
Locator: locator('h4')
|
||||
Expected substring: "用户管理"
|
||||
Timeout: 5000ms
|
||||
Error: element(s) not found
|
||||
|
||||
Call log:
|
||||
- Expect "toContainText" with timeout 5000ms
|
||||
- waiting for locator('h4')
|
||||
|
||||
```
|
||||
|
||||
# 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('/#/users');
|
||||
6 | // 标题
|
||||
> 7 | await expect(page.locator('h4')).toContainText('用户管理');
|
||||
| ^ Error: expect(locator).toContainText(expected) failed
|
||||
8 | // 新建用户按钮
|
||||
9 | await expect(page.locator('button:has-text("新建用户")')).toBeVisible();
|
||||
10 | // 搜索框
|
||||
11 | await expect(page.locator('input[placeholder*="搜索"]')).toBeVisible();
|
||||
12 | // 表格列头
|
||||
13 | await expect(page.locator('text=用户')).toBeVisible();
|
||||
14 | await expect(page.locator('text=状态')).toBeVisible();
|
||||
15 | });
|
||||
16 |
|
||||
17 | test('新建用户弹窗表单验证', async ({ page }) => {
|
||||
18 | await page.goto('/#/users');
|
||||
19 | // 点击新建
|
||||
20 | await page.click('button:has-text("新建用户")');
|
||||
21 | // 弹窗出现
|
||||
22 | await expect(page.locator('.ant-modal')).toBeVisible();
|
||||
23 | // 直接提交应显示验证错误
|
||||
24 | await page.click('.ant-modal button:has-text("确 定")');
|
||||
25 | // Ant Design 应显示验证错误(用户名 + 密码必填)
|
||||
26 | await expect(page.locator('.ant-form-item-explain-error')).toHaveCount(2);
|
||||
27 | // 关闭弹窗
|
||||
28 | await page.click('.ant-modal-close');
|
||||
29 | });
|
||||
30 |
|
||||
31 | test('搜索框可输入', async ({ page }) => {
|
||||
32 | await page.goto('/#/users');
|
||||
33 | const searchInput = page.locator('input[placeholder*="搜索"]');
|
||||
34 | await searchInput.fill('admin');
|
||||
35 | await expect(searchInput).toHaveValue('admin');
|
||||
36 | });
|
||||
37 | });
|
||||
38 |
|
||||
```
|
||||
@@ -0,0 +1,115 @@
|
||||
# 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:4:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Error: expect(locator).toBeVisible() failed
|
||||
|
||||
Locator: locator('.ant-layout-sider').locator('text=基础模块')
|
||||
Expected: visible
|
||||
Timeout: 5000ms
|
||||
Error: element(s) not found
|
||||
|
||||
Call log:
|
||||
- Expect "toBeVisible" with timeout 5000ms
|
||||
- waiting for locator('.ant-layout-sider').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();
|
||||
| ^ Error: expect(locator).toBeVisible() failed
|
||||
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();
|
||||
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 |
|
||||
```
|
||||
@@ -0,0 +1,102 @@
|
||||
# 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: plugins.spec.ts >> 插件管理 >> 插件管理页面加载
|
||||
- Location: e2e\plugins.spec.ts:4:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Error: expect(locator).toBeVisible() failed
|
||||
|
||||
Locator: locator('.ant-breadcrumb, .ant-page-header, h4').first()
|
||||
Expected: visible
|
||||
Timeout: 5000ms
|
||||
Error: element(s) not found
|
||||
|
||||
Call log:
|
||||
- Expect "toBeVisible" with timeout 5000ms
|
||||
- waiting for locator('.ant-breadcrumb, .ant-page-header, h4').first()
|
||||
|
||||
```
|
||||
|
||||
# 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('/#/plugins/admin');
|
||||
6 | // 页面标题(在面包屑中)
|
||||
> 7 | await expect(page.locator('.ant-breadcrumb, .ant-page-header, h4').first()).toBeVisible();
|
||||
| ^ Error: expect(locator).toBeVisible() failed
|
||||
8 | // 上传插件按钮
|
||||
9 | await expect(page.locator('button:has-text("上传插件")')).toBeVisible();
|
||||
10 | // 刷新按钮
|
||||
11 | await expect(page.locator('button:has-text("刷新")')).toBeVisible();
|
||||
12 | // 表格列头
|
||||
13 | await expect(page.locator('text=名称')).toBeVisible();
|
||||
14 | await expect(page.locator('text=状态')).toBeVisible();
|
||||
15 | });
|
||||
16 |
|
||||
17 | test('刷新按钮可点击', async ({ page }) => {
|
||||
18 | await page.goto('/#/plugins/admin');
|
||||
19 | const refreshBtn = page.locator('button:has-text("刷新")');
|
||||
20 | await expect(refreshBtn).toBeEnabled();
|
||||
21 | await refreshBtn.click();
|
||||
22 | // 页面不应崩溃
|
||||
23 | await expect(page.locator('button:has-text("上传插件")')).toBeVisible();
|
||||
24 | });
|
||||
25 | });
|
||||
26 |
|
||||
```
|
||||
@@ -0,0 +1,102 @@
|
||||
# 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: plugins.spec.ts >> 插件管理 >> 刷新按钮可点击
|
||||
- Location: e2e\plugins.spec.ts:17:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Error: expect(locator).toBeEnabled() failed
|
||||
|
||||
Locator: locator('button:has-text("刷新")')
|
||||
Expected: enabled
|
||||
Timeout: 5000ms
|
||||
Error: element(s) not found
|
||||
|
||||
Call log:
|
||||
- Expect "toBeEnabled" with timeout 5000ms
|
||||
- waiting for locator('button:has-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('/#/plugins/admin');
|
||||
6 | // 页面标题(在面包屑中)
|
||||
7 | await expect(page.locator('.ant-breadcrumb, .ant-page-header, h4').first()).toBeVisible();
|
||||
8 | // 上传插件按钮
|
||||
9 | await expect(page.locator('button:has-text("上传插件")')).toBeVisible();
|
||||
10 | // 刷新按钮
|
||||
11 | await expect(page.locator('button:has-text("刷新")')).toBeVisible();
|
||||
12 | // 表格列头
|
||||
13 | await expect(page.locator('text=名称')).toBeVisible();
|
||||
14 | await expect(page.locator('text=状态')).toBeVisible();
|
||||
15 | });
|
||||
16 |
|
||||
17 | test('刷新按钮可点击', async ({ page }) => {
|
||||
18 | await page.goto('/#/plugins/admin');
|
||||
19 | const refreshBtn = page.locator('button:has-text("刷新")');
|
||||
> 20 | await expect(refreshBtn).toBeEnabled();
|
||||
| ^ Error: expect(locator).toBeEnabled() failed
|
||||
21 | await refreshBtn.click();
|
||||
22 | // 页面不应崩溃
|
||||
23 | await expect(page.locator('button:has-text("上传插件")')).toBeVisible();
|
||||
24 | });
|
||||
25 | });
|
||||
26 |
|
||||
```
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 240 KiB |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,111 @@
|
||||
# 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: users.spec.ts >> 用户管理 >> 新建用户弹窗表单验证
|
||||
- Location: e2e\users.spec.ts:17:3
|
||||
|
||||
# Error details
|
||||
|
||||
```
|
||||
Test timeout of 30000ms exceeded.
|
||||
```
|
||||
|
||||
```
|
||||
Error: page.click: Test timeout of 30000ms exceeded.
|
||||
Call log:
|
||||
- waiting for locator('button:has-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('/#/users');
|
||||
6 | // 标题
|
||||
7 | await expect(page.locator('h4')).toContainText('用户管理');
|
||||
8 | // 新建用户按钮
|
||||
9 | await expect(page.locator('button:has-text("新建用户")')).toBeVisible();
|
||||
10 | // 搜索框
|
||||
11 | await expect(page.locator('input[placeholder*="搜索"]')).toBeVisible();
|
||||
12 | // 表格列头
|
||||
13 | await expect(page.locator('text=用户')).toBeVisible();
|
||||
14 | await expect(page.locator('text=状态')).toBeVisible();
|
||||
15 | });
|
||||
16 |
|
||||
17 | test('新建用户弹窗表单验证', async ({ page }) => {
|
||||
18 | await page.goto('/#/users');
|
||||
19 | // 点击新建
|
||||
> 20 | await page.click('button:has-text("新建用户")');
|
||||
| ^ Error: page.click: Test timeout of 30000ms exceeded.
|
||||
21 | // 弹窗出现
|
||||
22 | await expect(page.locator('.ant-modal')).toBeVisible();
|
||||
23 | // 直接提交应显示验证错误
|
||||
24 | await page.click('.ant-modal button:has-text("确 定")');
|
||||
25 | // Ant Design 应显示验证错误(用户名 + 密码必填)
|
||||
26 | await expect(page.locator('.ant-form-item-explain-error')).toHaveCount(2);
|
||||
27 | // 关闭弹窗
|
||||
28 | await page.click('.ant-modal-close');
|
||||
29 | });
|
||||
30 |
|
||||
31 | test('搜索框可输入', async ({ page }) => {
|
||||
32 | await page.goto('/#/users');
|
||||
33 | const searchInput = page.locator('input[placeholder*="搜索"]');
|
||||
34 | await searchInput.fill('admin');
|
||||
35 | await expect(searchInput).toHaveValue('admin');
|
||||
36 | });
|
||||
37 | });
|
||||
38 |
|
||||
```
|
||||
Reference in New Issue
Block a user