Playwright 与现代自动化框架

共 17 题
📑 题目列表 17 题
#
★★★

1. Playwright 的 auto-wait 机制与 Selenium 显式等待相比有何本质改进?为何能显著降低用例 flaky 率?

Playwright 的 auto-wait 机制与 Selenium 显式等待相比有何本质改进?为何能显著降低用例 flaky 率?

  • auto-wait 机制
  • 与显式等待对比
  • 降低 flaky 的原因

Playwright 的 auto-wait(自动等待)是内置的"等待可操作"机制:每次动作(点击、输入、check)前,Playwright 自动等待元素满足"可见、稳定、可交互、可接收事件"等条件,无需手动写等待。与 Selenium 显式等待的本质改进:Selenium 默认"立即查找",需开发者手动用 WebDriverWait + ExpectedConditions 显式声明每个等待条件,易遗漏、易写错、易用固定 sleep;Playwright 把"等待可操作"内置到每个动作,开发者无需手动等待,且"等待条件"由引擎根据动作自动推导(点击前等稳定可点、输入前等可编辑、读取前等出现)。为何显著降低 flaky:一是消除"手动等待"的遗漏与错误(很多 flaky 源于漏写/错写等待);二是等待的是"动作可执行的业务条件"而非"元素存在"(更精确);三是动作自动重试(元素变化时重新解析);四是 Web-first 断言(expect(locator).toBeVisible())自动轮询等待,不用 .until。这些机制把"等待"从"开发者责任"转为"引擎保障",从源头减少时序类 flaky。

auto-wait 的本质是把"等待可操作"从手动责任转为引擎内置。精确的条件推导 + 自动重试 + Web-first 断言,消除了 Selenium 手动等待的遗漏与错误,是 flaky 率大幅下降的核心。

#
★★★

2. Playwright、Selenium、Cypress 的架构差异(CDP/WebSocket vs WebDriver HTTP vs 进程内注入)与选型依据?

Playwright、Selenium、Cypress 的架构差异如何?CDP/WebSocket vs WebDriver HTTP vs 进程内注入的差异与选型依据是什么?

  • 三者架构差异
  • 通信方式
  • 选型依据

三者的架构与通信方式显著不同。Playwright:通过 CDP(Chrome DevTools Protocol)经 WebSocket 与浏览器通信,可跨浏览器(Chrome/Firefox/WebKit)、支持多上下文、可监听网络/事件,auto-wait 内置,开发者体验好。Selenium:通过 WebDriver HTTP 协议(W3C)与浏览器驱动通信,跨浏览器最广(含 Safari/老浏览器),生态成熟但需手动等待、API 较底层。Cypress:进程内注入(在浏览器内运行测试脚本,直接操纵 DOM),同步执行、易调试、内置拦截,但受同源限制、无法真正跨浏览器多标签、局限在 Chromium 系(及电子)。选型依据:跨浏览器需求(Selenium/Playwright 广,Cypress 受限);开发体验与 flaky 治理(Playwright/Cypress 更现代,auto-wait/内置断言);性能与并发(Playwright 多上下文高并发出色);同源/多标签与 iframe 场景(Cypress 受限,Playwright/Selenium 更灵活);团队技术栈与生态(Selenium 生态最成熟,Playwright 增长快)。综合:新项目多选 Playwright(体验好、能力强),需极致跨浏览器/成熟生态选 Selenium,纯前端团队快速上手可选 Cypress。

选型的核心是"架构决定的边界"。Playwright 用 CDP/WebSocket 能力强、体验好;Selenium 用 WebDriver HTTP 跨浏览器最广;Cypress 进程内注入受同源限制,按跨浏览器、体验、场景限制权衡。

#
★★★

3. Playwright 的 Trace Viewer、codegen、UI Mode 如何提升用例编写与失败调试效率?

Playwright 的 Trace Viewer、codegen、UI Mode 如何提升用例编写与失败调试效率?

  • Trace Viewer
  • codegen
  • UI Mode

