Клавиатурная навигация является важным аспектом автоматизированного тестирования веб-приложений, особенно при проверке доступности интерфейсов и взаимодействия с элементами, управляемыми клавиатурой. Puppeteer предоставляет гибкий API для эмуляции нажатий клавиш, управления фокусом и последовательного ввода данных.
Puppeteer позволяет симулировать нажатия клавиш с помощью методов
keyboard.type, keyboard.press и
keyboard.down/keyboard.up.
Пример: набор текста в поле ввода
const puppeteer = require(&
(async () => {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://example.com');
const inputSelector = '#username';
await page.focus(inputSelector);
// Ввод текста
await page.keyboard.type('test_user');
await browser.close();
})();
Ключевые моменты:
keyboard.type автоматически вводит текст по символам
с задержкой между ними, имитируя естественный набор.
type необходимо установить
фокус на нужный элемент (page.focus).
Для нажатия функциональных клавиш и модификаторов используются методы
keyboard.press и комбинации клавиш с модификаторами.
await page.keyboard.press('Enter');
await page.keyboard.press('ArrowDown');
await page.keyboard.press('Tab');
await page.keyboard.press('Backspace');
Пример комбинаций с модификаторами:
await page.keyboard.down('Shift');
await page.keyboard.press('Tab');
await page.keyboard.up('Shift');
Особенности:
keyboard.down(key) удерживает клавишу,
keyboard.up(key) — отпускает.
Control, Alt или
Meta необходимо точно контролировать порядок
down и up.
Клавиши Tab и Shift+Tab используются для
перехода между интерактивными элементами страницы. Puppeteer позволяет
проверять фокус и его изменение после нажатий.
await page.keyboard.press('Tab'); // перемещение фокуса к следующему элементу
await page.keyboard.press('Shift+Tab'); // перемещение к предыдущему элементу
Для проверки фокуса удобно использовать метод
page.evaluate:
const activeElementId = await page.evaluate(() => document.activeElement.id);
console.log(activeElementId);
Такой подход позволяет тестировать последовательность навигации и убедиться, что элементы доступны для клавиатурного управления.
При автоматизации форм и интерфейсов важно комбинировать ввод текста и навигацию между полями.
await page.focus('#firstName');
await page.keyboard.type('Иван');
await page.keyboard.press('Tab');
await page.keyboard.type('Иванов');
await page.keyboard.press('Tab');
await page.keyboard.press('Enter'); // отправка формы
Рекомендации:
focus перед вводом текста, чтобы гарантировать
попадание данных в нужное поле.
document.activeElement после Tab для
корректного управления фокусом.
Для тестирования динамических элементов и сложных интерфейсов Puppeteer поддерживает:
keyboard.sendCharacter(char) — отправка произвольного
символа, включая Unicode.
Ctrl+C,
Ctrl+V) для эмуляции операций копирования и вставки.
await page.keyboard.down('Control');
await page.keyboard.press('A');
await page.keyboard.up('Control');
await page.keyboard.press('Backspace'); // очистка поля
Для имитации реального поведения пользователя можно задавать задержку между нажатиями:
await page.keyboard.type('example', { delay: 100 }); // задержка 100 мс между символами
Зачем это нужно:
Эмуляция клавиатурной навигации помогает тестировать доступность интерфейсов:
Tab.
Enter и Space для активации кнопок и
чекбоксов.
const focusOrder = ['#username', '#password', '#loginButton'];
for (const selector of focusOrder) {
await page.keyboard.press('Tab');
const active = await page.evaluate(() => document.activeElement.id);
console.assert(active === selector.slice(1), `Фокус не на ${selector}`);
}
Такой подход позволяет выявить нарушения доступности и ошибки в логике фокусировки.
В headless-режиме некоторые события клавиатуры могут вести себя иначе
из-за отсутствия визуального рендеринга. Для полного тестирования
интерактивных элементов рекомендуется запускать браузер в режиме
headless: false. Это особенно важно для интерфейсов с
JavaScript-анимациями или динамическими элементами.
delay) для имитации реального ввода.
Enter, Escape).
keyboard.press и
keyboard.type для разных сценариев.
Эти техники обеспечивают надежную эмуляцию пользовательских сценариев и позволяют тестировать интерфейсы с учетом реального взаимодействия через клавиатуру.