
1 行代码打开被测应用e2e 框架 app.open 完全指南【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e在e2e下一代 Web 与移动端 e2e 测试框架中app.open()是每个测试的第一步它负责在测试开始前把被测应用带到指定页面——Web 端打开配置的 URL 或任意路由移动端则像 Detox/Maestro 的launchApp一样把目标 App 全新启动一次。本文用最少代码讲清楚app.open的完整用法相对路径如何拼接到app.url、baseUrl如何读取随机端口、移动端为何不能传路径以及APP_URL_REQUIRED、APP_UNREACHABLE等常见报错怎么快速定位。app.open 是什么为什么每个测试都要它app是 e2e 提供的跨平台应用生命周期 fixture它统一了 Web 和移动端的打开应用语义所有平台通用。官方参考见 app.mdx。三个关键特性确定性入口每个测试都从app.open()开始而不是依赖上一个测试留下的页面状态e2e 测试之间应用状态会重置页面不保留。可移植同一条app.open()在 Chromium、WebKit、iOS/Android 真机模拟器上都能运行只是行为不同。带预算与报错语义app.open()使用config.timeout默认 120000ms失败时抛出带错误码的异常CI 里可直接按码归类。快速上手Web 端 3 步打开页面第一步在配置里声明应用地址。在e2e.config.ts的 target 中设置app.urlexport default { targets: [{ engine: web(), app: { url: process.env.APP_URL ?? http://localhost:3000 }, }], } satisfies E2EConfig;第二步在测试里调用app.open()。不传参数打开首页test(shows the greeting form, async ({ app, screen }) { await app.open(/); await expect(screen.getByRole(heading, Say hello)).toBeVisible(); });第三步传路由参数打开子页面。相对路径会相对app.url解析这是写路由测试最常用的姿势await app.open(/settings/billing);完整可运行示例见 greeting.e2e.tsWeb 引擎的导航实现位于 surface.tsopen方法内部即page.goto。相对路径、绝对 URL 与 baseUrlURL 解析规则app.open(path?)接受的参数有三类解析规则如下表传入形式示例打开结果不传app.open()打开app.url声明的基地址相对路径app.open(/e/filter-deep-link)拼接到app.url之后带 query 的深链app.open(/e/filter-deep-link?qmug)同样相对基地址解析用于深链测试绝对 http(s) URLapp.open(https://staging.example.com)直接打开非 http/https 协议抛POLICY_DENIED两个实用细节URL 省略协议时的默认值不带 scheme 的地址默认按 HTTPS 处理只有 loopback 主机localhost/127.0.0.1才允许 HTTP。声明规则见 config.mdx 的url一行。app.baseUrl读取实际地址当app.url声明端口0让 runner 分配空闲端口避免多 checkout 端口冲突时测试代码应从app.baseUrl读取运行时真实 URL而不是硬编码端口。深链测试的真实用例见 filter-deep-link.e2e.ts——先打开?qmug深链直接断言筛选框已回填test(opening a shared link restores the filter, async ({ app, screen }) { await app.open(/e/filter-deep-link?qmug); await expect(screen.getByPlaceholder(Filter products)).toHaveValue(mug); });移动端用法app.open() 启动而非导航移动端 target 没有 URL 概念应用由app.bundleId或app.appPath指定此时app.open()不传参 全新启动 App等价于 Maestro 的launchApp/ Detox 的启动动作app.open(/path)会报错APP_URL_REQUIRED——路径在真机上无处可去打开链接应改用device.openLink(url)。移动端示例见 smoke.e2e.tstest(home lists the scenarios and opens one, async ({ app, device, screen }) { await app.open(); // 冷启动 Expo 应用 await expect(screen.getByTestId(Login Form)).toBeVisible(); await app.back(); // 返回上一页 }); 移动端没有自动启动和 Detox 一样什么都不会自己启动每个测试必须显式app.open()开始。迁移指南见 detox.mdx 与 maestro.mdx。让 runner 帮你启动应用app.command 配合使用如果应用需要 dev server在 target 里加上app.commandrunner 会在测试前自动拉起进程、轮询就绪、运行结束后自动关闭app: { url: http://localhost:3000, command: { executable: npm, args: [run, dev], reuseExisting: true, // 本地复用已启动的 serverCI 会忽略并提示 APP_ALREADY_RUNNING log: .e2e/logs/app.log, }, },配合空闲端口写法{port}占位符由 runner 展开app: { url: http://127.0.0.1:0, command: { executable: pnpm, args: [dev, --port, {port}], env: { PORT: {port} } }, },这样并行跑多个 checkout 也不会端口冲突。完整选项readyUrl健康检查、startupTimeout、env等见 starting-your-app.mdx命令解析与端口替换逻辑在 command.ts。常见报错速查打开失败先看这张表错误码含义最快修复APP_UNREACHABLE连接被拒/DNS 失败应用没在app.url上运行启动应用、修正app.url或加app.command让 runner 启动它APP_URL_REQUIRED移动端 target 上给app.open()传了路径改用无参app.open()链接走device.openLinkPOLICY_DENIED打开了非 http(s) 协议的 URL只允许http:/https:about:blank除外UNSUPPORTED_CAPABILITY引擎不支持该操作如无 URL 的 target 无session.open检查 target 的engine与app声明是否匹配APP_UNREACHABLE的友好报错信息生成逻辑就在 fixtures.tsunreachableApp函数appfixture 的完整构建逻辑同文件createApp。进阶open 之外的生命周期 APIapp.open()只是appfixture 家族的一员配套方法帮你完成状态管理方法作用超时app.open(path?)打开基地址、相对路径或绝对 URL移动端冷启动config.timeout120000msapp.restart()保留持久化状态重建执行上下文并回到基地址config.timeoutapp.clearState()清除本地存储等状态后重建上下文注意serial 组里会破坏组内共享状态config.timeoutapp.back()回退一次config.actionTimeout30000msapp.screenshot(label?)截图留证敏感字段自动打码config.actionTimeout典型打开 断言 留证组合await app.open(/settings/billing); const shot await app.screenshot(after-checkout);常见问题 FAQQ测试之间页面状态会串吗不会。e2e 每个测试独立重置应用状态所以官方约定每个测试都先app.open()这也是登录态等场景用 setup fixture 的原因见 authentication.mdx。Qapp.open()和 Playwright 的page.goto有什么区别app.open()是跨平台的确定性入口Web 端它由引擎执行导航移动端则是冷启动它还统一了超时预算、步骤记录和APP_UNREACHABLE等错误语义。纯浏览器操作路由拦截、下载等则在browserfixture 上见 browser.mdx。Q多浏览器/多视口怎么共用一个应用一个app配置可被多个 target 引用例如同时跑 chromium 与移动端视口的 webkit两个 target 共享同一app.command进程。写法见 starting-your-app.mdx 的 Several targets 一节。延伸阅读官方 API 参考app.mdx应用启动与端口分配starting-your-app.mdx移动端完整指南mobile.mdx快速上手含app.open()首次出现处quickstart.mdx配置字段总表config.mdx掌握app.open()你就握住了 e2e 测试的第一公里一行代码把 Web 或移动端应用带到任意页面然后安心交给screen定位器去断言交互。【免费下载链接】e2eNext generation e2e testing framework for web and mobile apps.项目地址: https://gitcode.com/GitHub_Trending/e2e6/e2e创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考