Playwright 的三大工具提升编写与调试效率。Trace Viewer:录制用例的完整轨迹(页面快照、DOM、网络请求、控制台、时间轴、每一步操作),失败时打开可回放、逐步查看每步状态与网络,定位失败根因("在哪一步、什么状态、什么请求"),极大提升失败调试效率,无需复现。codegen(代码生成):通过浏览器手动操作,自动生成 Playwright 代码(npx playwright codegen),记录点击/输入/断言,生成可运行脚本,大幅提升用例编写效率,尤其适合快速搭建初始用例。UI Mode:交互式测试运行器(npx playwright test --ui),可视化查看用例执行、逐步运行、调试、查看 trace、热重载,支持边改边跑、定位选择器,提升调试与迭代效率。三者结合:codegen 快速生成、UI Mode 交互调试、Trace Viewer 失败复盘,形成"编写→调试→诊断"的完整高效闭环。

三者的价值是把"盲写、盲调、盲修"变为"可视化、可回放、可交互"。codegen 提速编写、UI Mode 提速调试、Trace Viewer 提速诊断,共同降低 Playwright 用例的维护成本。

#
★★★

4. Playwright 的 fixture 机制,page/context/browser 的生命周期与作用域(test/worker)如何设计

Playwright 的 fixture 机制如何?page/context/browser 的生命周期与作用域(test/worker)如何设计?

  • fixture 机制
  • 生命周期与作用域
  • 设计原则

Playwright 的 fixture 是"可按需注入、自动清理的依赖",通过 test.extend 定义,支持依赖注入与自动 teardown。核心 fixture 的作用域:browser(Worker 作用域)——每个 worker 一个浏览器实例,跨同 worker 的测试共享,资源开销大;context(Test 作用域)——每个测试一个 BrowserContext,隔离状态(cookie、缓存、localStorage),是"用例隔离"的关键;page(Test 作用域)——每个测试一个 page,基于 context 创建,是默认操作对象。设计要点:作用域决定"共享 vs 隔离"——browser/context 跨测试共享(但 context 隔离状态、browser 共享引擎),page 每测试新建;用 fixture 的"范围"(test/worker)控制生命周期;自定义 fixture 可带 { page } 依赖注入,自动 setup/teardown(如登录 fixture 创建已登录 context)。设计原则:默认用 page/context(每测试隔离),用 worker 级 fixture 共享昂贵资源(浏览器、连接池),用 fixture 封装"准备/清理"让用例自包含,避免手动管理生命周期。

fixture 的作用域是"共享与隔离"的平衡。browser 共享引擎、context 隔离状态、page 每测试新建;理解生命周期并封装 setup/teardown,让用例自包含且高效。

#
★★

5. Playwright 的网络拦截(route/mock)如何实现接口打桩与弱网模拟?

Playwright 的网络拦截如何实现?route/mock 如何实现接口打桩与弱网模拟?

  • route 拦截
  • 接口打桩
  • 弱网模拟

Playwright 用 page.route() 拦截网络请求,实现接口打桩与弱网模拟。接口打桩:page.route('**/api/**', route => route.fulfill({ status: 200, body: '{...}' })) 拦截请求并返回伪造响应(mock),无需真实后端;也可用 route.continue() 放行、route.abort() 阻断;page.route 支持 URL 匹配、正则、回调,可对响应做修改(route.fulfill 替代、route.fetch 后修改)。弱网模拟:用 CDP 的 context.routepage.route 配合延迟/限速——Playwright 可 page.route 拦截请求做 setTimeout 延迟模拟慢响应,或用 context.setOffline(true) 模拟断网;更精确的带宽/延迟可用 CDP Network.emulateNetworkConditions(Playwright 的 context.newCDPSession)。典型应用:前端独立开发/测试时用 route 打桩稳定接口,测试慢接口/弱网下表现用 route 延迟或 CDP 限速。设计上把常用打桩封装为 fixture,按 URL 分组管理。

route 是 Playwright 网络控制的入口。route.fulfill 打桩、route.continue/abort 放行/阻断、延迟/CDP 模拟弱网,让前端测试不依赖真实后端且可覆盖网络异常。

#
★★

6. Playwright 的 BrowserContext 如何实现用例级隔离与高并行执行?

Playwright 的 BrowserContext 如何实现用例级隔离与高并行执行?

  • BrowserContext 隔离
  • 高并行
  • 用 storageState 复用登录态实现上下文共享

