Фиксация и обновление версий браузерной автоматизации
Планируйте обновления браузера и driver с фиксацией версий, доказательствами совместимости и rollback.
Нужна структурированная документация по теме Начало работы?
Эта статья относится к редакционной библиотеке. Для пошаговой настройки, справки и постоянных обновлений переходите сразу в соответствующий раздел docs.
Повторяемый тест рассматривает браузер, driver, framework, профиль и приложение как единый набор. Плавающая метка не доказывает использованный бинарный файл. Фиксируйте входы, записывайте разрешённые версии и сравнивайте обновление с готовым rollback. Общая проверка browser release шире; интеграция профиля Selenium описывает владение профилем; здесь описана ответственность за обновление.
Контракт release
Назовите маршрут, синтетический аккаунт, видимый результат, поддерживаемые системы и необходимые возможности. Запишите семейства браузера и driver, правила patch и доказательства продвижения. Добавьте версии приложения и framework.
Используйте digest, lockfile или идентификатор артефакта. Разрешайте ссылку в начале job. Повтор сохраняет набор или становится новой попыткой кандидата.
Матрица версий
| Вход | Запись | Владелец | Доказательство | Rollback |
|---|---|---|---|---|
| Бинарный файл | артефакт/версия | платформа | чистый путь | восстановить |
| Driver | совместимое семейство | автоматизация | переговоры | восстановить |
| Framework | lockfile/runtime | тесты | fixture/проверка | старый lockfile |
| Состояние | схема/baseline | сценарий | загрузка/срок | старый baseline |
| Приложение | build id | приложение | видимый итог | известный deploy |
Smoke test подтверждает только свой путь, а не все origins, расширения и режимы.
Фиксация и кандидат
Браузер без фиксации driver может изменить протокол. Другая ОС меняет сертификаты, шрифты и разрешения. Записывайте существенные входы и разделяйте неизменяемые артефакты и синтетические данные.
Запускайте baseline и candidate с одним входом, меняя одну версию. Сравнивайте видимый статус, навигацию, разрешения и очистку. Документированный вариант может быть допустим, отсутствие обязательной возможности блокирует.
Обновление кандидата
Проводите кандидата в отдельной lane с тем же синтетическим сценарием, образом ОС и политикой proxy. До запуска записывайте ссылку и разрешённую идентичность версии.
Таблица решения
| Наблюдение | Категория | Решение | Следующий шаг |
|---|---|---|---|
| Контракт совпал | совместимо | продвигать после review | сохранить чеки |
| Есть альтернатива | поддерживаемая вариация | продвигать при согласии | проверить доступность |
| Driver не договорился | несовместимый набор | блокировать | выровнять или восстановить |
| Путь прошёл, очистка нет | инфраструктура | удержать | сохранить ошибки |
| Timeout после мутации | неопределённо | не повторять вслепую | запросить статус |
Сбойная 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('закрытие контекста', 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. Мутация после timeout требует статуса сервиса.
Частота обновлений
Патч безопасности можно проверять быстрее major-изменения, но обе категории записывают версию и запускают fixture. Фиксируйте граф зависимостей и рассматривайте его обновления отдельно.
Rollback и политика
Rollback восстанавливает бинарный файл, driver, framework, схему и build. Репетируйте его в отдельной lane с синтетическим baseline. Без старого бинарника откат не готов.
Patch может проверяться быстрее major-изменения, но обе категории записывают версию и запускают fixture. Фиксируйте граф зависимостей и рассматривайте его обновления отдельно.
Доказательства и границы
Квитанция содержит версии, образ ОС, сценарий, видимый результат, вариант и очистку. Не добавляйте cookies или личный текст. Runner наблюдает клиентскую границу и не доказывает хранение на сервере.
Возможность и ограничение BotBrowser
BotBrowser предоставляет контролируемую конфигурацию и изолированные BrowserContexts для разрешённого сравнения release; см. документацию изоляции аккаунтов. Он не выбирает driver, не фиксирует зависимости, не сертифицирует build и не обещает межсистемную идентичность.
BotBrowser поддерживает фиксированные входы браузера для контролируемого сравнения, но не гарантирует совместимость driver, приложения или систем.
Для зафиксированного release BotBrowser может удерживать конфигурацию браузера при сравнении, но не решает совместимость driver или build.
Сохраняйте baseline receipt с артефактом, driver, lockfile, образом и build.
Patch может менять протокол, сертификаты, отображение или политики даже при малом номере.
Классифицируйте сбой по границе: запуск, разрешения, видимый результат или инфраструктура.
Записывайте решение: продвигать, удержать, rollback или исследовать.
Репетируйте rollback с проверкой артефакта, driver, схемы и синтетического пути.
Не увеличивайте ожидания, чтобы скрыть drift release.
Сохраняйте маршрут, синтетические данные, proxy и срок хранения постоянными.
Исключение платформы должно иметь lane, владельца и срок.
Записывайте зависимости, которые runner не может зафиксировать.
Храните только метаданные и разрешённые синтетические артефакты в окно сравнения.
Храните разрешённые идентификаторы для воспроизведения worker.
Меняйте только один вход release в каждом сравнении.
Разделяйте артефакты кандидата и baseline.
Отсутствующую возможность фиксируйте даже при зелёной проверке.
После timeout с возможной мутацией запрашивайте статус сервиса.
Закрытие контекста не доказывает удаление на сервере.
Назначайте срок каждому исключению платформы.
После восстановления повторяйте чистый путь.
Храните разрешённые идентификаторы для воспроизведения worker.
Меняйте только один вход release в каждом сравнении.
Разделяйте артефакты кандидата и baseline.
Отсутствующую возможность фиксируйте даже при зелёной проверке.
После timeout запрашивайте статус сервиса.
Закрытие контекста не доказывает удаление на сервере.
Назначайте срок каждому исключению платформы.
После восстановления повторяйте чистый путь.
Проверяйте квитанцию с владельцем пути.
Сохраняйте baseline неизменным в окно сравнения.
Источники
Похожие статьи
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.