Для автоматизированного тестирования веб-приложений часто используют фреймворки, такие как Puppeteer, который позволяет взаимодействовать с браузером на уровне API, а также Jest — популярный инструмент для тестирования JavaScript. Интеграция этих двух инструментов обеспечивает создание мощных и надежных тестов для функциональной и UI-автоматизации. В этой главе рассмотрим, как настроить и использовать Puppeteer вместе с Jest для написания эффективных и масштабируемых тестов.
Для начала необходимо установить несколько пакетов, включая Puppeteer и Jest.
Установить Puppeteer:
npm install puppeteer
Установить Jest:
npm install --save-dev jest
Для удобства можно установить jest-environment-puppeteer,
который предоставит специальную среду для выполнения тестов с Puppeteer:
npm install --save-dev jest-environment-puppeteer
Jest должен быть настроен для работы с Puppeteer. Для этого в
конфигурации Jest необходимо указать использование
jest-environment-puppeteer. Это обеспечит запуск тестов в
среде Puppeteer с возможностью управления браузером.
Создаем файл конфигурации jest.config.js (если его нет) и
добавляем следующие строки:
module.exports = {
preset: &
testMatch: ['**/tests/**/*.test.js'], // Указываем путь к тестам
setupFilesAfterEnv: ['<rootDir>/setupTests.js'], // Подключаем файл с настройками перед каждым тестом
};
Файл setupTests.js может содержать дополнительные
настройки, например, подключение и настройку Puppeteer, если это
необходимо.
Пример структуры теста для взаимодействия с веб-страницей с использованием Puppeteer и Jest:
describe('Тестирование веб-страницы', () => {
let page;
beforeAll(async () => {
page = await global.browser.newPage(); // Открываем новую вкладку
});
afterAll(async () => {
await page.close(); // Закрываем вкладку после выполнения всех тестов
});
test('Проверка заголовка страницы', async () => {
await page.goto('https://example.com'); // Переходим на страницу
const title = await page.title(); // Получаем заголовок
expect(title).toBe('Example Domain'); // Проверяем, что заголовок совпадает
});
test('Проверка наличия элемента на странице', async () => {
await page.goto('https://example.com');
const element = await page.$('h1'); // Находим элемент
expect(element).not.toBeNull(); // Проверяем, что элемент существует
});
});
В этом примере создаются два теста: один проверяет заголовок страницы,
второй — наличие элемента h1. Важно, что каждый тест
выполняется в изолированной среде с новым экземпляром страницы, что
исключает влияние одного теста на другой.
Puppeteer предоставляет широкий набор методов для работы с элементами страницы, таких как:
page.(selector) < /code > < /strong > —возвращаетпервыйэлемент, соответствующийселектору. < /li > < li > < strong > < code > page.$</code></strong> — возвращает все
элементы,
соответствующие селектору.</li>
<li><strong><code>element.click()</code></strong>
— клик по
элементу.</li>
<li><strong><code>element.type(value)</code></strong>
— ввод текста в
поле.</li>
<li><strong><code>page.waitForSelector(selector)</code></strong>
—
ожидание появления элемента на странице.</li>
</ul>
<p>Пример взаимодействия с элементом:</p>
<pre class="javascript"><code>test('Отправка
формы', async () => {
await page.goto('https://example.com/form');
await
page.type('input[name="username"]',
'testuser'); // Ввод имени
await
page.type('input[name="password"]',
'password123'); // Ввод пароля
await
page.click('button[type="submit"]');
// Клик по кнопке
await page.waitForSelector('.success-message'); //
Ожидание появления сообщения об успехе
const message = await page.$eval('.success-message', el =>
el.textContent); expect(message).toBe('Форма успешно отправлена!');
});
Этот тест имитирует ввод данных в форму и их отправку, после чего проверяется наличие сообщения об успешной отправке.
Когда работаешь с динамическими веб-страницами, важно учитывать
асинхронность в тестах. Puppeteer предлагает несколько методов для
работы с асинхронными процессами, например, ожидание загрузки элементов.
Ожидание можно использовать через waitForSelector, что
гарантирует завершение всех необходимых операций перед дальнейшими
шагами в тесте.
test('Загрузка контента', async () => {
await page.goto('https://example.com/content');
await page.waitForSelector('.content-loaded'); // Ждем, пока контент загрузится
const content = await page.$eval('.content-loaded', el => el.textContent);
expect(content).toBe('Контент загружен');
});
Кроме того, можно ожидать события, такие как загрузка изображений или изменение состояния на странице:
await page.waitForFunction('document.querySelector("img").complete'); // Ожидание загрузки изображения
Для тестирования можно настроить браузер Puppeteer на определенные
параметры, такие как работа в headless-режиме, установка
пользовательского агента или изменение размера окна. Эти настройки можно
выполнить в блоке beforeAll:
beforeAll(async () => {
global.browser = await puppeteer.launch({
headless: true, // Отключение визуализации браузера
slowMo: 50, // Замедление для отслеживания действий
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
});
Кроме того, можно настроить страницу, например, установить пользовательский агент:
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36');
Разделяйте тесты на несколько файлов: Разбивайте тесты на отдельные модули для каждой функции или компонента. Это позволяет повысить читаемость и удобство обслуживания.
Используйте моки: Для тестирования без зависимости от внешних сервисов используйте моки или подменяйте API-запросы.
Автоматизируйте скриншоты и видеозаписи: Для удобства отладки можно делать скриншоты или записывать видео во время выполнения тестов:
await page.screenshot({ path: 'screenshot.png' });
await page.video({ path: 'test-video.mp4' });
При разработке тестов часто возникает необходимость в их отладке. Для
этого можно использовать встроенные инструменты, такие как
page.pause() для остановки теста на определенной точке и
page.screenshot() для получения снимков экрана. Важно также
использовать консольные логи для отслеживания состояния выполнения.
test('Тест с паузой для отладки', async () => {
await page.goto('https://example.com');
await page.pause(); // Останавливаем тест для отладки
const title = await page.title();
console.log('Заголовок страницы:', title);
expect(title).toBe('Example Domain');
});
Интеграция Puppeteer с Jest предоставляет мощный инструмент для автоматизированного тестирования веб-приложений. Используя Puppeteer, можно выполнять комплексные UI-тесты, а Jest обеспечивает удобный и масштабируемый фреймворк для организации и запуска тестов. Правильная настройка тестовой среды и использование эффективных методов ожидания и взаимодействия с элементами позволяет создавать стабильные и надежные тесты для любого типа веб-приложений.