BrowserContext 是 Playwright 的"隔离容器",每个 context 是独立的浏览器环境,拥有独立的 cookie、localStorage、sessionStorage、缓存、服务 worker 与权限,互不干扰。用例级隔离:每个测试默认创建独立 context(每个测试一个 page/context),测试间的状态(登录态、缓存、数据)完全隔离,一个用例失败/污染不影响其他用例,保证结果确定性。高并行:Playwright 默认每个 worker 一个浏览器进程,worker 内可并发多个 context(test.describe.configure({ mode: 'parallel' })),context 轻量、可并行创建,多个 context 在同 worker 内并行跑独立用例,最大化利用 CPU;配合多个 worker(workers 配置)跨进程并行,实现高吞吐。设计要点:用独立 context 保证隔离(避免共享状态),用 context 复用 storageState 共享登录态(创建多个带登录态的 context),用 worker 并行 + context 并行提升并发;context 是"隔离 + 并行"的统一基础。全局状态(如数据库)仍需用例级治理,context 解决浏览器侧隔离。

BrowserContext 是"隔离与并行"的统一载体。独立 context 隔离浏览器状态,轻量 context 支撑高并发并行,配合 storageState 复用登录态,实现既隔离又高速的并行执行。

#
★★

7. 自动化用例 flaky(不稳定)治理体系,自动重试、失败隔离、根因分类与趋势看板如何搭建?

自动化用例 flaky 治理体系如何搭建?自动重试、失败隔离、根因分类与趋势看板如何设计?

  • flaky 治理体系
  • 重试/隔离/分类/看板
  • 失败隔离与重试兜底的配合关系

自动化 flaky 治理需体系化,而非单纯重试。自动重试:对"可重试失败"(环境、超时、时序)自动重试(Playwright retries/test.describe.configure({ retries })),重试通过标记 flaky,防止偶发失败误报;但重试是兜底,不是根治。失败隔离:用例隔离(独立 context/数据)避免"一个失败污染其他";失败用例独立重跑互不影响;用"重试后仍失败"区分真缺陷 vs flaky。根因分类:把失败按根因分类(环境/网络、时序/等待、数据冲突、选择器漂移、代码缺陷、第三方依赖),用 trace/证据定位,分类统计找出高频 flaky 根因。趋势看板:用报告系统(Playwright HTML/Allure/ReportPortal)聚合 flaky 率、失败分类、按用例/模块/时间统计,展示趋势(flaky 率随时间变化、Top flaky 用例、按 root cause 分布),驱动治理优先级。搭建闭环:自动重试兜底 → 失败隔离保确定 → 根因分类减盲区 → 趋势看板驱动修复,形成"检测→定位→修复→防复发"的治理体系。

flaky 治理不能只靠重试。重试兜底、隔离保确定性、分类定位根因、看板驱动优先修复,四环闭环才能从根本上降低 flaky 并防复发。

#
★★

8. Playwright 的自动等待与 Web-first 断言?

Playwright 的自动等待与 Web-first 断言是什么?

  • 自动等待
  • Web-first 断言
  • 消除时序竞态(动作就绪与状态就绪)的机制

Playwright 的自动等待(auto-wait)与 Web-first 断言是其降 flaky 的两大核心。自动等待:每个动作前自动等待元素满足"可操作"条件——可见、稳定(不变化)、可交互、可接收事件、可定位,引擎自动重试与重解析,无需手动 waitFor;与 Selenium 需手动显式等待不同,Playwright 把等待内置。Web-first 断言:Playwright 的断言(expect(locator).toBeVisible()toBeEnabled()toHaveText()toHaveValue()toHaveURL() 等)是"面向 Web 状态"的自动重试断言——断言失败时自动重试直到超时,而非立即失败;它等待的是"用户可见的 Web 状态"(元素可见、文本出现、URL 变化),而非 Selenium 的被动 .until。两者结合:动作自动等待可操作、断言自动等待 Web 状态,消除了"手动等待遗漏"与"断言时机竞态"两类主要 flaky 来源。设计上,用 toBeVisible/toHaveText 等 Web-first 断言替代冗长的 waitFor + 检查,代码更简洁、更稳。

自动等待解决"动作前就绪",Web-first 断言解决"断言时状态就绪"。两者都内置"条件驱动 + 自动重试",把时序竞态从用例中消除,是 Playwright 稳定性的根基。

#
★★

9. Playwright 的并行执行模型,worker 数、进程隔离、全局状态与串行依赖用例如何处理

Playwright 的并行执行模型如何?worker 数、进程隔离、全局状态与串行依赖用例如何处理?

  • 并行执行模型
  • worker 数
  • 全局状态与串行依赖

