Approxima-OSS 是一个开源、基于智能体的 Web 端到端测试平台,采用 MIT 许可证。它的核心思路是:测试用自然语言的意图来编写,而不是用硬编码的选择器,这样当 DOM 变化时测试不会失效。用户用英文描述测试旅程(例如“将商品加入购物车,并验证总价更新”),一个由 LLM 驱动的浏览器智能体在真实浏览器中逐步执行,每一步操作后截图并视觉验证,再继续下一步。
主要能力
目标模式(Goal Mode):无需给出具体步骤,只需提供一个英文目标(例如“注册、创建项目并邀请队友”),智能体便在探索模式下运行,直到完成目标,然后将发现的步骤写回旅程,并立即触发验证运行,证明可复现。之后旅程便以固定的确定性步骤运行。
自愈(Self-healing):当应用变化导致某一步骤的描述不再匹配现实时,智能体不会直接失败,而是推断出步骤应该是什么,并在运行结果旁报告精炼后的步骤。这些建议会以内联形式出现在旅程编辑器中,可一键接受或忽略。建议在被展示前会经过 LLM 审查,以过滤掉无意义的改写。智能体在每次通过时也会尝试精炼步骤,使下一次运行消耗更少的 token 和时间。
流式执行与字幕:每次运行都会将浏览器的实时屏幕录像流式传输到仪表盘,智能体以字幕形式叙述其推理(“购物车图标显示 0,正在寻找添加按钮”)、所执行的操作以及每个检查的通过或失败。当出现问题时,你能看到智能体看到的内容以及它做出判断的原因,无需翻阅日志。
技能(Skills):技能是可复用的步骤序列(例如“登录”:输入邮箱、输入密码、点击提交),旅程可以将技能作为单个步骤引用。技能在运行时内联展开,因此更新技能会更新所有使用它的旅程。目标模式运行也感知技能库,当发现的步骤匹配已有技能时,会折叠回单个技能引用而不是重复步骤。
智能体微调与影子运行:智能体是版本化的,每个(旅程、探索)智能体位于 web-runner/src/agent/ 下的版本文件夹中,每次运行都会记录所用的版本。可以在 shared/agent-versions.ts 中注册测试版并开启 AUTO_SHADOW_ENABLED,这样每次真实运行都会在相同旅程上生成一个配对的影子运行,管理面板会以配对统计比较两个群体。
变量与机密:步骤可以使用 $NAME 语法引用变量,值按应用存储并在派发时解析。标记为机密的变量会进行静态加密(AES-256-GCM)、在仪表盘中掩码显示(••••••••),并从存储的运行日志中清除。步骤建议基于未解析的 $NAME 标签生成,因此自愈不会将机密烘焙进旅程。但为了让智能体登录应用,它必须输入实际值,因此机密会离开你的机器,出现在智能体收到的提示词和它审阅的截图中,并因此到达你配置的 LLM 提供商。去密只控制值最终停留的位置(数据库、仪表盘、建议),无法将值从模型中撤回。因此,在 Approxima 中使用的机密应仅针对不重要的测试工作区。
智能体如何驱动浏览器:智能体基于截图工作,但作用于 DOM。点击时采用元素优先、坐标消歧的方式:智能体从截图中读取目标(可见文本、aria 标签或 CSS 选择器)和大致像素坐标,目标按优先级分层解析(角色、文本、CSS 选择器),最终执行 Playwright 的真实元素点击。截图默认捕获视口(默认 1280×720,移动模式 390×844),也可按需裁剪 400×400 区域以查看细节。
使用方式
架构:API 将运行排队到 Postgres,并派发给 web-runner;web-runner 启动本地 Chromium,用配置的 LLM 逐步驱动,并通过回调报告结果。
前置条件:Node 20+、Postgres 数据库、用于截图的 S3 兼容存储桶,以及至少一个 LLM API 密钥(OpenAI、Anthropic 或 Gemini)。
步骤:创建数据库表(通过 Drizzle 应用 api/drizzle/ 中的迁移),配置 API,配置 web runner,打开 http://localhost:3000(无需登录),创建指向待测 URL 的应用,编写第一个旅程(或只给一个目标让智能体自行发现步骤)。
登录被测应用:像用户一样添加步骤,例如“在邮箱字段输入 $TEST_EMAIL,输入 $TEST_PASSWORD,点击登录”,凭据存储为应用变量(设置 → 变量与机密)。
迭代智能体:复制 web-runner/src/agent/<type>/v1/ 到 v2/,将其加入 <type>/index.ts 的版本映射,并在 shared/agent-versions.ts 中注册(AVAILABLE_VERSIONS,以及用于影子测试的 BETA_VERSIONS)。
部署:API 与仪表盘一起部署为一个 Cloudflare Worker;Web runner 可部署在任何能运行 Chromium 的 Node 主机上,通过 WEB_RUNNER_URL / WEB_RUNNER_API_KEY 指向它。数据库迁移使用 Drizzle 命令。
适用场景与限制
适用场景:需要快速迭代、频繁发布的 Web 应用端到端测试;希望用自然语言维护测试、避免选择器维护负担的团队;希望自托管测试数据与结果、不依赖第三方托管 QA 平台的组织。
限制:没有用户认证,仪表盘和 API 对任何能访问它们的人开放,因此应运行在 localhost、私有网络或自有认证代理之后。机密会发送给 LLM 提供商,因此仅应用于不重要的测试工作区。需要自行准备 Postgres、S3 兼容存储和 LLM API 密钥。