问题修复
当需要验证 GA4/GTM…
在 Playwright 中拦截真实的 collect 端点信标,按追踪计划契约断言事件名、参数、类型、去重与同意状态,并在 CI 中阻断埋点回归。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
当需要验证 GA4/GTM、Meta/T通用
解决思路
- 先检查项目根目录的 `.agents/qa-project-context.md`,跳过其中已回答的栈、标签管理器、同意平台和目标环境信息;再确认哪些追踪目标在线(GA4 `/g/collect`、Meta Pixel `facebook.com/tr`、TikTok `analytics.tiktok.com`、LinkedIn `px.ads.linkedin.com`)、是 GTM 还是硬编码 gtag、是否已有追踪计划、同意平台与默认同意状态、是否有客户端+服务端(CAPI)去重、是否有新闻媒体页面。
- 拦截真实信标而非只信 DOM 或 dataLayer:用 `page.waitForRequest`(单个事件)、`page.on('request', ...)`(收集多个)或 `page.route`(检查后 `continue`,绝不 `abort`),从 `new URL(request.url()).searchParams` 解析参数后断言。
- 按 GA4 `/g/collect` URL 语法断言:`v=2`、`tid=G-XXXXXXX`、`en=` 事件名、`ep.<name>=` 字符串参数、`epn.<name>=` 数字参数、`gcs=`/`gcd=` 同意状态;注意字符串/数字类型区分(如 `ep.currency` 与 `epn.value`)。
- 把追踪计划做成带类型的契约:用版本化的 `tracking-plan.json`/`.yaml` 或 TS `interface`/`Zod` schema 定义每个事件的必填参数及类型,测试导入它并校验捕获的事件,报告 `missing` 参数和类型 `violations`,不要内联硬编码期望值。
- 当要验证 GTM 输入契约时,用 `addInitScript` 在导航前包裹 `window.dataLayer.push` 记录所有 push,再用 `page.evaluate` 读取;对电商断言嵌套的 `ecommerce.items` 数组及每项的 `item_id`、`price`、`currency`,用 `find`/`filter`/`some` 定位事件。
- 对 Meta/TikTok/LinkedIn 像素拦截各自端点(`facebook.com/tr`、`analytics.tiktok.com`、`px.ads.linkedin.com`),解析事件参数与去重键。
- 对 Purchase 等客户端+服务端事件断言去重:捕获浏览器 `facebook.com/tr?ev=Purchase` 信标的 `eid`/`event_id`,断言其等于服务端 CAPI 发送的 `event_id`,确保 Meta 合并为一次转化而非重复计数。
- 测试 Consent Mode v2 两种状态:用 `addInitScript` 在页面脚本运行前注入 `gtag('consent','default',{...})` 的 denied 状态,断言同意前不触发完整信标(或仅无 cookie 的同意 ping)且 `gcs=G100`;点击 CMP 接受按钮后断言完整信标触发且 `gcs=G111`。
- 确保四个同意信号 `ad_storage`、`analytics_storage`、`ad_user_data`、`ad_personalization` 默认全部为 `denied`;`gcs=` 只编码前两个,`gcd=` 编码全部四个。
- 对新闻媒体事件覆盖三类:文章加载时的 `article_view`(含 id、section、author 元数据)、25/50/75/100 百分比的 scroll-depth(每桶一次)、免费文章额度耗尽时的 `paywall_hit`/meter 事件。
- 用真实滚动动作驱动 scroll-depth(`mouse.wheel`、`element.scrollIntoView`、`page.evaluate(() => window.scrollTo(...))`/`scrollBy`),并用 `waitForRequest` 等待信标,绝不用 `waitForTimeout`。
- 构建一个可复用的 Playwright fixture(`test.extend`):用 `page.on('request', ...)` 监听并匹配所有目标端点,解析 `searchParams` 和 `postData()`,把规范化的 `{ destination, eventName, params }` 推入 `collected` 数组供测试断言;绝不调用 `route.abort()`。
- 在 CI 中做回归门禁:用 Playwright 项目跑关键旅程、用 fixture 捕获所有信标、按追踪计划校验,把捕获事件与追踪计划基线做 diff,事件丢失或必填参数缺失时让测试失败、Playwright 非零退出、CI 任务变红;该门禁放在 PR CI 合并前运行。
- 按规模决定自建还是购买:少量事件、关键旅程、合并前门禁用 Playwright 自建;数百事件、多域名、小团队、需要 7x24 生产漂移监控时考虑购买 Trackingplan(持续监控实时流量)或 ObservePoint(定期扫描审计)。
- 验证套件真能捕获回归:跑 `npx playwright test -g add_to_cart` 并用 `--trace on` 确认 trace 中有带 `en=add_to_cart` 的 `/g/collect` 请求;在分支中重命名必填参数(如 `value` → `amount`)后重跑 CI 项目,构建必须非零退出并报 `missing`/violation;确认同意前 `gcs=G100`、接受后 `gcs=G111`;确认客户端 `eid` 等于服务端 CAPI `event_id`。
适用边界 · 注意事项
- 不适用于判断埋点在 GDPR/CMP 同意法律下是否被允许触发——那是 compliance-testing 的职责;本技能只检查数据是否正确。
- 不适用于 SEO meta 标签或结构化数据测试,超出范围。
- 不要用 Google Tag Assistant 当作 CI 门禁(它只是交互式调试工具),也不要把 Segment Protocols 当作唯一的校验手段(它只治理流经 Segment 的数据,不覆盖任意客户端信标)。