Playwright 的并行执行模型基于 worker:每个 worker 是独立进程(独立浏览器实例),默认按 core 数并行。worker 数:workers 配置控制并发 worker 数(--workers=4),worker 数决定并发进程数;同 worker 内还可配置 mode 并行(test.describe.configure({ mode: 'parallel' }))让多个测试并发。进程隔离:每个 worker 独立进程、独立浏览器,状态/内存隔离,worker 间互不干扰,保证并行确定性;file 默认模式(同文件测试串行)与 parallel 模式(同文件并发)可选。全局状态:worker 数恒定(fullyParallel 时 worker 内可能并行),测试间共享的全局状态(环境变量、DB、文件)需用例级治理;worker 级 fixture(如共享连接池)在 worker 内共享。串行依赖用例:用 test.describe.serial() 在同一文件内串行执行依赖用例(如"先创建后查询"),避免并行导致的顺序错乱;或把依赖用例合并成单个用例。设计要点:worker 数匹配 CPU/资源,用 serial 处理依赖,用独立 context/数据隔离全局状态,避免跨 worker 共享可变状态。

并行模型的核心是"进程隔离 + 可控并发"。worker 是隔离进程,worker 数控制并发,serial 处理串行依赖,全局状态需用例级隔离,才能安全并行。

#
★★

10. Playwright 的视觉断言 toHaveScreenshot,截图基线管理、像素容差与跨平台差异处理

Playwright 的视觉断言 toHaveScreenshot 如何?截图基线管理、像素容差与跨平台差异如何处理?

  • toHaveScreenshot
  • 基线管理
  • 跨平台差异

Playwright 的 toHaveScreenshot() 是视觉断言,比较页面截图与基线图片。截图基线管理:第一次运行生成基线图(--update-snapshots),保存到 __screenshots__ 目录,之后比较;基线需版本化管理(纳入版本控制),变更时更新基线(--update-snapshots),通过 snapshotName 命名隔离。像素容差:maxDiffPixelRatio(像素差异比例)与 maxDiffPixels(像素差异数)控制容差,避免微小差异(抗锯齿、字体渲染)导致误报;threshold 控制每像素 RGB 容差。跨平台差异:不同平台/浏览器渲染差异(字体、抗锯齿、渲染引擎)导致截图不同,需用 expect.poll 或参数化平台(toHaveScreenshot({ maxDiffPixelRatio }) 按平台调容差),或用 testInfo.project.name 区分平台基线;Playwright 支持 toHaveScreenshotanimations: 'disabled' 关闭动画、mask 遮罩易变区域,减少不稳定。综合:基线版本管理 + 合理容差 + 关闭动画/遮罩易变区 + 按平台调整,让视觉断言稳定可用。

视觉断言的难点是"基线漂移与渲染差异"。基线版本化、容差参数、关闭动画与遮罩易变区、按平台调整,是控制误报同时保持视觉验证有效性的关键。

#
★★

11. Playwright 的 storageState 与登录态复用,如何把登录过程前置并跨用例共享,同时避免状态污染?

Playwright 的 storageState 与登录态复用如何实现?如何把登录过程前置并跨用例共享,同时避免状态污染?

  • storageState
  • 登录前置与共享
  • 避免污染

Playwright 的 storageState 把登录后的浏览器状态(cookie、localStorage、sessionStorage)序列化为 JSON,供后续用例复用。实现:先用一次登录生成 storageState(playwright codegen --save-storage=state.json 或 fixture 中登录后 context.storageState()),保存登录态;测试中 browser.newContext({ storageState }) 直接用已登录状态创建 context,跳过登录流程。前置登录:把登录做成全局 fixture(worker 级),一次登录生成 storageState,供所有用例复用,避免每个用例都走登录(慢且不稳)。跨用例共享:同一 storageState 下多个用例共享登录态,快速进入业务场景。避免状态污染:storageState 是"快照",但不同用例可能修改状态(改数据、登出);用"每用例独立 context + 从同一 storageState 快照创建"(context 互相隔离,从同一快照独立复制),避免一个用例修改污染其他;对会被修改的登录态,用"每次新建 context + 重新加载 storageState"或"不共享可变状态"。设计上:只共享"登录态"这类稳定状态,可变状态用独立 context 隔离。

storageState 把"登录前置"与"用例隔离"统一。用快照复用登录态省时,但需从同一快照为每个用例创建独立 context,避免共享 mutable 状态导致的污染。

#

12. Cypress 的同源限制与运行模型 trade-off,什么场景下不适合选择 Cypress?

