Puppeteer позволяет автоматизировать браузерные операции, включая взаимодействие с локальными хранилищами данных, такими как IndexedDB. Этот интерфейс базы данных является частью HTML5 и предоставляет возможности для хранения значительных объёмов структурированных данных прямо в браузере. В тестировании веб-приложений работа с IndexedDB может быть важной для симуляции работы с данными, тестирования функциональности и проверки корректности работы хранилища.
IndexedDB представляет собой асинхронный API для хранения значений в браузере в виде объектов. В отличие от localStorage или sessionStorage, IndexedDB позволяет хранить более сложные данные и выполнять операции индексации. Для работы с этим хранилищем используются объекты базы данных, хранилища объектов и индексы, что даёт возможность эффективно манипулировать данными.
В контексте тестирования с Puppeteer доступ к IndexedDB позволяет:
Для взаимодействия с 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, который затем выводится в консоль.
С помощью Puppeteer можно выполнять различные операции с IndexedDB, такие как:
Чтение данных из базы данных: Чтение данных из
IndexedDB происходит через транзакции, которые обеспечивают атомарность
операций. Для извлечения данных используется метод get()
или getAll() объекта ObjectStore.
Добавление данных в базу данных: Добавление данных в
IndexedDB выполняется с использованием метода put() или
add(), которые позволяют вставить данные в объектное
хранилище.
Удаление данных из базы данных: Для удаления данных из
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. Для этого можно использовать
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 в контексте страницы, что открывает возможности для создания сложных тестов.