Работа с IndexedDB

Puppeteer позволяет автоматизировать браузерные операции, включая взаимодействие с локальными хранилищами данных, такими как IndexedDB. Этот интерфейс базы данных является частью HTML5 и предоставляет возможности для хранения значительных объёмов структурированных данных прямо в браузере. В тестировании веб-приложений работа с IndexedDB может быть важной для симуляции работы с данными, тестирования функциональности и проверки корректности работы хранилища.

Основы работы с IndexedDB

IndexedDB представляет собой асинхронный API для хранения значений в браузере в виде объектов. В отличие от localStorage или sessionStorage, IndexedDB позволяет хранить более сложные данные и выполнять операции индексации. Для работы с этим хранилищем используются объекты базы данных, хранилища объектов и индексы, что даёт возможность эффективно манипулировать данными.

В контексте тестирования с Puppeteer доступ к IndexedDB позволяет:

  • Проверять содержимое базы данных,
  • Тестировать сценарии, связанные с сохранением и извлечением данных,
  • Моделировать данные в базе данных для симуляции различных условий.

Доступ к IndexedDB через Puppeteer

Для взаимодействия с IndexedDB через Puppeteer необходимо использовать возможности браузера для выполнения JavaScript в контексте страницы. Puppeteer позволяет работать с браузером с помощью API page.evaluate(), который позволяет выполнять JavaScript код на странице и получать результат обратно в тест.

Пример базового доступа к IndexedDB через Puppeteer:

const puppeteer = require(&

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('https://your-site.com');

  // Выполнение скрипта для получения данных из IndexedDB
  const indexedDbData = await page.evaluate(() => {
    return new Promise((resolve, reject) => {
      const request = indexedDB.open('yourDatabase');
      request.onsucc ess = () => {
        const db = request.result;
        const transaction = db.transaction('yourObjectStore', 'readonly');
        const objectStore = transaction.objectStore('yourObjectStore');
        const getRequest = objectStore.getAll();  // Получить все данные

        getRequest.onsucc ess = () => resolve(getRequest.result);
        getRequest.oner ror = (e) => reject(e);
      };
      request.oner ror = (e) => reject(e);
    });
  });

  console.log(indexedDbData);

  await browser.close();
})();

В этом примере Puppeteer запускает браузер, переходит на веб-страницу и с помощью page.evaluate() выполняет JavaScript код, который извлекает все данные из хранилища IndexedDB. Функция resolve() в Promise возвращает результат работы с IndexedDB, который затем выводится в консоль.

Операции с IndexedDB

С помощью Puppeteer можно выполнять различные операции с IndexedDB, такие как:

  1. Чтение данных из базы данных: Чтение данных из IndexedDB происходит через транзакции, которые обеспечивают атомарность операций. Для извлечения данных используется метод get() или getAll() объекта ObjectStore.

  2. Добавление данных в базу данных: Добавление данных в IndexedDB выполняется с использованием метода put() или add(), которые позволяют вставить данные в объектное хранилище.

  3. Удаление данных из базы данных: Для удаления данных из IndexedDB используется метод delete(), который удаляет записи по ключу.

Пример добавления данных в IndexedDB через Puppeteer:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('https://your-site.com');

  // Добавление данных в IndexedDB
  await page.evaluate(() => {
    return new Promise((resolve, reject) => {
      const request = indexedDB.open('yourDatabase');
      request.onsucc ess = () => {
        const db = request.result;
        const transaction = db.transaction('yourObjectStore', 'readwrite');
        const objectStore = transaction.objectStore('yourObjectStore');
        const data = { id: 1, name: 'Test Data' }; // Пример данных

        const putRequest = objectStore.put(data);
        putRequest.onsucc ess = () => resolve('Data added successfully');
        putRequest.oner ror = (e) => reject(e);
      };
      request.oner ror = (e) => reject(e);
    });
  });

  await browser.close();
})();

Очистка базы данных

В некоторых случаях необходимо очистить IndexedDB перед или после выполнения теста, чтобы убедиться в чистоте данных или протестировать сценарии, связанные с пустыми хранилищами. Очистка хранилища осуществляется с помощью метода clear():

await page.evaluate(() => {
  return new Promise((resolve, reject) => {
    const request = indexedDB.open('yourDatabase');
    request.onsucc ess = () => {
      const db = request.result;
      const transaction = db.transaction('yourObjectStore', 'readwrite');
      const objectStore = transaction.objectStore('yourObjectStore');

      const clearRequest = objectStore.clear();  // Очистка хранилища
      clearRequest.onsucc ess = () => resolve('Object store cleared');
      clearRequest.oner ror = (e) => reject(e);
    };
    request.oner ror = (e) => reject(e);
  });
});

Этот подход полезен, когда нужно провести тестирование с чистыми данными или сбросить состояние хранилища после выполнения набора тестов.

Проверка данных в IndexedDB

В процессе тестирования может возникнуть необходимость проверять определённые данные в IndexedDB. Для этого можно использовать page.evaluate() для выполнения запросов к базе данных и получения значений, которые затем можно сравнивать с ожидаемыми результатами.

Пример проверки данных:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('https://your-site.com');

  // Проверка данных в IndexedDB
  const isDataPresent = await page.evaluate(() => {
    return new Promise((resolve, reject) => {
      const request = indexedDB.open('yourDatabase');
      request.onsucc ess = () => {
        const db = request.result;
        const transaction = db.transaction('yourObjectStore', 'readonly');
        const objectStore = transaction.objectStore('yourObjectStore');
        const getRequest = objectStore.get(1);  // Проверка записи с id = 1

        getRequest.onsucc ess = () => resolve(getRequest.result !== undefined);
        getRequest.oner ror = (e) => reject(e);
      };
      request.oner ror = (e) => reject(e);
    });
  });

  console.log('Data present:', isDataPresent);

  await browser.close();
})();

В этом примере осуществляется проверка наличия данных с определённым идентификатором в базе данных. Такой подход используется для тестирования корректности добавленных данных или их удаления.

Работа с версиями базы данных

При тестировании веб-приложений важно учитывать изменения в версиях базы данных. IndexedDB позволяет указать версию базы данных при её создании и миграции данных между версиями. В процессе работы с Puppeteer можно эмулировать изменения в структуре базы данных, чтобы тестировать обновления и миграции.

Пример миграции базы данных:

await page.evaluate(() => {
  return new Promise((resolve, reject) => {
    const request = indexedDB.open('yourDatabase', 2);  // Обновление версии базы данных
    request.onupgradenee ded = (e) => {
      const db = e.target.result;
      if (!db.objectStoreNames.contains('yourObjectStore')) {
        db.createObjectStore('yourObjectStore', { keyPath: 'id' });
      }
    };
    request.onsucc ess = () => resolve('Database migrated');
    request.oner ror = (e) => reject(e);
  });
});

В данном примере происходит обновление базы данных до версии 2 с добавлением нового хранилища объектов, если оно ещё не существует.

Заключение

Использование Puppeteer для тестирования работы с IndexedDB позволяет эффективно проверять функциональность хранения данных в браузере. Автоматизация этих процессов важна для интеграционного тестирования, где требуется симуляция взаимодействия с локальными хранилищами и манипуляции с большими объёмами данных. Puppeteer предоставляет удобный инструмент для работы с хранилищем IndexedDB через выполнение JavaScript в контексте страницы, что открывает возможности для создания сложных тестов.