В автоматизированном тестировании веб-приложений на JavaScript с использованием Protractor ключевым аспектом является проверка видимости элементов на странице. Видимость элемента определяет, может ли пользователь взаимодействовать с ним, а также влияет на корректность выполнения сценариев тестирования. Protractor предоставляет удобные средства для выполнения этих проверок.
Основным объектом для взаимодействия с элементами в Protractor
является ElementFinder. Для проверки видимости элемента
используется метод:
isDisplayed()
Пример:
let loginButton = element(by.id('login-btn'));
loginButton.isDisplayed().then(function(visible) {
console.log('Кнопка видима:', visible);
});
Метод isDisplayed() возвращает Promise,
который разрешается в булевое значение:
true — элемент видим;false — элемент невидим.Важно понимать, что невидимый элемент может
существовать в DOM, но быть скрыт с помощью CSS-свойств
(display: none, visibility: hidden,
opacity: 0 и др.) или находиться за пределами видимой
области.
Protractor интегрирован с WebDriver и предоставляет модуль
ExpectedConditions, который позволяет создавать
условия ожидания для элементов. Проверка видимости
часто используется совместно с browser.wait() для
синхронизации тестов.
Пример использования ExpectedConditions:
let EC = protractor.ExpectedConditions;
let submitButton = element(by.css('.submit-btn'));
browser.wait(EC.visibilityOf(submitButton), 5000, 'Кнопка не появилась на странице');
submitButton.click();
Пояснения:
EC.visibilityOf(element) — возвращает функцию, которая
проверяет, что элемент видим;browser.wait(condition, timeout, message) — ожидает
выполнения условия в течение указанного времени. Если условие не
выполняется, выбрасывается ошибка с сообщением.Такой подход позволяет избежать ошибок типа ElementNotVisibleException, возникающих при попытке взаимодействовать с элементом, который существует в DOM, но скрыт.
isPresent() и isDisplayed()Важно различать проверку наличия элемента в DOM и его видимости:
isPresent() проверяет, существует ли элемент в
DOM.isDisplayed() проверяет, видим ли элемент на
странице.Пример различия:
let hiddenInput = element(by.id('hidden-input'));
hiddenInput.isPresent().then(console.log); // true
hiddenInput.isDisplayed().then(console.log); // false
Таким образом, элемент может существовать в DOM, но быть невидимым для пользователя.
Частой практикой является комбинация проверки видимости с проверкой наличия элемента в DOM:
let field = element(by.css('.dynamic-field'));
browser.wait(() => field.isPresent(), 5000)
.then(() => browser.wait(() => field.isDisplayed(), 5000))
.then(() => field.sendKeys('Тестовые данные'));
Такой подход обеспечивает:
Для работы с коллекциями (ElementArrayFinder) проверка
видимости может потребовать фильтрации видимых элементов:
let items = element.all(by.css('.list-item'));
let visibleItems = items.filter(function(elem) {
return elem.isDisplayed();
});
visibleItems.count().then(console.log);
Метод filter возвращает только те элементы коллекции,
которые видимы на странице. Это особенно полезно при
динамически подгружаемых списках и таблицах.
Все методы Protractor, связанные с элементами, возвращают
Promise. Для корректной проверки видимости необходимо
использовать await или .then():
let saveButton = element(by.id('save-btn'));
if (await saveButton.isDisplayed()) {
await saveButton.click();
}
Без правильной обработки асинхронности возможны ложноположительные или ложоотрицательные срабатывания тестов.
Иногда требуется убедиться, что элемент не видим. В Protractor это реализуется с помощью отрицания ExpectedConditions:
let EC = protractor.ExpectedConditions;
let modal = element(by.css('.popup'));
browser.wait(EC.invisibilityOf(modal), 5000, 'Модальное окно не закрылось');
Метод invisibilityOf возвращает true,
если элемент скрыт или отсутствует в DOM.
ExpectedConditions для синхронизации с
динамическим контентом.isPresent() и
isDisplayed() при проверке элементов.filter для выделения видимых
элементов.invisibilityOf для проверки закрытия
модальных окон, скрытых панелей и других элементов интерфейса.Эффективная проверка видимости элементов обеспечивает стабильность тестов, правильную обработку динамического контента и снижает вероятность ошибок, связанных с асинхронным поведением веб-приложений.