Puppeteer — это высокоуровневая библиотека для управления браузером Chromium или Chrome через протокол DevTools. Она позволяет автоматизировать действия пользователя, получать данные о DOM и выполнять сложные сценарии тестирования, включая проверку адаптивного дизайна.
Ключевая особенность при тестировании responsive design заключается в возможности программно менять размеры окна браузера и эмулировать разные устройства, что позволяет выявлять баги отображения и верстки без ручного переключения между устройствами.
Puppeteer предоставляет метод page.setViewport(), который
задаёт размеры окна браузера. Этот метод принимает объект с шириной
(width), высотой (height) и плотностью
пикселей (deviceScaleFactor).
Пример настройки для мобильного устройства:
await page.setViewport({
width: 375,
height: 812,
deviceScaleFactor: 3
});
Для десктопа:
await page.setViewport({
width: 1920,
height: 1080,
deviceScaleFactor: 1
});
Важно: изменение размеров окна влияет на макет страницы, а также на реакцию элементов на hover и клики, что критично при тестировании интерактивных компонентов.
Puppeteer включает встроенные пресеты для популярных устройств через
puppeteer.devices. Каждый пресет содержит параметры
viewport и user-agent.
Пример эмуляции iPhone 13:
const iPhone = puppeteer.devices[&
await page.emulate(iPhone);
Эмуляция включает:
deviceScaleFactor), что влияет на
отрисовку графики.
Использование page.emulate() упрощает проверку верстки для
различных мобильных устройств без необходимости вручную менять viewport.
Для проверки адаптивного дизайна важно фиксировать внешний вид страницы при разных размерах экранов. Puppeteer позволяет делать полноразмерные скриншоты:
await page.screenshot({ path: 'mobile.png', fullPage: true });
await page.setViewport({ width: 1920, height: 1080 });
await page.screenshot({ path: 'desktop.png', fullPage: true });
Совет: полезно сохранять скриншоты с указанием устройства или разрешения в названии файла, чтобы легко отслеживать результаты тестирования.
Для автоматического тестирования responsive design можно использовать
метод page.evaluate(), который позволяет выполнять
JavaScript на странице.
Пример проверки активного медиа-запроса:
const isMobileLayout = await page.evaluate(() => {
return window.matchMedia("(max-width: 768px)").matches;
});
console.log(isMobileLayout ? 'Мобильная версия' : 'Десктоп версия');
Такой подход позволяет создавать автоматические тесты для проверки корректного применения стилей при разных разрешениях.
Адаптивная верстка часто подразумевает изменение DOM в зависимости от размера экрана. Puppeteer позволяет отслеживать динамические изменения через:
page.waitForSelector() — ожидание появления элемента.
page.eval() < /code > и < code > page.$eval()</code> — получение
данных элементов после изменения DOM.</li>
</ul>
<p>Пример проверки меню, скрытого на мобильных
устройствах:</p>
<pre class="javascript"><code>await page.setViewport({
width: 375, height: 812 });
const menuVisible = await page.$eval('#menu', el =>
window.getComputedStyle(el).display !== 'none');
console.log(menuVisible); // false для скрытого меню
Это позволяет тестировать не только внешний вид, но и логику отображения элементов.
Для более реалистичного тестирования мобильных версий важно эмулировать
сетевые условия с помощью page.emulateNetworkConditions().
Пример имитации медленного 3G:
await page.emulateNetworkConditions({
offline: false,
downloadThroughput: 500 * 1024 / 8,
uploadThroughput: 500 * 1024 / 8,
latency: 400
});
Эмуляция сетевых условий позволяет выявлять проблемы с адаптивными изображениями и динамическим контентом, которые могут замедлять загрузку на мобильных устройствах.
Puppeteer легко интегрируется с Jest, Mocha и другими фреймворками для организации автоматизированных тестов. Пример с Jest:
describe('Responsive layout tests', () => {
let browser;
let page;
beforeAll(async () => {
browser = await puppeteer.launch();
page = await browser.newPage();
});
afterAll(async () => {
await browser.close();
});
test('Mobile layout', async () => {
await page.emulate(puppeteer.devices['iPhone 13']);
await page.goto('https://example.com');
const headerVisible = await page.$eval('header', el => el.offsetHeight > 0);
expect(headerVisible).toBe(true);
});
test('Desktop layout', async () => {
await page.setViewport({ width: 1920, height: 1080 });
await page.goto('https://example.com');
const headerVisible = await page.$eval('header', el => el.offsetHeight > 0);
expect(headerVisible).toBe(true);
});
});
Такой подход позволяет запускать полноценные сценарии responsive-тестирования в рамках CI/CD.
Эти практики повышают надёжность тестов и позволяют выявлять скрытые ошибки адаптивной верстки на разных устройствах.