自然语言场景
用纯自然语言描述测试。无需选择器、无需页面对象、无需维护测试代码。
LLM 只规划一次浏览器操作。从第二次运行起,Windup 进行确定性回放,零 LLM 调用 —— ~1 秒、$0,结果稳定。你编辑的是测试场景,而非选择器。
问题所在
手写的 E2E 测试,每当选择器变动就会失效。在每次运行时都驱动浏览器的 AI 智能体则速度慢、不确定,且每个测试都要向你收取一次 LLM 调用的费用。
Windup 只规划一次,并缓存一份经过验证的操作计划。回放是确定性的,且免费。当应用发生变化、某个检查失败时,计划会失效并自动重新规划 —— 自愈,而不是悄无声息地出错。
工作原理
最昂贵的部分 —— 弄清楚该执行哪些浏览器操作 —— 只发生一次,并被转化为缓存的、可验证的数据。
一个自然语言任务交给规划器。LLM 产出一份 JSON 操作计划 —— 一次调用,仅在首次运行时发生。
一个确定性执行器(Playwright)运行该计划。廉价的 DOM/URL 后置条件验证每个操作 —— 无需 LLM。
轨迹被缓存下来。之后每次运行都回放它:零 LLM 调用、~1 秒、$0,每次都是同一份计划。
为什么选 Windup
手写脚本运行成本低,但维护成本高。每次运行都调用 AI 的智能体易于编写,但速度慢且不确定。Windup 各取二者之长。
| 维度 | 手写脚本 | 每次运行都用 AI 智能体 | Windup |
|---|---|---|---|
| 编写方式 | 代码 + 选择器 | 自然语言 | 自然语言 |
| 每次运行成本 | $0 | 每次运行都调用 LLM | 仅首次运行调用 LLM |
| 速度 | 快 | 慢(模型在回路中) | ~1s 回放 |
| 确定性 | 高 | 低(每次即兴发挥) | 高(每次都是同一份计划) |
| 应用发生变化 | 你去修脚本 | 可能悄无声息地做错事 | 检查失败 → 重新规划 |
功能特性
一款为真实项目打造的 CLI:场景编写、密钥管理、依赖关系、成本追踪和 CI 报告器。
用纯自然语言描述测试。无需选择器、无需页面对象、无需维护测试代码。
从第二次运行起:llm_calls=0、~1s、$0。缓存的计划每次都以相同方式运行。
Playwright 配合可信输入事件(isTrusted)—— 可靠的点击、输入与导航。
每个操作都检查 DOM/URL 后置条件,回路中没有 LLM。
LLM 辅助编写:根据你应用的真实页面(站点地图)+ 项目清单生成场景。--validate 会运行并不断改进,直到通过。
直接从源代码(Next.js、react-router)索引你的路由和元素。
凭据从不进入场景、缓存、LLM 提示词或 git —— 只有 ENV:* 引用,在运行时解析。
场景之间的依赖关系(例如「创建发票」依赖「登录」)—— 同一会话,按依赖分别缓存。
AI 撰写一份运行后的复盘,引用真实观察到的值 —— 价格、消息、确认信息。
失败时,AI 阅读真实页面并对你的场景提出修复建议。
JUnit、JSON 和自包含的 HTML(--reporter)。任何失败都会返回非零退出码。
Google Gemini 和 OpenAI,可按次运行选择(--llm openai:gpt-5-mini)。windup costs 按提供商和模型追踪花费。
在一个共享的热浏览器上以隔离的上下文并行运行多个场景 —— 混合套件下约快 2 倍,在有规划或长流程时更快。默认串行。
用 --browser 在 Chromium(默认)、Firefox 或 WebKit 上运行相同的场景。同一份计划可在三者上回放 —— 编写一次,处处运行。
示例
你只写意图。首次运行进行规划并支付几分之一美分;此后每次运行都是缓存回放,成本 $0。
{
"scenario_id": "checkout",
"task": "Log in as the qa account, add 'Backpack' to the cart, check out and verify the order confirmation message appears."
} $ windup run checkout # 1st run
PASS checkout cache=miss llm_calls=1 total=3003ms cost=$0.0024
$ windup run checkout # again — deterministic replay
PASS checkout cache=hit llm_calls=0 total=671ms cost=$0 cache=hit · llm_calls=0 · $0 —— 第二次运行从不触及模型。
CI / CD
在一个热浏览器中运行整个套件,任何场景失败都让构建失败,并产出机器可读或人类可读的报告。
$ npx windup run --all --reporter junit \
--report-file reports/windup.xml 可靠性
回放是实测出来的,不是承诺出来的。缓存的计划每次运行都产出相同结果 —— 没有模型,没有抖动。
快速开始
Node ≥ 20,以及一个 API 密钥 —— GOOGLE_GENERATIVE_AI_API_KEY(Google,默认)或 OPENAI_API_KEY(OpenAI)—— 放在 .env.local 中。密钥仅用于规划;缓存回放从不调用 LLM。
$ npm i -D windupjs $ npx windup init $ npx windup scan $ npx windup new "log in and create an invoice for ACME" $ npx windup run checkout 面向 AI 时代
如今没人再读文档了 —— 大家都把它交给助手。所以 Windup 附带了一份 llms.txt:整套文档,为机器结构化组织。把你的编码智能体指向它,用纯自然语言描述流程,它就会为你编写并运行场景。
将此 URL 粘贴到你的助手(Claude、Cursor、Copilot……)中。
https://windup.run/zh/llms.txt 一段现成可粘贴的起始提示词 —— 填入你的流程即可。
阅读 https://windup.run/zh/llms.txt 并为我的应用搭建 Windup E2E 测试,然后为以下流程编写场景:…… llms-full.txt —— 整套文档汇于一个文件 · 每页 markdown 位于 /zh/docs/<page>.md · llms.txt 标准