Проверка текстового содержимого элементов — одна из базовых и наиболее часто используемых операций в end-to-end тестировании на Protractor. Фреймворк предоставляет несколько способов получения и анализа текста, которые важно понимать в контексте асинхронной модели WebDriverJS и особенностей Angular-приложений.
Основным объектом для работы с элементами является
ElementFinder. Он инкапсулирует ссылку на DOM-элемент и
предоставляет методы для взаимодействия с ним, включая чтение
текста.
const title = element(by.css('h1'));
Ключевой метод для получения видимого текста элемента —
getText(). Он возвращает promise, который резолвится в
строку.
title.getText().then(text => {
expect(text).toBe('Главная страница');
});
В современных версиях Protractor при использовании
async/await код становится линейным и читаемым:
const text = await title.getText();
expect(text).toBe('Главная страница');
Важно учитывать, что getText() возвращает только
видимый текст, аналогично innerText в браузере.
Скрытые элементы или части текста с display: none не
попадут в результат.
Чаще всего текст проверяется с использованием стандартных матчеров Jasmine:
toBe — строгое совпадение строкиtoContain — частичное совпадениеtoMatch — проверка по регулярному выражениюПримеры:
expect(await title.getText()).toContain('Главная');
expect(await title.getText()).toMatch(/страниц/);
Для стабильных тестов предпочтительно избегать строгого сравнения
(toBe), если текст может изменяться динамически или
содержать пробелы, переводы строк и локализацию.
При работе с коллекцией элементов используется
ElementArrayFinder, получаемый через
element.all().
const items = element.all(by.css('.menu-item'));
Метод getText() у массива возвращает promise,
резолвящийся в массив строк:
const texts = await items.getText();
expect(texts).toEqual(['Главная', 'Каталог', 'Контакты']);
Каждый элемент массива соответствует тексту конкретного DOM-элемента в том порядке, в котором они присутствуют на странице.
Для доступа к отдельному элементу используется
get(index):
const secondItem = items.get(1);
expect(await secondItem.getText()).toBe('Каталог');
Индекс начинается с нуля, как в стандартных массивах JavaScript.
Текст, получаемый через getText(), может содержать:
\n);Пример HTML:
<div>
<span>Цена:</span>
<strong>100 ₽</strong>
</div>
Результат getText():
Цена: 100 ₽
Для устойчивых проверок часто используется нормализация строки:
const text = (await element.getText()).replace(/\s+/g, ' ').trim();
expect(text).toBe('Цена: 100 ₽');
Если требуется убедиться, что элемент не содержит текста, используется проверка на пустую строку:
expect(await element.getText()).toBe('');
Либо проверка длины:
expect((await element.getText()).length).toBe(0);
Следует различать отсутствие текста и отсутствие элемента. Если
элемент не существует в DOM, вызов getText() приведёт к
ошибке.
Метод getText() не работает для
<input> и <textarea>, так как их
содержимое хранится в атрибуте value. Для таких элементов
используется getAttribute('value').
const input = element(by.css('input[name="email"]'));
expect(await input.getAttribute('value')).toBe('test@example.com');
Это критически важный момент, часто приводящий к ложным падениям тестов.
В динамических интерфейсах текст может изменяться асинхронно. Для корректной проверки применяется ожидание изменения текста:
const EC = protractor.ExpectedConditions;
await browser.wait(
EC.textToBePresentInElement(title, 'Готово'),
5000
);
Также доступны условия:
textToBePresentInElementValue — для inputnot(EC.textToBePresentInElement(...))Это снижает зависимость от таймингов и делает тесты стабильнее.
В архитектуре Page Object получение текста инкапсулируется внутри методов страницы:
class MainPage {
constructor() {
this.title = element(by.css('h1'));
}
async getTitleText() {
return await this.title.getText();
}
}
Использование:
expect(await mainPage.getTitleText()).toContain('Главная');
Такой подход упрощает сопровождение тестов при изменении разметки и локаторов.
Игнорирование асинхронности Использование
getText() без await или then
приводит к сравнению promise со строкой.
Сравнение нестабильного текста Динамические данные, таймстемпы, счётчики и локализованные строки требуют частичных или регулярных проверок.
Использование getText() для input Всегда приводит к пустой строке и некорректным ожиданиям.
Проверка текста до полной загрузки страницы Решается
использованием ExpectedConditions или ожиданий
Angular-стабилизации.
getText() только для видимого текстового
контента.getAttribute('value').toContain и toMatch строгому
toBe.Грамотная проверка текста элементов является фундаментом надёжных end-to-end тестов и напрямую влияет на стабильность и поддерживаемость тестового набора.