ARIA (Accessible Rich Internet Applications) атрибуты предназначены для повышения доступности веб-приложений, позволяя вспомогательным технологиям — таким как скринридеры — корректно интерпретировать динамический контент. В автоматизированном тестировании важно уметь проверять их присутствие и корректность, особенно при тестировании пользовательских интерфейсов с динамическими элементами.
Puppeteer предоставляет возможность работать с DOM напрямую, что
позволяет получать значения ARIA атрибутов через page.$eval</code>
или <code>page.evaluate</code>.</p>
<p><strong>Пример: чтение атрибута
<code>aria-label</code>:</strong></p>
<pre class="javascript"><code>const ariaLabel = await
page.$eval(& console.log(ariaLabel); // Выведет значение
атрибута
Если необходимо проверить несколько атрибутов одновременно:
const ariaAttributes = await page.$eval('#menu', el => ({
role: el.getAttribute('role'),
expanded: el.getAttribute('aria-expanded'),
hidden: el.getAttribute('aria-hidden')
}));
console.log(ariaAttributes);
Автоматизированные тесты часто требуют проверки соответствия ARIA
атрибутов ожидаемым значениям. Для этого удобно использовать
expect из тестового фреймворка (например, Jest или Mocha):
const isExpanded = await page.$eval('#dropdown', el => el.getAttribute('aria-expanded'));
expect(isExpanded).toBe('true');
Проверка наличия роли:
const role = await page.$eval('#modal', el => el.getAttribute('role'));
expect(role).toBe('dialog');
ARIA атрибуты часто сигнализируют о состоянии элементов (например, раскрыт ли аккордеон). Puppeteer позволяет комбинировать их с действиями пользователя:
// Нажатие на кнопку раскрытия меню
await page.click('#menu-button');
// Проверка, что aria-expanded обновился
const expanded = await page.$eval('#menu-button', el => el.getAttribute('aria-expanded'));
expect(expanded).toBe('true');
Использование ARIA для локаторов повышает надежность тестов:
// Поиск кнопки с конкретным aria-label
const button = await page.$('[aria-label="Отправить форму"]');
await button.click();
В современных SPA элементы часто создаются динамически. ARIA атрибуты могут обновляться после взаимодействий. Для корректного тестирования требуется ожидание:
await page.click('#toggle-section');
// Ждем обновления aria-expanded
await page.waitForFunction(
selector => document.querySelector(selector).getAttribute('aria-expanded') === 'true',
{},
'#toggle-section'
);
Использование waitForFunction гарантирует, что тест не
продолжится до обновления состояния.
Для комплексного тестирования полезно собирать все ARIA атрибуты на странице и проверять их на соответствие стандартам:
const elementsWithAria = await page.$$('[aria-label], [aria-labelledby], [aria-hidden], [role]');
const ariaData = await Promise.all(
elementsWithAria.map(el => page.evaluate(element => {
return {
tag: element.tagName.toLowerCase(),
role: element.getAttribute('role'),
ariaLabel: element.getAttribute('aria-label'),
ariaHidden: element.getAttribute('aria-hidden')
};
}, el))
);
console.table(ariaData);
Такой подход помогает выявлять элементы с отсутствующими или некорректными атрибутами на больших страницах.
ARIA атрибуты часто связаны с видимостью элементов. Puppeteer позволяет проверять их состояние совместно с видимостью:
const isHidden = await page.$eval('#tooltip', el => el.getAttribute('aria-hidden') === 'true');
const isVisible = await page.isVisible('#tooltip');
expect(isHidden).toBe(true);
expect(isVisible).toBe(false);
Это позволяет убедиться, что атрибуты и реальное отображение элемента синхронизированы.
waitForFunction,
waitForSelector) для динамически обновляемых атрибутов.
aria-label и aria-labelledby, чтобы тесты
оставались читаемыми и поддерживаемыми.
test('Меню доступно через ARIA', async () => {
await page.goto('https://example.com');
const menuButton = await page.$('[aria-label="Меню"]');
expect(menuButton).not.toBeNull();
await menuButton.click();
const expanded = await page.$eval('[aria-label="Меню"]', el => el.getAttribute('aria-expanded'));
expect(expanded).toBe('true');
const menuItems = await page.$$('[role="menuitem"]');
expect(menuItems.length).toBeGreaterThan(0);
});
Этот пример демонстрирует полный цикл тестирования: проверка доступности кнопки, взаимодействие и проверка состояния раскрытого меню с использованием ARIA атрибутов.
ARIA атрибуты в Puppeteer позволяют не только проверять корректность интерфейсов, но и создавать более стабильные и надежные тесты, особенно для динамических элементов и сложных веб-приложений.