Манипуляции с данными хранилища

В процессе тестирования веб-приложений важно учитывать работу с данными, которые хранятся в хранилищах браузера, таких как cookies, localStorage, sessionStorage и IndexedDB. Это позволяет проверить, как приложение взаимодействует с состоянием пользователя между сессиями, а также как различные данные влияют на поведение страницы. В Playwright доступна гибкость в манипулировании этими данными, что делает тестирование более точным и удобным.

Работа с cookies

Cookies часто используются для хранения информации о сессии, например, идентификатора пользователя или токенов аутентификации. В Playwright можно легко управлять cookies с помощью API, что полезно для тестирования различных сценариев, таких как проверка поведения пользователя после входа в систему.

Получение cookies

Для получения cookies на странице используется метод context.cookies(), который возвращает список всех cookies для текущего контекста:

const cookies = await context.cookies();
console.log(cookies);

Метод вернет массив объектов cookie, каждый из которых содержит информацию о имени, значении, пути, домене, флаге безопасности и других атрибутах.

Установка cookies

Для того чтобы установить cookie в контексте браузера, используется метод context.addCookies(). Этот метод принимает массив объектов cookie и устанавливает их для соответствующего контекста:

await context.addCookies([{
  name: 'userSession',
  value: 'abc123',
  domain: 'example.com',
  path: '/',
  httpOnly: true,
  secure: true
}]);

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

Удаление cookies

Чтобы удалить cookies, используйте метод context.clearCookies(), который удаляет все cookies для текущего контекста:

await context.clearCookies();

Если необходимо удалить конкретную cookie, нужно использовать context.deleteCookies() с указанием домена и пути:

await context.deleteCookies({ name: 'userSession', domain: 'example.com' });

Манипуляции с localStorage и sessionStorage

Местное хранилище браузера (localStorage и sessionStorage) используется для хранения данных, которые могут сохраняться между сессиями или только в пределах одной. В Playwright взаимодействие с этими хранилищами происходит через выполнение JavaScript в контексте страницы.

Получение данных из localStorage и sessionStorage

Чтобы получить данные из localStorage или sessionStorage, можно выполнить JavaScript в контексте страницы с помощью метода page.evaluate():

const localStorageData = await page.evaluate(() => localStorage.getItem('key'));
const sessionStorageData = await page.evaluate(() => sessionStorage.getItem('key'));
console.log(localStorageData, sessionStorageData);

Этот код позволяет извлечь значения по ключу из соответствующих хранилищ.

Установка данных в localStorage и sessionStorage

Для записи данных в хранилища также используется метод page.evaluate(). Важно помнить, что данные будут сохраняться только в пределах одной сессии браузера (для sessionStorage) или на протяжении нескольких сессий (для localStorage):

await page.evaluate(() => {
  localStorage.setItem('userToken', 'abc123');
  sessionStorage.setItem('sessionId', 'xyz789');
});

Удаление данных из localStorage и sessionStorage

Чтобы удалить данные из localStorage или sessionStorage, используйте методы removeItem() или clear():

await page.evaluate(() => {
  localStorage.removeItem('userToken');
  sessionStorage.clear();
});

Удаление данных из localStorage или sessionStorage полезно для подготовки среды тестирования, например, для очистки состояния между тестами.

Работа с IndexedDB

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

Получение данных из IndexedDB

Для взаимодействия с IndexedDB в Playwright используется выполнение JavaScript в контексте страницы с использованием метода page.evaluate():

await page.evaluate(() => {
  const request = indexedDB.open('myDatabase');
  
  request.onsucc ess = () => {
    const db = request.result;
    const transaction = db.transaction('myStore', 'readonly');
    const store = transaction.objectStore('myStore');
    const getRequest = store.get(1); // Получаем объект по ключу

    getRequest.onsucc ess = () => {
      console.log(getRequest.result);
    };
  };
});

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

Запись данных в IndexedDB

Запись данных в IndexedDB выполняется через транзакции, как показано в следующем примере:

await page.evaluate(() => {
  const request = indexedDB.open('myDatabase');

  request.onsucc ess = () => {
    const db = request.result;
    const transaction = db.transaction('myStore', 'readwrite');
    const store = transaction.objectStore('myStore');
    store.put({ id: 1, name: 'itemName' }); // Добавляем или обновляем запись
  };
});

Удаление данных из IndexedDB

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

await page.evaluate(() => {
  const request = indexedDB.open('myDatabase');
  
  request.onsucc ess = () => {
    const db = request.result;
    const transaction = db.transaction('myStore', 'readwrite');
    const store = transaction.objectStore('myStore');
    store.delete(1); // Удаляем запись по ключу
  };
});

Сценарии использования манипуляций с данными хранилища

Тестирование аутентификации

Одним из типичных сценариев является тестирование аутентификации, где нужно проверить поведение приложения после того, как пользователь войдет в систему. В таком случае можно установить cookies или localStorage с необходимыми данными о пользователе:

await context.addCookies([{
  name: 'authToken',
  value: 'validToken123',
  domain: 'example.com'
}]);

После этого можно проверить доступ к защищенным страницам, а также корректность поведения интерфейса.

Проверка очистки данных

Еще одним важным сценарием является проверка очистки данных после выхода пользователя из системы или завершения сессии. Для этого можно использовать методы для удаления cookies, данных из localStorage и sessionStorage:

await context.clearCookies();
await page.evaluate(() => localStorage.clear());
await page.evaluate(() => sessionStorage.clear());

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

Заключение

Манипуляции с данными хранилища являются важной частью тестирования веб-приложений с использованием Playwright. Возможность контролировать cookies, localStorage, sessionStorage и IndexedDB дает возможность глубоко тестировать взаимодействие приложения с данными пользователя, а также проверять различные сценарии поведения в зависимости от состояния этих хранилищ.