В тестировании веб-приложений одним из часто встречающихся сценариев является необходимость дождаться изменения текста в определённом элементе страницы. Это особенно актуально при работе с динамическим контентом, который обновляется через AJAX-запросы, WebSocket-сообщения или анимации. Protractor предоставляет гибкие инструменты для реализации таких ожиданий, основанные на использовании Expected Conditions (EC) и асинхронного API.
ExpectedConditions.textToBePresentInElementProtractor содержит встроенные условия, позволяющие проверять наличие
определённого текста в элементе. Ключевая функция для этой задачи —
ExpectedConditions.textToBePresentInElement.
const EC = protractor.ExpectedConditions;
const myElement = element(by.id('status'));
browser.wait(EC.textToBePresentInElement(myElement, 'Готово'), 5000, 'Текст не изменился на "Готово"');
Этот метод удобен для проверки конкретного текста, когда известно, каким он должен стать.
Если требуется дождаться любого изменения текста, а
не конкретного значения, можно использовать функцию обратного вызова в
browser.wait.
const myElement = element(by.css('.message'));
let initialText;
myElement.getText().then(text => {
initialText = text;
});
browser.wait(() => {
return myElement.getText().then(currentText => currentText !== initialText);
}, 5000, 'Текст элемента не изменился в течение 5 секунд');
browser.wait проверяет, что текущее значение
текста отличается от исходного.async/awaitВ современных версиях Protractor рекомендуется использовать синтаксис
async/await для улучшения читаемости кода:
const EC = protractor.ExpectedConditions;
const myElement = element(by.css('.notification'));
async function waitForTextChange() {
const initialText = await myElement.getText();
await browser.wait(async () => {
const currentText = await myElement.getText();
return currentText !== initialText;
}, 5000, 'Текст элемента не изменился');
}
await waitForTextChange();
.then() и сделать код линейным.В некоторых случаях текст может меняться динамически, например,
включать переменные значения (Загрузка 20%,
Загрузка 40% и т.д.). В таких сценариях удобнее
использовать регулярные выражения:
const myElement = element(by.css('.progress'));
const regex = /Загрузка \d+%/;
await browser.wait(async () => {
const text = await myElement.getText();
return regex.test(text);
}, 5000, 'Текст элемента не соответствует ожидаемому шаблону');
Protractor позволяет комбинировать проверку текста с другими условиями, например, видимостью элемента или доступностью для взаимодействия:
const EC = protractor.ExpectedConditions;
const myElement = element(by.id('alert'));
await browser.wait(
EC.and(
EC.visibilityOf(myElement),
async () => {
const text = await myElement.getText();
return text.includes('Ошибка');
}
),
5000,
'Элемент не виден или текст не содержит "Ошибка"'
);
browser.sleep(). Они увеличивают время выполнения тестов и
делают их нестабильными.browser.wait с EC или
пользовательскими функциями для надежного синхронного
поведения.Эти методы обеспечивают надёжное управление динамическим контентом и позволяют строить тесты, которые корректно реагируют на изменения текста элементов без излишнего ожидания или нестабильных проверок.