Cypress 的同源限制与运行模型 trade-off 是什么?什么场景下不适合选择 Cypress?

  • Cypress 同源限制
  • 运行模型 trade-off
  • 不适合场景

Cypress 在浏览器内运行测试(进程内注入),带来了同源限制与其他 trade-off。同源限制:Cypress 默认只能访问同一 origin 的页面,跨域/多源场景(如不同域名的登录跳转、跨域 iframe、第三方域名)受限,需特殊处理(cy.origin 或配置)。运行模型 trade-off:好处是同步、易调试、内置等待与拦截、开发者体验好;代价是受同源限制、无法真正跨浏览器多标签、局限于 Chromium 系(及 Electron)、无法像 WebDriver 那样真正驱动 Safari/Firefox、多标签页/跨域支持弱。不适合选择 Cypress 的场景:需要真正的跨浏览器矩阵测试(Safari/Firefox);需要多域/跨域/多标签页交互;需要访问浏览器原生能力(如弹窗、下载、多窗口)受限场景;需要大规模并行/多浏览器集群(能力弱于 Playwright);需要与 WebDriver 生态兼容的既有体系。适合场景:纯前端应用、同源为主、快速上手、需要内置拦截与同步调试的团队。

Cypress 的 trade-off 源自"进程内注入"的运行模型。同源限制与浏览器局限是其主要代价,选型时需判断场景是否依赖跨域/跨浏览器/原生能力,若是则不适合 Cypress。

#

13. Playwright 的移动端模拟?

Playwright 的移动端模拟如何实现?

  • 移动端模拟
  • 设备模拟能力
  • 模拟浏览器环境与真机系统能力的局限

Playwright 通过 devices 配置模拟移动端设备。实现:browser.newContext({ ...devices['iPhone 13'] })devices['Pixel 5'],自动应用设备的视口尺寸、用户代理(UA)、设备像素比(DPR)、触摸(touch)、是否移动(isMobile)及 hasTouch 等属性,模拟移动端浏览器环境。模拟能力:viewport(视口尺寸)、userAgent(UA)、deviceScaleFactor(DPR)、isMobile、hasTouch、defaultBrowserType;也可手动指定这些参数自定义设备。用途:移动端 Web 测试(响应式布局、触摸交互、移动端 UA 行为)、无需真机/模拟器即可覆盖移动端;配合 toHaveViewportSize 断言响应式。局限:模拟的是"浏览器环境"(UA/视口/触摸),非真机系统能力(如原生 App、推送、传感器、性能),真机专属行为(如原生交互)仍需真机/云真机。设计上:用设备预设快速模拟主流机型,按需自定义参数,作为移动端回归的快速补充。

Playwright 移动端模拟是"浏览器层模拟"(UA/视口/触摸/DPR),快速覆盖移动端 Web。它模拟的是环境而非真机系统能力,需配合真机验证原生专属行为。

#

14. Playwright 的 CI 与分片?

Playwright 的 CI 与分片如何实现?

  • CI 集成
  • 分片
  • Docker 固化浏览器环境与报告/诊断上传

Playwright 在 CI 中运行需配置执行与分片。CI 集成:npx playwright test 在 CI 运行,需安装浏览器(npx playwright install --with-deps),用 Docker 镜像(mcr.microsoft.com/playwright)提供开箱即用的浏览器环境,配置 HTML 报告(--reporter=html)并上传 artifact;设置 retries 处理 flaky,workers 控制并发。分片:--shard=1/4 等把测试按比例分片到多个 runner(--shard=1/4--shard=2/4...),每个 CI job 跑一个分片,多 job 并行,缩短总时长;通常配合 --fully-parallel 与 worker 数。CI 配置(GitHub Actions matrix/job 并行)指定分片与并发。报告与 trace:失败时自动生成 trace(trace: 'on-first-retry')与 HTML 报告,上传 artifact 供查看;PLAYWRIGHT_HTML_OPEN 控制报告展示。设计要点:CI 中用 Docker 保证浏览器环境、分片并行加速、retries 兜底 flaky、上传报告与 trace 供诊断。

Playwright CI 的关键是"环境 + 并行 + 诊断"。Docker 固化浏览器环境、--shard 分片并行、retries 兜底、HTML 报告与 trace 上传,让 CI 快速且可诊断。

#

15. Playwright 的组件测试与单元测试结合?

