Azure Functions

Подключение Puppeteer и базовая настройка

Для начала необходимо установить 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.