# Playwright 全量 E2E — 本地验证报告

**日期**: 2026-06-08  
**环境**: `http://127.0.0.1:8600` · admin + `NEXUS_E2E_PASSWORD` · Chromium headless

## 结果（最终）

```bash
cd frontend && npx playwright install chromium   # 首次
NEXUS_E2E_BASE=http://127.0.0.1:8600 \
NEXUS_E2E_USER=admin \
NEXUS_E2E_PASSWORD=*** \
npm run test:e2e
```

| 指标 | 值 |
|------|-----|
| 合计 | **35** |
| 通过 | **35** |
| 失败 | 0 |
| 跳过 | 0 |
| 耗时 | ~35s |

### 复验（清理后 · 2026-06-08）

| 套件 | 结果 |
|------|------|
| `pytest tests/integration tests/chain` | **27 passed** |
| `pytest tests/ -m "not chain and not slow"` | **427 passed** |
| `pytest tests/ -m slow` | **1 passed**（IT-INST-001） |
| `scripts/local_integration_smoke.sh` | **OK** |
| `npm run test:e2e` | **35 passed** (~35s) |

前置：`bash scripts/start-dev.sh`（API :8600 healthy）

## 根因与修复（本轮）

| 问题 | 处理 |
|------|------|
| 并行 UI 登录触发 admin 锁定（429） | `e2e/fixtures.mjs`：每 worker 一次 API 登录 + 轮换后更新 `storageState` |
| `page.goto(#/route)` 在 keep-alive SPA 下偶发停在 `#/` | `helpers.nav` 改为侧栏链接点击；设置页点抽屉「设置」 |
| 凭据入口改为服务器页对话框 | `credentials` / acceptance #08 点「凭据」按钮，不再依赖 `?credentials=1` |
| `getByText('命令日志')` strict 双匹配 | 限定 `main .v-card-title` |
| `web/app` 构建滞后（旧 bundle 含「导出CSV」） | `npx vite build` 同步源码与静态资源 |

## Spec 目录（19 文件）

- `full-acceptance.spec.mjs`（15 步 serial）
- `pages/*.spec.mjs`（18 页域用例 + install/login/auth 无会话）

## 结论

**Wave 1–5 测试矩阵对应的 Playwright 全量 35/35 green**，可与 `tests/integration` + `tests/chain`（27 passed）一并作为 L4 证据。
