chore: 清理 git 缓存 — 移除 .logs/ brainstorm/ playwright-report/
这些文件已在 .gitignore 中,从 git 追踪中移除。
This commit is contained in:
@@ -1,45 +0,0 @@
|
||||
warning: unused import: `PluginError`
|
||||
--> crates\erp-plugin\src\plugin_validator.rs:1:20
|
||||
|
|
||||
1 | use crate::error::{PluginError, PluginResult};
|
||||
| ^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
|
||||
|
||||
warning: unused import: `parse_manifest`
|
||||
--> crates\erp-plugin\src\plugin_validator.rs:2:23
|
||||
|
|
||||
2 | use crate::manifest::{parse_manifest, PluginManifest};
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
warning: field `chk` is never read
|
||||
--> crates\erp-plugin\src\data_service.rs:445:39
|
||||
|
|
||||
445 | struct RefCheck { chk: Option<i32> }
|
||||
| -------- ^^^
|
||||
| |
|
||||
| field in this struct
|
||||
|
|
||||
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
|
||||
|
||||
warning: field `chk` is never read
|
||||
--> crates\erp-plugin\src\data_service.rs:684:51
|
||||
|
|
||||
684 | ... struct RefCheck { chk: Option<i32> }
|
||||
| -------- ^^^
|
||||
| |
|
||||
| field in this struct
|
||||
|
||||
warning: field `check_result` is never read
|
||||
--> crates\erp-plugin\src\data_service.rs:1329:30
|
||||
|
|
||||
1329 | struct ExistsCheck { check_result: Option<i32> }
|
||||
| ----------- ^^^^^^^^^^^^
|
||||
| |
|
||||
| field in this struct
|
||||
|
||||
warning: `erp-plugin` (lib) generated 5 warnings (run `cargo fix --lib -p erp-plugin` to apply 2 suggestions)
|
||||
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.73s
|
||||
Running `target\debug\erp-server.exe`
|
||||
Error: configuration file "config/default" not found
|
||||
error: process didn't exit successfully: `target\debug\erp-server.exe` (exit code: 1)
|
||||
@@ -1 +0,0 @@
|
||||
10056
|
||||
@@ -1,10 +0,0 @@
|
||||
|
||||
> web@0.0.0 dev G:\erp\apps\web
|
||||
> vite "--" "--strictPort"
|
||||
|
||||
Port 5174 is in use, trying another one...
|
||||
|
||||
[32m[1mVITE[22m v8.0.8[39m [2mready in [0m[1m316[22m[2m[0m ms[22m
|
||||
|
||||
[32m➜[39m [1mLocal[22m: [36mhttp://localhost:[1m5175[22m/[39m
|
||||
[2m [32m➜[39m [1mNetwork[22m[2m: use [22m[1m--host[22m[2m to expose[22m
|
||||
@@ -1 +0,0 @@
|
||||
50960
|
||||
@@ -1 +0,0 @@
|
||||
{"reason":"owner process exited","timestamp":1776267637695}
|
||||
@@ -1,80 +0,0 @@
|
||||
<h2>客户管理插件 — 三种实现方案</h2>
|
||||
<p class="subtitle">选择最适合项目架构和交付目标的实现路径</p>
|
||||
|
||||
<div class="options">
|
||||
<div class="option" data-choice="a" onclick="toggleSelect(this)">
|
||||
<div class="letter">A</div>
|
||||
<div class="content">
|
||||
<h3>纯 WASM 插件 + 增强插件 UI 引擎</h3>
|
||||
<p><strong>数据层:</strong>全部通过 WASM Host API,5 个动态表存储在 JSONB</p>
|
||||
<p><strong>UI 层:</strong>扩展 PluginCRUDPage,新增 ui_widget 类型(tree、graph、timeline)</p>
|
||||
<p><strong>关系图谱:</strong>新增 "graph" ui_widget,前端用 D3/AntV G6 渲染</p>
|
||||
<div class="pros-cons">
|
||||
<div class="pros"><h4>优势</h4><ul>
|
||||
<li>完全在插件架构内,验证插件系统能力</li>
|
||||
<li>新增的 ui_widget 可被所有未来插件复用</li>
|
||||
<li>动态安装/卸载,热插拔</li>
|
||||
</ul></div>
|
||||
<div class="cons"><h4>劣势</h4><ul>
|
||||
<li>JSONB 查询性能弱于原生列</li>
|
||||
<li>复杂关系查询需多次 Host API 调用</li>
|
||||
<li>ui_widget 扩展工作量大(3-4 种新控件)</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="option" data-choice="b" onclick="toggleSelect(this)">
|
||||
<div class="letter">B</div>
|
||||
<div class="content">
|
||||
<h3>WASM 插件数据层 + 专用前端页面(推荐)</h3>
|
||||
<p><strong>数据层:</strong>WASM 插件管理 5 个实体,通过 Host API 操作</p>
|
||||
<p><strong>UI 层:</strong>前端新增 CRM 专用页面组件(客户列表、联系人、沟通时间线、关系图谱)</p>
|
||||
<p><strong>路由:</strong>插件的 manifest.ui.pages 声明自定义页面,前端按 pluginId 匹配加载</p>
|
||||
<div class="pros-cons">
|
||||
<div class="pros"><h4>优势</h4><ul>
|
||||
<li>最佳 UX — 专为 CRM 设计的交互</li>
|
||||
<li>关系图谱可用专业图表库(AntV G6)</li>
|
||||
<li>数据层仍验证 WASM 插件系统</li>
|
||||
<li>前后端分离,UI 可独立迭代</li>
|
||||
</ul></div>
|
||||
<div class="cons"><h4>劣势</h4><ul>
|
||||
<li>每增加一个插件需写前端代码</li>
|
||||
<li>插件 UI 不能完全动态化</li>
|
||||
<li>数据查询仍受 Host API 限制</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="option" data-choice="c" onclick="toggleSelect(this)">
|
||||
<div class="letter">C</div>
|
||||
<div class="content">
|
||||
<h3>内置 erp-crm crate + 独立前端</h3>
|
||||
<p><strong>数据层:</strong>新建 erp-crm crate,直接 SeaORM Entity,原生列存储</p>
|
||||
<p><strong>UI 层:</strong>独立前端页面,直接调用 CRM API</p>
|
||||
<p><strong>关系图谱:</strong>数据库原生支持关系查询,前端 AntV G6</p>
|
||||
<div class="pros-cons">
|
||||
<div class="pros"><h4>优势</h4><ul>
|
||||
<li>性能最优 — 原生 SQL + 索引</li>
|
||||
<li>复杂关系查询简单高效</li>
|
||||
<li>完全控制数据模型</li>
|
||||
</ul></div>
|
||||
<div class="cons"><h4>劣势</h4><ul>
|
||||
<li>不走插件架构,违背"插件优先"原则</li>
|
||||
<li>编译时耦合,不能动态安装</li>
|
||||
<li>不适合作为"第一个插件"验证目标</li>
|
||||
</ul></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section" style="margin-top: 2rem; padding: 1.5rem; background: var(--card); border-radius: 12px; border-left: 4px solid #1677ff;">
|
||||
<h3>💡 推荐方案:B(WASM 数据层 + 专用前端)</h3>
|
||||
<p style="line-height: 1.8;">
|
||||
作为"第一个插件",方案 B 在<strong>验证插件系统</strong>和<strong>交付可用产品</strong>之间取得最佳平衡:
|
||||
数据层走 WASM Host API 验证插件架构的可行性,UI 层不受 schema 驱动的限制,
|
||||
可以提供真正好用的 CRM 交互体验。同时为未来的插件 UI 定制建立模式(manifest.ui.pages 的前端路由匹配机制)。
|
||||
</p>
|
||||
</div>
|
||||
@@ -1 +0,0 @@
|
||||
{"reason":"owner process exited","timestamp":1776364845649}
|
||||
@@ -1,2 +0,0 @@
|
||||
{"type":"server-started","port":55597,"host":"127.0.0.1","url_host":"localhost","url":"http://localhost:55597","screen_dir":"g:/erp/.superpowers/brainstorm/4473-1776364785"}
|
||||
{"type":"server-stopped","reason":"owner process exited"}
|
||||
@@ -1 +0,0 @@
|
||||
4481
|
||||
@@ -1,147 +0,0 @@
|
||||
<h2>CRM 插件专家组头脑风暴 — 综合发现</h2>
|
||||
<p class="subtitle">6 个专家组深度分析结果 · 28 项发现 · 4 个 Critical 级别</p>
|
||||
|
||||
<div class="section">
|
||||
<h3>严重程度分布</h3>
|
||||
<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:16px 0">
|
||||
<div style="background:#FEE2E2;border:1px solid #FCA5A5;border-radius:8px;padding:12px;text-align:center">
|
||||
<div style="font-size:28px;font-weight:700;color:#DC2626">4</div>
|
||||
<div style="font-size:13px;color:#991B1B;margin-top:4px">Critical</div>
|
||||
<div style="font-size:11px;color:#B91C1C;margin-top:2px">必须立即修复</div>
|
||||
</div>
|
||||
<div style="background:#FEF3C7;border:1px solid #FDE68A;border-radius:8px;padding:12px;text-align:center">
|
||||
<div style="font-size:28px;font-weight:700;color:#D97706">8</div>
|
||||
<div style="font-size:13px;color:#92400E;margin-top:4px">High</div>
|
||||
<div style="font-size:11px;color:#A16207;margin-top:2px">下一版本必须解决</div>
|
||||
</div>
|
||||
<div style="background:#DBEAFE;border:1px solid #93C5FD;border-radius:8px;padding:12px;text-align:center">
|
||||
<div style="font-size:28px;font-weight:700;color:#2563EB">10</div>
|
||||
<div style="font-size:13px;color:#1E40AF;margin-top:4px">Medium</div>
|
||||
<div style="font-size:11px;color:#1D4ED8;margin-top:2px">应规划解决</div>
|
||||
</div>
|
||||
<div style="background:#D1FAE5;border:1px solid #6EE7B7;border-radius:8px;padding:12px;text-align:center">
|
||||
<div style="font-size:28px;font-weight:700;color:#059669">6</div>
|
||||
<div style="font-size:13px;color:#065F46;margin-top:4px">Low/Info</div>
|
||||
<div style="font-size:11px;color:#047857;margin-top:2px">记录待定</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>6 专家组核心发现</h3>
|
||||
|
||||
<div class="cards">
|
||||
<div class="card" data-choice="arch" onclick="toggleSelect(this)">
|
||||
<div class="card-body">
|
||||
<h3 style="color:#7C3AED">🏗️ 后端架构师</h3>
|
||||
<p><strong>核心判断:</strong>当前是"声明式插件框架"穿了"命令式 WASM 沙箱"的外衣。CRM 的 WASM Guest 仅 30 行空壳,100% 流量绕过 WASM 层。</p>
|
||||
<p><strong>推荐方案:</strong>三层插件模型 — L1 声明式(80%) / L2 钩子式(15%) / L3 计算密集(5%)。JSONB + PostgreSQL Generated Column 混合存储。</p>
|
||||
<ul style="font-size:13px;color:#666">
|
||||
<li>C-01: db_query 不可用(Host API 半成品)</li>
|
||||
<li>H-01: JSONB 类型安全缺失(字符串排序非数值排序)</li>
|
||||
<li>H-02: 无插件版本升级迁移能力</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card" data-choice="crm" onclick="toggleSelect(this)">
|
||||
<div class="card-body">
|
||||
<h3 style="color:#059669">💼 CRM 产品专家</h3>
|
||||
<p><strong>核心判断:</strong>当前是"客户通讯录"而非 CRM。缺少销售流程引擎(线索→商机→漏斗→赢单)这个灵魂。</p>
|
||||
<p><strong>推荐路线:</strong>MVP 加 lead+opportunity 实体 + kanban 页面 → V2 团队协作+公海池 → V3 智能化+跨模块联动。</p>
|
||||
<ul style="font-size:13px;color:#666">
|
||||
<li>C-02: 无商机/漏斗管理 — CRM 不是 CRM</li>
|
||||
<li>H-03: JSONB 零 FK 完整性</li>
|
||||
<li>H-04: 无数据校验(手机号/邮箱格式)</li>
|
||||
<li>H-05: 无跟进提醒机制</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card" data-choice="sec" onclick="toggleSelect(this)">
|
||||
<div class="card-body">
|
||||
<h3 style="color:#DC2626">🔐 安全工程师</h3>
|
||||
<p><strong>核心判断:</strong>行级数据权限完全缺失是最大的安全风险。plugin.admin 权限过宽等同于超级用户。</p>
|
||||
<p><strong>紧急修复:</strong>① 收紧权限 fallback ② 行级数据权限框架 ③ 插件间 entity 白名单。</p>
|
||||
<ul style="font-size:13px;color:#666">
|
||||
<li>C-03: 行级数据权限缺失(销售A看销售B客户)</li>
|
||||
<li>C-04: plugin.admin 获得所有插件的超级权限</li>
|
||||
<li>H-06: 插件间无 entity 白名单隔离</li>
|
||||
<li>H-07: JSONB 查询注入风险</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card" data-choice="fe" onclick="toggleSelect(this)">
|
||||
<div class="card-body">
|
||||
<h3 style="color:#2563EB">🎨 前端架构师</h3>
|
||||
<p><strong>核心判断:</strong>Schema 驱动 UI 已覆盖 70% 后台场景,但无法描述"行为"。关联选择器、批量操作、看板是三个最高优先级突破。</p>
|
||||
<p><strong>推荐策略:</strong>声明式 DSL 扩展(短期)→ Iframe 沙箱自定义 UI(中期)→ Web Component(远期)。</p>
|
||||
<ul style="font-size:13px;color:#666">
|
||||
<li>H-08: 无 entity_select 关联选择器</li>
|
||||
<li>H-09: 无批量操作(多选+批量处理)</li>
|
||||
<li>M-01: visible_when 只支持 field==value</li>
|
||||
<li>M-02: 图谱/树全量加载性能问题</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card" data-choice="plat" onclick="toggleSelect(this)">
|
||||
<div class="card-body">
|
||||
<h3 style="color:#D97706">🔌 平台架构师</h3>
|
||||
<p><strong>核心判断:</strong>插件是信息孤岛,无法互相发现和协作。PluginEngine 的 DashMap key 设计阻碍多版本共存。</p>
|
||||
<p><strong>三层通信模型:</strong>事件契约注册 → 跨插件只读查询 → 插件间 RPC(远期)。自定义 API 用通配路由分发。</p>
|
||||
<ul style="font-size:13px;color:#666">
|
||||
<li>H-10: dependencies 字段已声明但从未校验</li>
|
||||
<li>M-03: DashMap key 为 manifest id,多版本冲突</li>
|
||||
<li>M-04: 无自定义 API 端点能力</li>
|
||||
<li>M-05: WIT 接口无版本化</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card" data-choice="perf" onclick="toggleSelect(this)">
|
||||
<div class="card-body">
|
||||
<h3 style="color:#0891B2">⚡ 性能工程师</h3>
|
||||
<p><strong>核心判断:</strong>JSONB 排序无 B-tree 索引、ILIKE '%..%' 全表扫描、深翻页 OFFSET 退化是三大性能瓶颈。当前在万级数据以内可用,十万级会崩。</p>
|
||||
<p><strong>核心方案:</strong>Generated Column 提取高频字段 + pg_trgm 加速搜索 + Keyset Pagination + 聚合 Redis 缓存。</p>
|
||||
<ul style="font-size:13px;color:#666">
|
||||
<li>M-06: ORDER BY data->>'field' 全表扫描</li>
|
||||
<li>M-07: ILIKE '%keyword%' 无法用索引</li>
|
||||
<li>M-08: OFFSET 深翻页线性退化</li>
|
||||
<li>M-09: 每次请求双重查库(schema 解析)</li>
|
||||
<li>M-10: Dashboard 串行聚合</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h3>跨专家组共识 Top 5</h3>
|
||||
<div style="margin:12px 0">
|
||||
<div style="display:flex;align-items:center;gap:10px;padding:10px;background:#F5F3FF;border-radius:6px;margin-bottom:6px">
|
||||
<span style="background:#7C3AED;color:white;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600">#1</span>
|
||||
<strong>JSONB + Generated Column 混合存储</strong>
|
||||
<span style="font-size:12px;color:#666;margin-left:auto">后端+性能+产品 三组一致推荐</span>
|
||||
</div>
|
||||
<div style="display:flex;align-items:center;gap:10px;padding:10px;background:#ECFDF5;border-radius:6px;margin-bottom:6px">
|
||||
<span style="background:#059669;color:white;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600">#2</span>
|
||||
<strong>ref_entity 应用层外键校验 + 级联策略</strong>
|
||||
<span style="font-size:12px;color:#666;margin-left:auto">后端+产品+安全 三组一致推荐</span>
|
||||
</div>
|
||||
<div style="display:flex;align-items:center;gap:10px;padding:10px;background:#EFF6FF;border-radius:6px;margin-bottom:6px">
|
||||
<span style="background:#2563EB;color:white;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600">#3</span>
|
||||
<strong>entity_select 关联选择器 + kanban 看板页面</strong>
|
||||
<span style="font-size:12px;color:#666;margin-left:auto">前端+产品 两组核心诉求</span>
|
||||
</div>
|
||||
<div style="display:flex;align-items:center;gap:10px;padding:10px;background:#FEF2F2;border-radius:6px;margin-bottom:6px">
|
||||
<span style="background:#DC2626;color:white;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600">#4</span>
|
||||
<strong>行级数据权限 + 权限 fallback 收紧</strong>
|
||||
<span style="font-size:12px;color:#666;margin-left:auto">安全 Critical + 平台架构支持</span>
|
||||
</div>
|
||||
<div style="display:flex;align-items:center;gap:10px;padding:10px;background:#FFFBEB;border-radius:6px;margin-bottom:6px">
|
||||
<span style="background:#D97706;color:white;padding:2px 8px;border-radius:4px;font-size:12px;font-weight:600">#5</span>
|
||||
<strong>跨插件事件契约 + 只读数据查询</strong>
|
||||
<span style="font-size:12px;color:#666;margin-left:auto">平台+产品 两组跨模块联动需求</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p style="text-align:center;color:#999;font-size:13px;margin-top:20px">请在终端中回复,告诉我你的优先级偏好</p>
|
||||
@@ -1,3 +0,0 @@
|
||||
<div style="display:flex;align-items:center;justify-content:center;min-height:60vh">
|
||||
<p class="subtitle">设计规格已提交,继续在终端中推进...</p>
|
||||
</div>
|
||||
@@ -1,111 +0,0 @@
|
||||
# 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 |
|
||||
```
|
||||
@@ -1,115 +0,0 @@
|
||||
# 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 |
|
||||
```
|
||||
@@ -1,112 +0,0 @@
|
||||
# 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.
@@ -1,114 +0,0 @@
|
||||
# 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 |
|
||||
```
|
||||
@@ -1,115 +0,0 @@
|
||||
# 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 |
|
||||
```
|
||||
@@ -1,102 +0,0 @@
|
||||
# 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 |
|
||||
```
|
||||
@@ -1,102 +0,0 @@
|
||||
# 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.
|
Before 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.
@@ -1,111 +0,0 @@
|
||||
# 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 |
|
||||
```
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
.drop-target{display:flex;align-items:center;justify-content:center;flex:auto;flex-direction:column;background-color:var(--vscode-editor-background);position:absolute;top:0;right:0;bottom:0;left:0;z-index:100;line-height:24px}body .drop-target{background:#fffc}:root.dark-mode .drop-target{background:#000c}.drop-target .title{font-size:24px;font-weight:700;margin-bottom:30px}.drop-target .info{max-width:400px;text-align:center}.drop-target .processing-error{font-size:24px;color:#e74c3c;font-weight:700;text-align:center;margin:30px;white-space:pre-line}.drop-target input{margin-top:50px}.drop-target button{color:#fff;background-color:#007acc;padding:8px 12px;border:none;margin:30px 0;cursor:pointer}.drop-target .version{color:var(--vscode-disabledForeground);margin-top:8px}.progress-dialog{width:400px;top:0;right:0;bottom:0;left:0;border:none;outline:none;background-color:var(--vscode-sideBar-background)}.progress-dialog::backdrop{background-color:#0006}.progress-content{padding:16px}.progress-content .title{background-color:unset;font-size:18px;font-weight:700;padding:0}.progress-wrapper{background-color:var(--vscode-commandCenter-activeBackground);width:100%;margin-top:16px;margin-bottom:8px}.inner-progress{background-color:var(--vscode-progressBar-background);height:4px}.workbench-loader-header{display:flex;background-color:var(--vscode-sideBar-background);flex:none;flex-basis:48px;line-height:48px;font-size:16px;align-items:center;box-shadow:var(--vscode-scrollbar-shadow) 0 6px 6px -6px}.workbench-loader{contain:size}.workbench-loader .workbench-loader-header{flex-basis:32px;line-height:32px;font-size:13px}.workbench-loader .workbench-loader-header .toolbar-button{margin:4px}.workbench-loader .logo{margin-left:16px;display:flex;align-items:center}.workbench-loader .logo img{height:32px;width:32px;pointer-events:none;flex:none}.workbench-loader .product{font-weight:600;margin-left:16px;flex:none}.workbench-loader .workbench-loader-header .title{margin-left:16px;overflow:hidden;text-overflow:ellipsis;text-wrap:nowrap}html,body{min-width:550px;min-height:450px;overflow:auto}
|
||||
@@ -1,43 +0,0 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" translate="no">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="icon" href="./playwright-logo.svg" type="image/svg+xml">
|
||||
<link rel="manifest" href="./manifest.webmanifest">
|
||||
<title>Playwright Trace Viewer</title>
|
||||
<script type="module" crossorigin src="./index.C5466mMT.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="./assets/defaultSettingsView-GTWI-W_B.js">
|
||||
<link rel="stylesheet" crossorigin href="./defaultSettingsView.B4dS75f0.css">
|
||||
<link rel="stylesheet" crossorigin href="./index.CzXZzn5A.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<dialog id="fallback-error">
|
||||
<p>The Playwright Trace Viewer must be loaded over the <code>http://</code> or <code>https://</code> protocols.</p>
|
||||
<p>For more information, please see the <a href="https://aka.ms/playwright/trace-viewer-file-protocol">docs</a>.</p>
|
||||
</dialog>
|
||||
<script>
|
||||
if (!/^https?:/.test(window.location.protocol)) {
|
||||
const fallbackErrorDialog = document.getElementById('fallback-error');
|
||||
const isTraceViewerInsidePlaywrightReport = window.location.protocol === 'file:' && window.location.pathname.endsWith('/trace/index.html');
|
||||
// Best-effort to show the report path in the dialog.
|
||||
if (isTraceViewerInsidePlaywrightReport) {
|
||||
const reportPath = (() => {
|
||||
const base = decodeURIComponent(window.location.pathname).replace(/\/trace\/index\.html$/, '');
|
||||
if (navigator.platform === 'Win32')
|
||||
return base.replace(/^\//, '').replace(/\//g, '\\\\');
|
||||
return base;
|
||||
})();
|
||||
const reportLink = document.createElement('div');
|
||||
const command = `npx playwright show-report "${reportPath}"`;
|
||||
reportLink.innerHTML = `You can open the report via <code>${command}</code> from your Playwright project. <button type="button">Copy Command</button>`;
|
||||
fallbackErrorDialog.insertBefore(reportLink, fallbackErrorDialog.children[1]);
|
||||
reportLink.querySelector('button').addEventListener('click', () => navigator.clipboard.writeText(command));
|
||||
}
|
||||
fallbackErrorDialog.show();
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"theme_color": "#000",
|
||||
"background_color": "#fff",
|
||||
"display": "standalone",
|
||||
"start_url": "index.html",
|
||||
"name": "Playwright Trace Viewer",
|
||||
"short_name": "Trace Viewer",
|
||||
"icons": [
|
||||
{
|
||||
"src": "playwright-logo.svg",
|
||||
"sizes": "48x48 72x72 96x96 128x128 150x150 256x256 512x512 1024x1024",
|
||||
"type": "image/svg+xml",
|
||||
"purpose": "any"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
<svg width="400" height="400" viewBox="0 0 400 400" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M136.444 221.556C123.558 225.213 115.104 231.625 109.535 238.032C114.869 233.364 122.014 229.08 131.652 226.348C141.51 223.554 149.92 223.574 156.869 224.915V219.481C150.941 218.939 144.145 219.371 136.444 221.556ZM108.946 175.876L61.0895 188.484C61.0895 188.484 61.9617 189.716 63.5767 191.36L104.153 180.668C104.153 180.668 103.578 188.077 98.5847 194.705C108.03 187.559 108.946 175.876 108.946 175.876ZM149.005 288.347C81.6582 306.486 46.0272 228.438 35.2396 187.928C30.2556 169.229 28.0799 155.067 27.5 145.928C27.4377 144.979 27.4665 144.179 27.5336 143.446C24.04 143.657 22.3674 145.473 22.7077 150.721C23.2876 159.855 25.4633 174.016 30.4473 192.721C41.2301 233.225 76.8659 311.273 144.213 293.134C158.872 289.185 169.885 281.992 178.152 272.81C170.532 279.692 160.995 285.112 149.005 288.347ZM161.661 128.11V132.903H188.077C187.535 131.206 186.989 129.677 186.447 128.11H161.661Z" fill="#2D4552"/>
|
||||
<path d="M193.981 167.584C205.861 170.958 212.144 179.287 215.465 186.658L228.711 190.42C228.711 190.42 226.904 164.623 203.57 157.995C181.741 151.793 168.308 170.124 166.674 172.496C173.024 167.972 182.297 164.268 193.981 167.584ZM299.422 186.777C277.573 180.547 264.145 198.916 262.535 201.255C268.89 196.736 278.158 193.031 289.837 196.362C301.698 199.741 307.976 208.06 311.307 215.436L324.572 219.212C324.572 219.212 322.736 193.41 299.422 186.777ZM286.262 254.795L176.072 223.99C176.072 223.99 177.265 230.038 181.842 237.869L274.617 263.805C282.255 259.386 286.262 254.795 286.262 254.795ZM209.867 321.102C122.618 297.71 133.166 186.543 147.284 133.865C153.097 112.156 159.073 96.0203 164.029 85.204C161.072 84.5953 158.623 86.1529 156.203 91.0746C150.941 101.747 144.212 119.124 137.7 143.45C123.586 196.127 113.038 307.29 200.283 330.682C241.406 341.699 273.442 324.955 297.323 298.659C274.655 319.19 245.714 330.701 209.867 321.102Z" fill="#2D4552"/>
|
||||
<path d="M161.661 262.296V239.863L99.3324 257.537C99.3324 257.537 103.938 230.777 136.444 221.556C146.302 218.762 154.713 218.781 161.661 220.123V128.11H192.869C189.471 117.61 186.184 109.526 183.423 103.909C178.856 94.612 174.174 100.775 163.545 109.665C156.059 115.919 137.139 129.261 108.668 136.933C80.1966 144.61 57.179 142.574 47.5752 140.911C33.9601 138.562 26.8387 135.572 27.5049 145.928C28.0847 155.062 30.2605 169.224 35.2445 187.928C46.0272 228.433 81.663 306.481 149.01 288.342C166.602 283.602 179.019 274.233 187.626 262.291H161.661V262.296ZM61.0848 188.484L108.946 175.876C108.946 175.876 107.551 194.288 89.6087 199.018C71.6614 203.743 61.0848 188.484 61.0848 188.484Z" fill="#E2574C"/>
|
||||
<path d="M341.786 129.174C329.345 131.355 299.498 134.072 262.612 124.185C225.716 114.304 201.236 97.0224 191.537 88.8994C177.788 77.3834 171.74 69.3802 165.788 81.4857C160.526 92.163 153.797 109.54 147.284 133.866C133.171 186.543 122.623 297.706 209.867 321.098C297.093 344.47 343.53 242.92 357.644 190.238C364.157 165.917 367.013 147.5 367.799 135.625C368.695 122.173 359.455 126.078 341.786 129.174ZM166.497 172.756C166.497 172.756 180.246 151.372 203.565 158C226.899 164.628 228.706 190.425 228.706 190.425L166.497 172.756ZM223.42 268.713C182.403 256.698 176.077 223.99 176.077 223.99L286.262 254.796C286.262 254.791 264.021 280.578 223.42 268.713ZM262.377 201.495C262.377 201.495 276.107 180.126 299.422 186.773C322.736 193.411 324.572 219.208 324.572 219.208L262.377 201.495Z" fill="#2EAD33"/>
|
||||
<path d="M139.88 246.04L99.3324 257.532C99.3324 257.532 103.737 232.44 133.607 222.496L110.647 136.33L108.663 136.933C80.1918 144.611 57.1742 142.574 47.5704 140.911C33.9554 138.563 26.834 135.572 27.5001 145.929C28.08 155.063 30.2557 169.224 35.2397 187.929C46.0225 228.433 81.6583 306.481 149.005 288.342L150.989 287.719L139.88 246.04ZM61.0848 188.485L108.946 175.876C108.946 175.876 107.551 194.288 89.6087 199.018C71.6615 203.743 61.0848 188.485 61.0848 188.485Z" fill="#D65348"/>
|
||||
<path d="M225.27 269.163L223.415 268.712C182.398 256.698 176.072 223.99 176.072 223.99L232.89 239.872L262.971 124.281L262.607 124.185C225.711 114.304 201.232 97.0224 191.532 88.8994C177.783 77.3834 171.735 69.3802 165.783 81.4857C160.526 92.163 153.797 109.54 147.284 133.866C133.171 186.543 122.623 297.706 209.867 321.097L211.655 321.5L225.27 269.163ZM166.497 172.756C166.497 172.756 180.246 151.372 203.565 158C226.899 164.628 228.706 190.425 228.706 190.425L166.497 172.756Z" fill="#1D8D22"/>
|
||||
<path d="M141.946 245.451L131.072 248.537C133.641 263.019 138.169 276.917 145.276 289.195C146.513 288.922 147.74 288.687 149 288.342C152.302 287.451 155.364 286.348 158.312 285.145C150.371 273.361 145.118 259.789 141.946 245.451ZM137.7 143.451C132.112 164.307 127.113 194.326 128.489 224.436C130.952 223.367 133.554 222.371 136.444 221.551L138.457 221.101C136.003 188.939 141.308 156.165 147.284 133.866C148.799 128.225 150.318 122.978 151.832 118.085C149.393 119.637 146.767 121.228 143.776 122.867C141.759 129.093 139.722 135.898 137.7 143.451Z" fill="#C04B41"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.9 KiB |
@@ -1,21 +0,0 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<body>
|
||||
<iframe src="about:blank" style="position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;border:none;"></iframe>
|
||||
<script>
|
||||
(async () => {
|
||||
if (!navigator.serviceWorker)
|
||||
throw new Error(`Service workers are not supported.\nMake sure to serve the Trace Viewer (${window.location}) via HTTPS or localhost.`);
|
||||
navigator.serviceWorker.register('sw.bundle.js');
|
||||
if (!navigator.serviceWorker.controller)
|
||||
await new Promise(f => navigator.serviceWorker.oncontrollerchange = f);
|
||||
const traceUrl = new URL(location.href).searchParams.get('trace');
|
||||
const params = new URLSearchParams();
|
||||
params.set('trace', traceUrl);
|
||||
await fetch('contexts?' + params.toString());
|
||||
document.querySelector('iframe').src = new URLSearchParams(location.search).get('r');
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,17 +0,0 @@
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" translate="no">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="icon" href="./playwright-logo.svg" type="image/svg+xml">
|
||||
<title>Playwright Test</title>
|
||||
<script type="module" crossorigin src="./uiMode.Vipi55dB.js"></script>
|
||||
<link rel="modulepreload" crossorigin href="./assets/defaultSettingsView-GTWI-W_B.js">
|
||||
<link rel="stylesheet" crossorigin href="./defaultSettingsView.B4dS75f0.css">
|
||||
<link rel="stylesheet" crossorigin href="./uiMode.Btcz36p_.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,32 +0,0 @@
|
||||
/**
|
||||
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
|
||||
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
||||
* https://github.com/chjj/term.js
|
||||
* @license MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
* Originally forked from (with the author's permission):
|
||||
* Fabrice Bellard's javascript vt100 for jslinux:
|
||||
* http://bellard.org/jslinux/
|
||||
* Copyright (c) 2011 Fabrice Bellard
|
||||
* The original design remains. The terminal itself
|
||||
* has been extended to include xterm CSI codes, among
|
||||
* other features.
|
||||
*/.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}
|
||||
Reference in New Issue
Block a user