Для начала необходимо установить Puppeteer через npm:
npm install puppeteer
Импорт библиотеки выполняется стандартным образом:
const puppeteer = require(&
Создание и запуск браузера осуществляется через асинхронную функцию:
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
// Пример открытия страницы
await page.goto('https://example.com');
await browser.close();
})();
Опция headless: true позволяет запускать браузер без
графического интерфейса, что важно для автоматизированного тестирования
и CI/CD.
Взаимодействие с веб-интерфейсом Azure Functions
Azure Functions часто предоставляют интерфейс управления через портал
или тестовые endpoints. Puppeteer позволяет симулировать действия
пользователя: клики, ввод данных, навигацию и ожидание результатов.
Пример запуска функции через веб-интерфейс:
await page.goto('https://portal.azure.com/#resource/subscriptions/.../functions');
await page.waitForSelector('button.run-function');
await page.click('button.run-function');
await page.waitForSelector('div.output');
const outputText = await page.$eval('div.output', el => el.textContent);
console.log(outputText);
Ключевой момент — использование waitForSelector. Без него
тест может завершиться до того, как элемент будет доступен в DOM.
Тестирование API Azure Functions
Если Azure Function развернута с HTTP-триггером, Puppeteer можно
использовать для проверки функциональности API через форму или генерацию
запросов. Для сложных сценариев предпочтительнее использовать Puppeteer
совместно с fetch внутри страницы:
const response = await page.evaluate(async () => {
const res = await fetch('https://<function-app>.azurewebsites.net/api/MyFunction', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ key: 'value' })
});
return res.json();
});
console.log(response);
Использование page.evaluate позволяет выполнять код
непосредственно в контексте страницы, что имитирует поведение реального
клиента.
Работа с формами и динамическим контентом
Azure Functions могут возвращать HTML-страницы с динамическим контентом
или формами для тестирования. Puppeteer предоставляет мощные методы для
взаимодействия:
-
page.type(selector, text) — ввод текста в поле.
-
page.click(selector) — клик по элементу.
-
page.select(selector, value) — выбор опции в
<select>.
Пример заполнения формы и проверки ответа функции:
await page.goto('https://<function-app>.azurewebsites.net/form');
await page.type('#username', 'testuser');
await page.type('#password', 'securepass');
await page.click('#submit');
await page.waitForSelector('#result');
const result = await page.$eval('#result', el => el.textContent);
console.log(result);
Для динамического контента важно учитывать асинхронную природу загрузки
данных, поэтому рекомендуется комбинировать waitForSelector
и waitForTimeout для устойчивости тестов.
Скриншоты и запись логов
Puppeteer позволяет сохранять визуальный результат работы Azure
Functions. Это полезно для визуального тестирования и отладки:
await page.screenshot({ path: 'screenshot.png', fullPage: true });
Для логирования выполнения функций можно использовать
console страницы:
page.on('console', msg => console.log('PAGE LOG:', msg.text()));
Это помогает отлавливать ошибки на стороне клиента и анализировать
поведение UI.
Эмуляция различных условий и браузеров
Puppeteer поддерживает эмуляцию устройств и сетевых условий:
await page.emulate({
viewport: { width: 375, height: 667 },
userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X)'
});
await page.setOfflineMode(true);
Эмуляция позволяет тестировать работу Azure Functions в разных
сценариях: мобильные устройства, медленное соединение, отсутствие сети.
Параллельное тестирование
Для ускорения тестирования нескольких функций или сценариев можно
запускать несколько страниц одновременно:
const browser = await puppeteer.launch();
const pages = await Promise.all([
browser.newPage(),
browser.newPage(),
browser.newPage()
]);
await Promise.all(pages.map(page => page.goto('https://<function-app>.azurewebsites.net')));
Использование Promise.all позволяет уменьшить время
тестирования и эффективно распределить ресурсы.
Работа с аутентификацией
Azure Functions часто защищены OAuth или другими методами
аутентификации. Puppeteer позволяет автоматизировать логин:
await page.goto('https://login.microsoftonline.com/');
await page.type('#i0116', 'user@example.com');
await page.click('#idSIButton9');
await page.waitForSelector('#passwordInput');
await page.type('#passwordInput', 'securePassword');
await page.click('#submitButton');
await page.waitForNavigation();
После успешного логина Puppeteer может продолжить тестирование
функциональности защищённой функции.
Советы по оптимизации тестов
-
Использовать
headless: true и отключать ненужные плагины
для ускорения.
-
Минимизировать количество
waitForTimeout, отдавая
предпочтение waitForSelector.
-
Разбивать большие тесты на модульные сценарии.
-
Логировать ключевые действия для удобного анализа ошибок.
Эти подходы обеспечивают стабильное и воспроизводимое тестирование Azure
Functions с использованием Puppeteer.