В WebdriverIO для автоматизации тестирования веб-приложений критически важно уметь контролировать состояние элементов страницы. Часто возникает необходимость дождаться появления определённого текста в элементе перед выполнением дальнейших действий. Это связано с асинхронной природой современных веб-приложений, где данные могут загружаться динамически через AJAX или WebSocket. WebdriverIO предоставляет для этого мощные механизмы ожидания.
Основной инструмент для контроля текста в элементах —
waitUntil и встроенные методы элементов,
такие как getText() и
waitForDisplayed().
Пример базового ожидания текста:
const elem = await $('#message');
await browser.waitUntil(
async () => (await elem.getText()) === 'Готово',
{
timeout: 5000,
timeoutMsg: 'Текст в элементе не появился в течение 5 секунд'
}
);
Здесь ключевые моменты:
getText() возвращает текущий текст
элемента.waitUntil принимает функцию, которая
должна возвращать true, когда условие выполнено.timeout задаёт максимальное время
ожидания.timeoutMsg позволяет выводить
информативное сообщение при неудаче.Часто требуется не полный текст, а наличие определённой подстроки. В
этом случае используется проверка через includes:
await browser.waitUntil(
async () => (await elem.getText()).includes('Загрузка завершена'),
{
timeout: 7000,
timeoutMsg: 'Ожидаемый текст так и не появился'
}
);
Особенности:
includes позволяет проверять появление
текста постепенно, не требуя точного совпадения.WebdriverIO предоставляет более лаконичные методы, такие как
waitForExist(),
waitForDisplayed(), которые можно
комбинировать с проверкой текста:
await elem.waitForDisplayed({ timeout: 5000 });
const text = await elem.getText();
if (!text.includes('Готово')) {
throw new Error('Текст не соответствует ожидаемому значению');
}
Этот подход безопасен для элементов, которые могут отсутствовать в
DOM в момент вызова, предотвращая ошибки типа
stale element reference.
При работе с современными SPA часто необходимо учитывать изменение
текста в течение коротких промежутков времени. Для таких случаев важно
комбинировать waitUntil с асинхронными
проверками и логами:
await browser.waitUntil(
async () => {
const currentText = await elem.getText();
console.log(`Текущий текст: ${currentText}`);
return currentText === 'Готово';
},
{
timeout: 10000,
timeoutMsg: 'Элемент не получил ожидаемый текст за 10 секунд'
}
);
Преимущества:
При проверке текста на сложных страницах часто требуется уточнять селекторы или обращаться к вложенным элементам:
const parent = await $('#notifications');
const child = await parent.$('.status-message');
await browser.waitUntil(
async () => (await child.getText()) === 'Задача выполнена',
{ timeout: 8000 }
);
Рекомендации:
Для стабильности тестов важно грамотно обрабатывать случаи, когда текст не появляется:
try {
await browser.waitUntil(
async () => (await elem.getText()) === 'Готово',
{ timeout: 5000 }
);
} catch (error) {
console.error('Ошибка: элемент не содержит ожидаемый текст', error);
}
Это позволяет тесту корректно завершаться, с выводом подробной информации для анализа, не ломая выполнение всего тестового набора.
timeout.console.log.waitForDisplayed + waitUntil, чтобы
гарантировать наличие элемента и правильный текст одновременно.Методы ожидания текста в WebdriverIO обеспечивают гибкость и
стабильность тестов в условиях динамически изменяющегося интерфейса.
Комбинация waitUntil, проверки частичных совпадений и
встроенных методов элементов позволяет точно контролировать состояние
элементов перед выполнением дальнейших действий, минимизируя риск
ошибок.