Playwright E2E 测试实战:钱包 Mock 与交易测试的 3 层防护
Playwright E2E 测试实战钱包 Mock 与交易测试的 3 层防护【免费下载链接】notepad--一个支持windows/linux/mac的文本编辑器目标是做中国人自己的编辑器来自中国。项目地址: https://gitcode.com/GitHub_Trending/no/notepad--你打开 CI 日志两种卡死最常见钱包按钮点下去毫无反应用例干等 30 秒后超时交易测试半夜挂掉报告只留一行 timeout没人说得清挂在哪一行。把这套做法搬进 notepad-- 的 Playwright E2E 流水线时钱包连接和下单确认就是最容易翻车、也最值得先稳住的两条链路。策略一句话用addInitScript在页面脚本执行前注入钱包 Mock用环境门控保证生产环境不碰真实资金用显式超时替代无限等待。在 CI 中注入钱包 Mock 的完整写法CI 里装不了真实钱包插件结论先说用context.addInitScriptcontext 内每个文档加载前执行的钩子注入 Mock Provider别用page.evaluate——后者要等页面加载完才执行而应用代码早就检测过window.ethereum并判定无钱包了。下面的用例在点击连接之前把假钱包挂到全局只打桩测试路径真正用到的两个方法eth_requestAccounts返回固定地址eth_chainId返回主网0x1未打桩的方法直接抛错防止用例悄悄依赖未知行为。test(连接钱包后展示脱敏地址, async ({ page, context }) { // 任何页面脚本执行前把假钱包挂到 window.ethereum await context.addInitScript(() { window.ethereum { isMetaMask: true, request: async ({ method }) { if (method eth_requestAccounts) { return [0x1234567890123456789012345678901234567890] } if (method eth_chainId) { return 0x1 } throw new Error(未打桩的 RPC: ${method}) } } }) await page.goto(/) await page.locator([data-testidconnect-wallet]).click() // 断言只认地址前缀不和完整地址耦合 await expect( page.locator([data-testidwallet-address]) ).toContainText(0x1234) })关键点有两处注入时机必须早于应用代码的钱包检测断言只认0x1234前缀而不是完整地址后面换 Mock 地址不会把用例改崩。让交易测试不碰真实资金的三层防护交易用例的风险不在断言写错在真下了单。三层防护按顺序叠加每层独立生效。第一层生产环境进门就拦用例开头先做环境判断test(下单并确认成交, async ({ page }) { // NODE_ENV 为 production 时跳过不让真实资金参与测试 test.skip( process.env.NODE_ENV production, 生产环境不执行交易用例 )把门控写在用例第一行生产环境里就算有人误跑Playwright 也会把它标成 skipped发单动作根本不会发生。第二层确认前先校验预览进了测试环境后先走完整下单动作再校验预览面板await page.goto(/markets/test-market) await page.locator([data-testidposition-yes]).click() await page.locator([data-testidtrade-amount]).fill(1.0) // 预览金额回填正确才允许继续 const preview page.locator([data-testidtrade-preview]) await expect(preview).toContainText(1.0)这一步别省金额显示类 bug 必须在按下确认按钮之前就被拦下来。第三层显式等待链上响应预览没问题后点击确认等链上结果await page.locator([data-testidconfirm-trade]).click() // 等 /api/trade 返回 200链上确认慢超时显式给到 30 秒 await page.waitForResponse( (resp) resp.url().includes(/api/trade) resp.status() 200, { timeout: 30000 } ) await expect(page.locator([data-testidtrade-success])).toBeVisible() })用waitForResponse锚定具体接口和状态码比盲目 sleep 可靠30 秒超时保证链路真卡住时用例干脆失败而不是把你的 CI 拖到怀疑人生。把 Flaky 单独统计报告只留四个可行动字段Flaky随机通过/失败的用例单独计数是为了让偶发失败不稀释 CI 上的真实失败率——这类用例先进观察名单修稳定性而不是和真 bug 混在一个池子里。落到报告上按这个最小字段集写每个失败用例给文件行号如tests/e2e/feature.spec.ts:45能直接点过去、一行错误信息、失败截图路径、一句修复建议。Summary 行按 Passed、Failed、Flaky、Skipped 四类分开计数HTML 报告、截图、视频、trace 四类产物统一放进artifacts/找东西只认这一个目录。落地前逐条勾选的 E2E 检查清单addInitScript注入的钱包 Mock 只覆盖当前用例用到的 RPC未打桩方法直接抛错交易用例第一行是生产环境跳过门控点击确认前有一步预览金额断言链上等待用waitForResponse 显式超时不靠无限等待失败报告写齐文件行号、错误信息、截图路径、修复建议产物统一落artifacts/【免费下载链接】notepad--一个支持windows/linux/mac的文本编辑器目标是做中国人自己的编辑器来自中国。项目地址: https://gitcode.com/GitHub_Trending/no/notepad--创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考