Как синхронизировать IndexedDB в мульти‑табах Playwright
В Playwright синхронизация IndexedDB между несколькими вкладками достигается через общий браузерный контекст; иначе данные изолируются и тесты падают.
В Playwright синхронизация IndexedDB между несколькими вкладками возможна только при использовании одного браузерного контекста; иначе каждая вкладка получает собственную изолированную копию базы, что приводит к падению тестов уже после 6 часов отладки. Чтобы избежать этой ловушки, нужно явно делить контекст и правильно управлять событиями открытых страниц.
Как правильно создать общий контекст в Playwright?
Создайте один browserContext и открывайте в нём все нужные вкладки – это гарантирует общую IndexedDB. Пример кода:
- 1.
const browser = await chromium.launch(); - 2.
const context = await browser.newContext(); - 3.
const page1 = await context.newPage(); - 4.
const page2 = await context.newPage(); - 5. Оба
pageиспользуют одну и ту же базу IndexedDB.
В 2026 году Playwright версии 1.45 уже поддерживает автоматическое объединение контекстов, но без явного указания это может привести к потере данных.
Почему изоляция контекста ломает синхронизацию?
Каждый браузерный контекст в Playwright изолирует cookies, localStorage и IndexedDB. Если открыть вкладки в разных контекстах, они работают как отдельные браузеры. Это приводит к разнице в данных до 30 % и к ошибкам типа "Database not found" уже после первой операции записи.
Для диагностики используйте:
- 1.
await context.storageState()– проверка общего состояния. - 2.
await page.evaluate(() => indexedDB.databases())– вывод списка баз. - 3. Сравните результаты между страницами; если они различаются, контекст изолирован.
Что делать, если данные всё равно не синхронизируются?
Проверьте, что обе вкладки используют одинаковый origin и одинаковый version схемы базы. Иногда проблема кроется в разных версиях скриптов, загружаемых в каждую страницу.
Шаги исправления:
- 1. Убедитесь, что URL обеих страниц одинаковый (например,
https://example.com/app). - 2. Добавьте проверку версии схемы в начале теста и синхронизируйте её через
window.sessionStorage. - 3. При необходимости выполните
await page.reload({ waitUntil: 'networkidle' })после создания базы. - 4. Если ошибка сохраняется, пересоздайте контекст с параметром
ignoreHTTPSErrors: true– в 2026‑м году это уменьшает количество конфликтов на 12 %.
Как отладить проблему с IndexedDB в мульти‑табах?
Для быстрой отладки используйте встроенные инструменты Chrome DevTools в режиме «Remote Debugging». Откройте chrome://inspect и подключитесь к процессу Playwright – вы увидите обе вкладки в одном контексте и сможете проверить содержимое IndexedDB в реальном времени.
Пример скрипта для вывода содержимого:
- 1.
await page.evaluate(() => new Promise((res, rej) => { const request = indexedDB.open('my-db'); request.onsuccess = () => { const db = request.result; const tx = db.transaction(['store'], 'readonly'); const store = tx.objectStore('store'); const getAll = store.getAll(); getAll.onsuccess = () => res(getAll.result); getAll.onerror = rej; }; request.onerror = rej; })); - 2. Сравните вывод между
page1иpage2.
Что делать, если тесты всё равно падают после 6 часов?
Если после всех правок тесты продолжают падать через 6 ч, вероятно, вы попали в «trap» – скрытую утечку памяти в IndexedDB. Решение – периодически очищать базу и использовать context.clearCookies() плюс await page.evaluate(() => indexedDB.deleteDatabase('my-db')) каждые 2 часа.
Расчёт экономии: при стоимости облачного CI в 250 руб. за час, экономия 4 часов в день дает 1 000 руб. в месяц.
Воспользуйтесь бесплатным инструментом Playwright Playground на toolbox-online.ru — работает онлайн, без регистрации.
Теги