Метод by.id() является одним из основных локаторов в
Protractor и служит для поиска элементов по атрибуту id в
DOM-дереве страницы. Атрибут id уникален на странице, что
делает этот локатор быстрым и надёжным для идентификации элементов.
element(by.id('elementId'));
element — глобальная функция Protractor для получения
элемента.by.id('elementId') — локатор, который ищет элемент с
указанным id. Возвращаемый объект — экземпляр
ElementFinder, через который можно взаимодействовать с
элементом.Пример клика по кнопке с id="submitBtn":
element(by.id('submitBtn')).click();
Метод getText() позволяет извлечь текстовое содержимое
найденного элемента:
let buttonText = element(by.id('submitBtn')).getText();
buttonText.then(function(text) {
console.log(text);
});
Protractor тесно интегрирован с библиотекой
ExpectedConditions, что позволяет применять ожидания для
асинхронного взаимодействия с элементами.
Пример ожидания появления элемента перед кликом:
let EC = protractor.ExpectedConditions;
let submitButton = element(by.id('submitBtn'));
browser.wait(EC.visibilityOf(submitButton), 5000);
submitButton.click();
EC.visibilityOf() проверяет, что элемент видим на
странице.browser.wait — таймаут в
миллисекундах.При работе с формами by.id() позволяет легко находить
поля ввода и другие элементы формы:
let usernameInput = element(by.id('username'));
usernameInput.sendKeys('testUser');
let passwordInput = element(by.id('password'));
passwordInput.sendKeys('securePassword');
element(by.id('loginBtn')).click();
Метод sendKeys() отправляет текст в поле ввода, а
click() имитирует нажатие на кнопку.
id должен быть
уникальным на странице. Если это не так, by.id() вернёт
первый найденный элемент.id выполняется
быстрее, чем по CSS или XPath, так как браузер использует внутренний
метод getElementById.element(by.css('#formContainer')).element(by.id('username'));
В этом примере сначала ищется контейнер с
id=formContainer, а затем внутри него — поле с
id=username.
Для проверки присутствия элемента на странице используется метод
isPresent():
let isLoginButtonPresent = element(by.id('loginBtn')).isPresent();
isLoginButtonPresent.then(function(result) {
console.log(result); // true или false
});
Метод возвращает промис, который разрешается в true,
если элемент найден, и false, если отсутствует.
Хотя by.id() чаще применяется для одиночных элементов,
его можно использовать внутри коллекций element.all:
let inputs = element.all(by.css('input'));
let passwordField = inputs.filter(function(elem) {
return elem.getAttribute('id').then(id => id === 'password');
}).first();
passwordField.sendKeys('securePassword');
Этот подход полезен, когда id динамически создаётся или
необходимо выбирать элемент среди множества похожих.
Protractor работает с промисами, поэтому методы
getText(), isPresent(),
getAttribute() требуют асинхронной обработки:
async function printButtonText() {
let text = await element(by.id('submitBtn')).getText();
console.log(text);
}
printButtonText();
Использование async/await делает код более читаемым и
избавляет от вложенных .then().
Для отладки удобно проверять атрибуты элементов:
element(by.id('submitBtn')).getAttribute('class').then(function(classes) {
console.log('Классы кнопки:', classes);
});
Это помогает убедиться, что выбран правильный элемент и взаимодействие будет корректным.
Хотя by.id() выглядит просто, его правильное применение
ускоряет тестирование, снижает вероятность ошибок и упрощает поддержку
тестов. Он особенно эффективен при работе с формами, кнопками и
уникальными элементами интерфейса.