by.xpath() — это один из локаторов в Protractor,
позволяющий находить элементы на веб-странице с помощью
XPath-выражений. XPath предоставляет гибкий и мощный
способ навигации по DOM, особенно когда стандартные локаторы
(by.id, by.css, by.className) не
подходят.
Синтаксис вызова:
element(by.xpath('XPath выражение'));
Пример поиска кнопки с текстом «Войти»:
let loginButton = element(by.xpath("//button[text()='Войти']"));
//button — выбирает все элементы
<button> в документе.[text()='Войти'] — фильтрует элементы по точному
тексту.Для поиска элементов внутри контейнера:
let firstInputInForm = element(by.xpath("//form[@id='loginForm']//input[1]"));
//form[@id='loginForm'] — находит форму с атрибутом
id="loginForm".//input[1] — выбирает первый <input>
внутри формы./ и
описывает путь от корня документа:element(by.xpath("/html/body/div[2]/form/input[1]"));
// и
ищет элементы в любом месте документа:element(by.xpath("//input[@name='username']"));
Относительные XPath предпочтительнее, так как они менее хрупкие при изменении структуры страницы.
XPath позволяет строить сложные условия через логические операторы:
and — объединяет условияor — одно из условийcontains() — проверяет наличие подстрокиstarts-with() — проверяет начало строкиПримеры:
// Поиск элемента с классом 'btn' и текстом 'Отправить'
element(by.xpath("//button[contains(@class,'btn') and text()='Отправить']"));
// Поиск ссылки, начинающейся с 'https://'
element(by.xpath("//a[starts-with(@href,'https://')]"));
XPath позволяет выбирать элементы по порядковому номеру:
// Третий элемент списка
element(by.xpath("(//ul[@id='menu']/li)[3]"));
Скобки важны: они ограничивают область действия индекса, иначе он применяется к последнему шагу XPath.
element(by.xpath("//div[@class='container']/child::span"));
following-sibling):element(by.xpath("//label[text()='Email']/following-sibling::input"));
preceding-sibling):element(by.xpath("//input[@name='email']/preceding-sibling::label"));
parent):element(by.xpath("//input[@name='email']/parent::div"));
Для получения списка элементов используется
element.all(by.xpath()):
let menuItems = element.all(by.xpath("//ul[@id='menu']/li"));
menuItems.count().then(count => console.log(count));
Элементы можно фильтровать и применять итерации:
menuItems.each(item => {
item.getText().then(text => console.log(text));
});
contains() и
starts-with(), чтобы делать XPath гибким к
изменениям текста и атрибутов.element(by.xpath("//button[contains(text(),'Продолжить')]"));
element.all(by.xpath("//ul[@id='menu']/li[contains(@class,'active')]"));
element(by.xpath("//label[text()='Пароль']/following-sibling::input")).getAttribute('value');
element(by.xpath("//div[@class='alert' and contains(text(),'Ошибка')]")).isDisplayed();
by.xpath() в Protractor — универсальный инструмент для
нахождения элементов на странице, особенно когда структура сложная или
стандартные локаторы не подходят. Он позволяет строить гибкие и точные
селекторы с учетом текста, атрибутов, позиции и иерархии элементов.