e2e

框架

tester-army/e2e

AI 驱动的 Web 与移动端端到端测试框架。

项目简介

开源端到端测试框架,用自然语言描述目标,由 AI 代理驱动 Web 或移动应用完成操作。支持在同一测试中结合定位器与断言,可录制代理操作并在后续运行中无需模型调用地回放。基于 Playwright 浏览器或 iOS/Android 模拟器,提供 SDK、运行器、CLI 与可插拔引擎包。

README 预览

\n\n\n  \n  \n  \n  \n\n\n# e2e\n\n[e2e](https://tester.army/e2e?utm_source=e2e&utm_medium=github&utm_campaign=readme_intro) is an end-to-end testing framework for web and mobile apps. Describe a goal in natural language and an agent drives the app to reach it. Check the result with locators and assertions in the same test.\n\n```ts\n// tests/checkout.e2e.ts\nimport { test, expect } from 'e2e';\n\ntest('a member upgrades to Pro', async ({ app, agent, screen }) => {\n  await app.open('/settings/billing');\n\n  await agent.act('upgrade the workspace to the Pro plan');\n  await agent.assert('the invoice preview shows a prorated amount');\n\n  await expect(screen.getByRole('status')).toContainText('Pro');\n});\n```\n\nAn agent step that a later assertion verifies records its actions, and the\nnext run replays them with no model calls until the app changes. Tests\nwithout agent steps need no model. Bring your own subscription, API key, or\nlocal model.\n\n## Quick start\n\n```bash\nnpx e2e init\n```\n\n`init` asks for an engine, web or mobile, and a model provider, then writes a\nconfig and an example test. The\n[quickstart](https://e2e.tester.army/docs/quickstart) covers the rest.\n\n## Packages\n\n| Package | What it does |\n| --- | --- |\n| [`e2e`](https://www.npmjs.com/package/e2e) | The SDK, runner, and CLI. |\n| [`@e2e-dev/web`](https://www.npmjs.com/package/@e2e-dev/web) | Browser engine: Chromium, Firefox, and WebKit through Playwright. |\n| [`@e2e-dev/mobile`](https://www.npmjs.com/package/@e2e-dev/mobile) | iOS and Android engine: simulators and emulators through agent-device. |\n| [`@e2e-dev/github`](https://www.npmjs.com/package/@e2e-dev/github) | Reporter that posts results as a pull request comment. |\n| [`@e2e-dev/kernel`](https://www.npmjs.com/package/@e2e-dev/kernel) | Kernel hosted browsers for the web engine. |\n| [`@e2e-dev/eas`](https://www.npmjs.com/package/@e2e-dev/eas) | EAS Simulators hosted iOS simulators and Android emulators for the mobile eng

常见问题 (5)

故障排除
为什么在 e2e 移动端测试中,worker 替换会丢失 provider 租用会话上的 device claim?

在 e2e@0.15.1 / @e2e-dev/mobile@0.9.0 中,失败的单元会停用 worker,而 AgentDeviceSurface.dispose() 会调用 sessions.close(),在替换 worker 重新打开代理设备声明之前就将其释放——从而让另一个会话抢占该设备。此问题已在 PR #1209 中修复:当某个 slot 持有 provider 租约时,worker 替换现在会保持会话及其设备声明处于打开状态;只有 release 或运行结束才会将其关闭。可通过 npm i @e2e-dev/mobile@nightly e2e@nightly 安装该修复,或升级到 0.15.1 / 0.9.0 之后的下一个稳定版本。

来源 Issue #792
操作指南
如何根据所设置的 API key 在 e2e.config.ts 中使用不同的 AI 模型?

你不需要内置的回退 API——直接在 e2e.config.ts 中对环境变量使用普通的条件表达式:

export default {
  agents: {
    default: {
      model: process.env.ANTHROPIC_API_KEY
        ? anthropic('claude-sonnet-5')
        : gateway('openai/gpt-6-luna-fast'),
    },
  },
} satisfies E2EConfig;

这样,每台机器都会根据本地可用的凭据(例如 ANTHROPIC_API_KEY 与 AI_GATEWAY_API_KEY)来选择模型,而无需修改已提交的配置。注意:有人曾提议引入专门的 firstAvailable 核心 API,但被维护者否决了,因为把模型放入回放缓存键(replay cache key)会破坏跨机器的回放,并在配置加载时失败。取而代之的是,所选模型会随每条录制分别记录(见 issue #1192),而不改变缓存键。

来源 Issue #1116
故障排除
如何在 tester-army e2e 中捕获逐步调试截图,而不启用模型视觉或将截图归因到错误的操作?

不要在 onStep 中异步截图——它是一个非阻塞的进度反馈流,因此截取的图像可能会落在后续的屏幕上。正确的做法是:1) 升级到 e2e@0.21.2 并调用 session.report(),以获取内置的步骤-屏幕追踪,其中包含经过脱敏、有边界限制的逐步骤语义差异。2) 使用 agent.act() 的 onAction 钩子(在 #1219 中新增)——它会在每个操作之后以 await 方式执行,因此在其中调用 app.screenshot() 可保证与该操作对应:await agent.act('Open Settings', { onAction: async () => { await app.screenshot(); } })。3) 现在即使在填充机密信息(secret fill)之后,产物截图(artifact screenshots)也会被保留(#1218),同时现有的掩码和机密污染规则仍然强制执行。以上任何功能都不会启用模型视觉,也不会向模型发送像素。

来源 Issue #1077
操作指南
如何从托管的 e2e 会话中导出版本化的调试报告,以供外部调试查看器使用?

使用随 e2e@0.21.2 发布的 session.report()(PR #1156)。会话关闭后,它会返回该会话稳定的 report-1 文档——与为托管追踪构建的同一 schema——其中包含 run/attempt/target 身份信息、SDK 最终结果、各步骤的耗时/状态/错误、已记录的事件以及现有的产物引用。该文档对已通过、SDK 失败和超时的会话均可用,因此使用方可以序列化/上传该文档并渲染自己的查看器,而无需解析 Markdown、扫描产物目录或导入私有的 runner 内部实现。现有的密钥脱敏与保留策略仍然权威有效(延迟解析的密钥脱敏在 issue #1157 中单独跟踪)。包含产物清单和推理摘录的更广泛调试包已被缩减范围;如果你的查看器需要 report-1 未携带的证据,请提交一个专门的 issue。

来源 Issue #1074
故障排除
为什么 e2e CLI 在视频录制清理失败的情况下仍以代码 0 退出并报告测试通过?

在 e2e 0.21.2 中,CLI 不会将视频清理失败(例如 CLEANUP_TIMEOUT 'stopping the video timed out')视为运行失败,因此使用 --video on 的运行可能在测试通过的情况下以退出码 0 结束,但没有保留任何视频产物。解决方法:(1) 不要仅信任退出码 0——对 CLI 进行封装,检查运行报告中是否存在 cleanup: "failed"、带有 CLEANUP_TIMEOUT 错误码的 secondaryErrors,并验证视频产物确实已生成。(2) 为避免超时本身,可减小录屏尺寸(例如从 1440x1100 降至 960x720),将质量降低至 60,并将 cleanupTimeout 从 30000 毫秒增加到 90000 毫秒。目前正在修复,以在运行结果或退出状态中明确暴露清理失败。

来源 Issue #1231