Protractor — инструмент для автоматизированного тестирования Angular-приложений на базе Selenium WebDriver. Одним из важных аспектов эффективного тестирования является правильное использование и отслеживание локаторов. Логирование локаторов позволяет отлаживать тесты, выявлять ошибки выбора элементов и повышать стабильность тестового кода.
В Protractor локаторы определяются с помощью объекта
element и функции by. Примеры основных
локаторов:
element(by.id('username'));
element(by.css('.btn-primary'));
element(by.xpath('//div[@class="header"]'));
element(by.model('user.name'));
Ключевой момент: корректный локатор должен быть уникальным и стабильным. Частая ошибка — использование локаторов, которые зависят от динамического содержимого страницы или классов, генерируемых фреймворками.
Логирование локаторов позволяет:
Без логирования часто возникают ситуации, когда тест падает из-за того, что локатор перестал соответствовать элементу после изменения DOM, и причина остается неочевидной.
console.logСамый простой способ — вывод локатора в консоль перед взаимодействием:
let loginButton = element(by.css('.btn-login'));
console.log('Используется локатор для кнопки входа:', loginButton.locator());
loginButton.click();
Метод locator() возвращает описание локатора, что
позволяет отслеживать, какой именно элемент пытается использовать
тест.
Важно не только видеть локатор, но и состояние элемента:
element(by.css('#submit')).isPresent().then(function(present) {
console.log('Элемент #submit присутствует на странице:', present);
});
element(by.css('#submit')).isDisplayed().then(function(visible) {
console.log('Элемент #submit видим пользователю:', visible);
});
isPresent() проверяет наличие элемента в DOM.isDisplayed() проверяет видимость элемента на
странице.Комбинация этих методов позволяет точно определить, почему тест не может взаимодействовать с элементом.
async/awaitСовременные версии Protractor поддерживают async/await,
что делает код более читаемым:
let usernameField = element(by.model('user.name'));
if (await usernameField.isPresent()) {
console.log('Поле username найдено с локатором:', usernameField.locator());
await usernameField.sendKeys('admin');
} else {
console.log('Поле username не найдено');
}
Такой подход предотвращает появление “undefined” и упрощает отладку тестов.
Для упрощения повторного логирования создаются утилитарные функции:
async function logElementInfo(el, description) {
const present = await el.isPresent();
const displayed = present ? await el.isDisplayed() : false;
console.log(`${description} | Локатор: ${el.locator()} | Присутствует: ${present} | Видим: ${displayed}`);
}
let passwordField = element(by.model('user.password'));
await logElementInfo(passwordField, 'Поле пароля');
Преимущества такого подхода:
Для более продвинутого логирования часто используют библиотеки, например, winston или log4js:
const logger = require('winston');
async function logElementStatus(el, name) {
const present = await el.isPresent();
const displayed = present ? await el.isDisplayed() : false;
logger.info(`${name}: Локатор: ${el.locator()}, Присутствует: ${present}, Видим: ${displayed}`);
}
let loginBtn = element(by.css('.btn-login'));
await logElementStatus(loginBtn, 'Кнопка входа');
Такой подход позволяет собирать логи в файлы, фильтровать их по уровню и создавать отчеты о тестах.
На страницах с динамическим контентом часто элементы появляются или исчезают после загрузки. Логирование локаторов в таких случаях помогает определить точное время их появления:
let dynamicElement = element(by.css('.notification'));
browser.wait(protractor.ExpectedConditions.presenceOf(dynamicElement), 5000)
.then(async () => {
console.log('Динамический элемент найден:', dynamicElement.locator());
})
.catch(() => {
console.log('Динамический элемент не появился в течение 5 секунд');
});
Использование ExpectedConditions в связке с логированием
повышает надежность тестов на асинхронных страницах.
async/await для упрощения чтения кода.Логирование локаторов в Protractor является не просто инструментом отладки, а основой стабильного и предсказуемого тестирования. Оно помогает выявлять слабые места тестов, ускоряет диагностику проблем и делает автоматизацию более надежной.