浏览器自动化版本固定与更新
用明确的版本固定、兼容性证据和回滚条件规划浏览器与 driver 更新。
可重复的自动化把浏览器、driver、framework、profile 和应用视为一个经过验证的发布集合。可变标签不能证明 worker 使用了哪个二进制文件。固定输入,记录运行时解析版本,把更新作为有回滚路径的比较。更广泛的浏览器 release 验证指南不属于本文的版本所有权范围;Selenium profile 集成指南说明 profile 所有权。
Release 契约
写明路由、合成账号、可见结果、支持系统和实际需要的能力。记录浏览器与 driver 家族、补丁评估方法和晋级证据,也记录应用和 framework 版本。
使用 digest、lockfile 或工件标识,并在 job 开始时解析一次。重试使用同一集合,或明确成为新的候选尝试。
版本与所有权矩阵
| 输入 | 记录 | 所有者 | 证据 | 回滚 |
|---|---|---|---|---|
| 浏览器二进制 | 工件和版本 | 浏览器平台 | 干净流程 | 恢复旧工件 |
| driver | 兼容家族 | 自动化平台 | 会话协商 | 恢复旧 driver |
| framework | lockfile/runtime | 测试团队 | fixture/断言 | 恢复 lockfile |
| 状态 | schema/baseline | 场景 | 加载/过期 | 旧 baseline |
| 应用 | build 标识 | 应用团队 | 可见结果 | 已知 build |
smoke test 只证明声明的流程,不证明所有 origin、扩展或设备模式。
固定集合并比较候选
只固定浏览器而不固定 driver 仍可能改变协议。操作系统变化会影响证书、字体和权限。记录所有实际输入,把不可变工件和合成数据分开。
在候选 lane 中运行 baseline 与候选版本,每次只改变一个版本。比较可见状态、导航、权限和清理。文档化 fallback 可以是支持的变化,缺少必需能力则阻止晋级。
候选更新与兼容性
在候选 lane 中使用相同的合成流程、系统镜像和代理策略运行候选版本。启动前记录请求引用和实际解析版本。
更新决策表
| 观察 | 分类 | 决定 | 后续 |
|---|---|---|---|
| 契约相同 | 兼容 | 审查后晋级 | 保留回执 |
| 有文档化 fallback | 支持的变化 | 可接受时晋级 | 检查无障碍 |
| driver 无法协商 | 集合不兼容 | 阻止 | 对齐或恢复 |
| 流程通过但清理失败 | 基础设施 | 暂停 | 保留错误 |
| 远端变更后超时 | 结果不确定 | 不盲目重试 | 查询状态 |
失败 fixture
import os from 'node:os';
import path from 'node:path';
import { mkdtemp, rm } from 'node:fs/promises';
import { chromium } from 'playwright';
import { expect } from '@playwright/test';
const dir = await mkdtemp(path.join(os.tmpdir(), 'release-pin-'));
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ baseURL: 'http://release.test' });
const page = await context.newPage();
await page.route('/fixtures/missing-readiness', route =>
route.fulfill({ status: 200, contentType: 'text/html', body: '<main><p>候选外壳</p></main>' })
);
let failure;
const remember = (label, error) => {
const current = new Error(`${label}: ${error.message}`, { cause: error });
failure = failure ? new AggregateError([failure, current], `${failure.message}; ${label} failed`) : current;
};
try {
await page.goto('/fixtures/missing-readiness');
await expect(page.getByRole('status')).toHaveText('Ready', { timeout: 250 });
} catch (error) {
remember('就绪断言', error);
} finally {
try {
await context.close();
} catch (error) {
remember('关闭 context', error);
}
try {
await rm(dir, { recursive: true, force: true });
} catch (error) {
remember('清理工件', error);
}
try {
await browser.close();
} catch (error) {
remember('关闭浏览器', error);
}
}
if (failure) throw failure;
预期结果指出缺少的就绪信号,不访问无关 origin。远端变更超时应查询服务状态。
更新节奏
安全补丁可以比 major 变更使用更短审查,但两者都记录解析版本并运行失败 fixture。锁定依赖图,单独审查包更新。
回滚与更新政策
回滚恢复完整集合:二进制、driver、framework、schema 和 build。用合成 baseline 在独立 lane 演练。旧二进制不可用就不算可回滚。
安全补丁可以比 major 变更使用更短审查,但两者都记录解析版本并运行失败 fixture。锁定依赖图,单独审查可能改变观察行为的包更新。
证据与边界
回执包含版本、系统镜像、场景、可见结果、替代路径和清理状态。不包含 cookies、个人文字或完整响应。runner 只能观察客户端边界,不能证明服务端保留策略。
BotBrowser 能力与限制
BotBrowser 可为授权的 release 比较提供受控配置和独立 BrowserContexts;参见 多账号隔离文档。它不选择 driver、不固定依赖、不认证应用 build,也不保证跨系统一致。
BotBrowser 支持固定 release 的浏览器输入进行受控比较,但不保证 driver、应用或跨系统兼容性。
对于固定 release,BotBrowser 可以在比较时保持浏览器配置稳定,但不会判断 driver 或应用 build 是否兼容。
保持 baseline 回执不变,并一起记录工件、driver、lockfile、系统镜像和 build。
补丁可能改变协议、证书、渲染或策略,即使版本变化很小。
按边界分类失败:启动、权限、可见结果或基础设施。
明确记录晋级、暂停、回滚或调查决定。
回滚演练要验证工件、driver、schema 和合成流程。
不要增加等待时间来掩盖 release drift。
比较时保持路由、合成数据、代理策略和留存规则一致。
平台例外需要命名 lane、所有者和到期日期。
记录 runner 无法固定的依赖。
比较窗口只保留元数据和获准的合成工件。
保留解析后的标识以便重现确切 worker。
每次比较只改变一个 release 输入。
将候选工件与 baseline 工件分开保存。
即使断言为绿,也要记录缺失的必需能力。
远端变更可能已发生时,超时后查询服务状态。
关闭 context 不能证明服务端删除。
为平台例外设置到期日期。
恢复后再次运行干净流程。
保留解析后的标识以便重现确切 worker。
每次比较只改变一个 release 输入。
将候选工件与 baseline 工件分开保存。
即使断言为绿,也要记录缺失的必需能力。
远端变更可能已发生时,超时后查询服务状态。
关闭 context 不能证明服务端删除。
为平台例外设置到期日期。
恢复后再次运行干净流程。
由流程所有者复核回执。
比较窗口内保持 baseline 不变。