Protractor — это инструмент для автоматизированного тестирования
веб-приложений на базе Angular и не только. Одной из ключевых
возможностей является взаимодействие с элементами страницы и получение
их свойств и атрибутов. Атрибуты HTML-элементов часто содержат важную
информацию, такую как id, class,
href, value или пользовательские атрибуты
data-*. Protractor предоставляет удобные методы для
извлечения этих данных.
getAttribute()Метод getAttribute() позволяет получить значение
указанного атрибута элемента. Он доступен для объектов типа
ElementFinder и возвращает Promise,
который разрешается в строку с нужным значением.
Синтаксис:
element(locator).getAttribute(attributeName);
locator — стратегия поиска элемента
(by.id, by.css, by.xpath и
т.д.).attributeName — имя атрибута, значение которого
требуется получить.Пример получения атрибута href:
const link = element(by.css('a.example-link'));
link.getAttribute('href').then((hrefValue) => {
console.log('Ссылка ведет на:', hrefValue);
});
В современном JavaScript можно использовать async/await
для упрощения работы с промисами:
const link = element(by.css('a.example-link'));
const hrefValue = await link.getAttribute('href');
console.log('Ссылка ведет на:', hrefValue);
value и placeholder у полей
вводаДля <input> и <textarea> часто
важно получить текущее значение или подсказку. Метод
getAttribute() позволяет это сделать:
const inputField = element(by.id('username'));
// Получение текущего значения поля
const value = await inputField.getAttribute('value');
// Получение текста подсказки
const placeholder = await inputField.getAttribute('placeholder');
console.log('Value:', value);
console.log('Placeholder:', placeholder);
Метод возвращает строку, даже если поле пустое — в этом случае
результат будет ''.
class и их использованиеАтрибут class может содержать несколько CSS-классов.
Получение его значения позволяет проверять состояние элемента через
классы, например, активен он или нет:
const button = element(by.css('.submit-button'));
const classes = await button.getAttribute('class');
if (classes.includes('disabled')) {
console.log('Кнопка отключена');
} else {
console.log('Кнопка активна');
}
Такой подход удобен для проверки динамически изменяемых стилей и состояний.
data-*Современные приложения часто используют пользовательские атрибуты для хранения данных:
<div id="product" data-id="12345" data-category="books"></div>
Доступ к этим атрибутам осуществляется так же, как и к стандартным:
const product = element(by.id('product'));
const productId = await product.getAttribute('data-id');
const category = await product.getAttribute('data-category');
console.log('Product ID:', productId);
console.log('Category:', category);
Использование data-* атрибутов удобно для тестирования
динамического контента без вмешательства в визуальный интерфейс.
Иногда нужно проверить, включен элемент (disabled) или
выбран (checked), особенно для форм:
const checkbox = element(by.id('agree'));
// Проверка состояния галочки
const isChecked = await checkbox.getAttribute('checked');
console.log('Чекбокс выбран:', !!isChecked);
// Проверка доступности кнопки
const submitButton = element(by.id('submit'));
const isDisabled = await submitButton.getAttribute('disabled');
console.log('Кнопка доступна:', !isDisabled);
Метод getAttribute() возвращает null, если
атрибут отсутствует, что удобно для логических проверок.
getAttribute() от getText()Важно понимать разницу между getAttribute() и
getText():
getAttribute() возвращает значение
атрибута, даже если оно скрыто через CSS.getText() возвращает текстовое содержимое
элемента, видимое пользователю.Пример:
<input id="email" value="test@example.com" placeholder="Email">
const input = element(by.id('email'));
const value = await input.getAttribute('value'); // "test@example.com"
const text = await input.getText(); // ""
getText() вернёт пустую строку, так как
<input> не имеет видимого текста. Для проверки
содержимого полей ввода всегда используется
getAttribute('value').
Если элемент не найден или атрибут отсутствует, Protractor возвращает
null или отклонённый промис. Рекомендуется использовать
обработку исключений:
try {
const element = await browser.$('#non-existent');
const attr = await element.getAttribute('title');
console.log('Title:', attr);
} catch (err) {
console.error('Ошибка при получении атрибута:', err.message);
}
Такой подход предотвращает сбои тестов и позволяет логировать детали проблем.
Часто необходимо проверять соответствие нескольких атрибутов одновременно. Это удобно для комплексных проверок состояния элемента:
const btn = element(by.css('button.login'));
const [text, disabled, classes] = await Promise.all([
btn.getText(),
btn.getAttribute('disabled'),
btn.getAttribute('class')
]);
console.log(`Текст: ${text}, доступна: ${!disabled}, классы: ${classes}`);
Использование Promise.all ускоряет тест, поскольку
запросы выполняются параллельно.
Метод getAttribute() является основным инструментом для
работы с HTML-атрибутами в Protractor. Он позволяет гибко проверять
состояние элементов, получать динамически изменяющиеся данные и
взаимодействовать с формами и ссылками, обеспечивая надёжность и
точность автоматизированных тестов.