В автоматизированном тестировании веб-приложений на JavaScript с использованием Protractor часто возникает задача найти конкретный текст на странице. Protractor, построенный поверх Selenium WebDriver, предоставляет мощные механизмы для поиска элементов и проверки их содержимого. Эффективная работа с текстовыми значениями позволяет создавать надежные и точные тесты.
element и by для поиска текстаБазовая единица работы в Protractor — объект
ElementFinder. Для поиска конкретного текста
применяются локаторы, предоставляемые объектом by:
element(by.css('selector')).getText().then(text => {
if (text === 'Искомая строка') {
console.log('Строка найдена');
}
});
Пояснения:
element возвращает первый найденный элемент,
соответствующий локатору.by.css — универсальный CSS-селектор.getText() извлекает текстовое содержимое элемента.then() используется для обработки промиса, так
как getText() возвращает промис.by.xpath для поиска текста внутри элементовXPath позволяет выполнять поиск элементов с конкретным текстом без необходимости сначала получать все элементы. Пример:
let targetElement = element(by.xpath("//*[text()='Искомая строка']"));
expect(targetElement.isPresent()).toBe(true);
Ключевые моменты:
//*[text()='Искомая строка'] — ищет любой элемент с
точным совпадением текста.isPresent() проверяет существование элемента на
странице.Для поиска элементов, содержащих текст частично, удобно использовать
contains() в XPath:
let partialMatch = element(by.xpath("//*[contains(text(),'часть строки')]"));
expect(partialMatch.isDisplayed()).toBe(true);
Особенности:
contains(text(),'часть строки') находит все элементы,
текст которых включает указанную подстроку.isDisplayed() проверяет видимость элемента, что
полезно для проверки интерфейса.Иногда текст необходимо найти среди коллекции элементов. Для этого используется ElementArrayFinder:
let items = element.all(by.css('.list-item'));
items.filter(async (elem) => {
let text = await elem.getText();
return text.includes('Искомая строка');
}).then(filteredElements => {
console.log('Найдено элементов:', filteredElements.length);
});
Пояснения:
element.all возвращает массив элементов.filter позволяет оставить только те элементы, которые
соответствуют условию.Для гибкого поиска текста можно использовать регулярные выражения:
let regex = /Искомая\sстрока/i;
element.all(by.css('.list-item')).filter(async (elem) => {
let text = await elem.getText();
return regex.test(text);
}).then(matches => {
console.log('Совпадений с регулярным выражением:', matches.length);
});
Преимущества:
Текст может появляться с задержкой из-за асинхронной загрузки данных.
Для таких случаев используется ExpectedConditions:
const EC = protractor.ExpectedConditions;
let elementToWait = element(by.css('.notification'));
browser.wait(EC.textToBePresentInElement(elementToWait, 'Искомая строка'), 5000);
Комментарии:
textToBePresentInElement проверяет, появился ли текст в
элементе.5000 — максимальное время ожидания в
миллисекундах.Для сложных случаев, например, при необходимости искать текст в нескольких элементах с разной структурой, удобно писать собственные функции:
async function findElementByText(elements, searchText) {
for (let i = 0; i < await elements.count(); i++) {
let elem = elements.get(i);
let text = await elem.getText();
if (text.includes(searchText)) {
return elem;
}
}
return null;
}
let items = element.all(by.css('.list-item'));
let target = await findElementByText(items, 'Искомая строка');
if (target) {
console.log('Элемент найден');
}
Особенности подхода:
id,
class) для минимизации объема DOM-обхода.isPresent и
isDisplayed для проверки существования и видимости
элементов вместо попытки получить текст всех элементов.ExpectedConditions для корректного ожидания появления
текста.Эти методы позволяют эффективно находить конкретные строки в DOM-структуре, обеспечивая надежность тестов и упрощая работу с динамическим контентом в приложениях на Angular и других фронтенд-фреймворках.