TToolBox
💻
💻 dev
8 мая 2026 г.6 мин чтения

Как синхронизировать 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 — работает онлайн, без регистрации.
Поделиться:

Теги

#playwright#indexeddb#javascript#testing#debugging