Playwright 的组件测试与单元测试如何结合?

  • 组件测试
  • 与单元测试结合
  • 单测/组件/E2E 三层互补的关系

Playwright 支持组件测试(Component Testing),在真实浏览器中验证组件(而非仅测逻辑)。组件测试:用 @playwright/experimental-ct-* 在真实浏览器中挂载组件(React/Vue 等),测试组件渲染、交互、事件、样式,比纯单元测试更接近真实运行(含真实浏览器渲染、事件、样式),比 E2E 更快更聚焦。与单元测试结合:分层互补——单元测试(Vitest/Jest)测纯逻辑(函数、状态、计算),快而细;组件测试测"组件在浏览器中的渲染与交互"(真实 DOM、事件、样式),中等速度;E2E 测完整用户流程。设计:单测覆盖逻辑边界、组件测试覆盖组件行为、E2E 覆盖端到端流程;组件测试可复用组件测试库(@testing-library)的测试数据,但运行在真实浏览器;用同一套测试文件组织,按"单元/组件/E2E"分层。结合价值:组件测试弥补"单测不测渲染、E2E 太慢"的中间层,用浏览器真实环境验证组件,提升覆盖与可信度。

组件测试填在"单测与 E2E 之间"的空档。单测测逻辑、组件测试测真实渲染与交互、E2E 测完整流程,三层结合让覆盖更立体、反馈更分层。

#

16. Playwright 的网络断言与性能采集,expect(response) 如何校验请求结果,并采集资源耗时辅助性能分析?

Playwright 的网络断言与性能采集如何实现?expect(response) 如何校验请求结果,并采集资源耗时辅助性能分析?

  • 网络断言
  • expect(response)
  • 性能采集

Playwright 支持对网络请求/响应做断言与性能采集。网络断言:用 page.waitForResponse() 等待特定响应,const resp = await page.waitForResponse(url => url.url().includes('/api/order')),然后 expect(resp.status()).toBe(200) 校验状态码、expect(resp.ok()).toBeTruthy()、解析 resp.json() 校验响应体;也可用 page.waitForRequest 校验请求发给谁。性能采集:用 response.time() 获取响应耗时(await resp.time()),或拦截 requestfinished/response 事件聚合资源耗时(各资源加载时间、总耗时);用 performance API 或 CDP 采集 LCP/CLS 等指标;把关键接口耗时纳入断言(如阈值断言"下单接口 < 2s")辅助性能分析。设计:用 expect 对网络响应做 Web-first 断言(自动等待、失败重试),用 resp.time()/事件采集资源耗时,把"接口正确性"与"接口性能"纳入测试,形成功能+性能的一体化验证。

Playwright 把网络作为一等公民。waitForResponse + expect 校验响应正确性,resp.time()/事件采集耗时进行性能分析,实现功能与性能的同步验证。

#

17. Playwright 在微前端/iframe 场景的测试,frameLocator 定位与跨应用状态同步的验证要点?

Playwright 在微前端/iframe 场景的测试如何做?frameLocator 定位与跨应用状态同步的验证要点是什么?

  • 微前端测试
  • frameLocator 定位
  • 跨应用状态同步

微前端(Micro-frontend)常以 iframe 或 Web Component 嵌入多个子应用,Playwright 用 frameLocator 定位。frameLocator 定位:page.frameLocator('iframe[data-app="order"]') 定位特定 iframe 内的元素(frameLocator.locator('button')),自动处理 iframe 上下文,无需显式切换;支持嵌套 iframe 与多 iframe 的定位。跨应用状态同步验证:微前端各子应用可能共享状态(登录态、全局数据、事件总线),验证要点——跨 iframe 状态同步(在 A 应用操作后,验证 B 应用是否同步更新,用 frameLocator 分别定位后断言);事件/消息传递(子应用间通过事件/自定义事件通信,验证事件触发与接收);登录态/全局状态共享(验证登录态在子应用间传递);URL 状态同步(路由状态跨应用保持)。设计要点:用稳定的 data-testid 与 iframe 标识(data-app)定位,封装 frameLocator 为公共方法;对跨应用同步,用"在 A 操作 → 断言 B 状态"的流程验证;注意各 iframe 独立加载时机(等待子应用就绪)。

微前端测试的关键是"跨 iframe/应用的定位与状态验证"。frameLocator 精确进入各 iframe,跨应用同步验证"操作 A → 断言 B",是微前端 E2E 的要点。