В процессе автоматизированного тестирования интерфейсов
веб-приложений с использованием WebdriverIO, разработчики часто
сталкиваются с проблемой работы с элементами, которые находятся за
пределами видимой области страницы или скрыты различными CSS-правилами
(например, через display: none или
visibility: hidden). Это может привести к возникновению
ошибок при попытке взаимодействовать с такими элементами, поскольку они
не отображаются или не доступны для клика.
WebdriverIO, как инструмент для автоматизации браузера, сталкивается с этим вызовом, так как многие из методов работы с элементами требуют, чтобы те были видимыми или активными. Однако существует несколько подходов для эффективного решения этой проблемы.
Элемент скрыт с помощью CSS Веб-страницы могут
использовать различные стили для скрытия элементов, такие как
display: none, visibility: hidden, или
opacity: 0. Эти элементы присутствуют в DOM, но не видимы
на странице, что делает их недоступными для взаимодействия.
Элементы находятся за пределами видимой области В некоторых случаях элемент может быть расположён в части страницы, которая не попадает в область видимости пользователя. Это может случиться, если страница содержит длинные списки или таблицы с прокруткой.
Анимации и динамическое изменение контента Некоторые элементы могут быть скрыты или отображены в процессе выполнения анимации или динамического изменения содержимого. Например, модальные окна, всплывающие подсказки или элементы, которые подгружаются через AJAX.
Элементы в iframes Встроенные фреймы (iframes) могут содержать элементы, с которыми требуется взаимодействовать, но доступ к ним может быть ограничен, если они находятся в другом контексте или домене.
Использование метода
waitForDisplayed Один из самых простых и
эффективных способов убедиться в том, что элемент доступен для
взаимодействия — это использование метода waitForDisplayed.
Этот метод ожидает, пока элемент не станет видимым на странице, что
позволяет избежать попыток взаимодействия с элементами, которые в данный
момент скрыты.
Пример использования:
const button = $('#submit');
button.waitForDisplayed({ timeout: 5000 });
button.click();
В данном примере WebdriverIO будет ожидать, пока кнопка с id
submit не станет видимой, а затем выполнит клик.
Использование метода scrollIntoView
Если элемент находится вне видимой области экрана, его можно прокрутить
в поле зрения с помощью метода scrollIntoView. Этот метод
прокручивает страницу таким образом, чтобы элемент оказался видимым,
после чего с ним можно безопасно взаимодействовать.
Пример:
const element = $('#long-list-item');
element.scrollIntoView();
element.click();
Здесь WebdriverIO прокручивает страницу, чтобы элемент с id
long-list-item оказался в области видимости, а затем
кликает по нему.
Проверка видимости элемента с помощью
isDisplayed Иногда необходимо проверить, доступен
ли элемент для взаимодействия. Для этого можно использовать метод
isDisplayed, который возвращает true, если
элемент видим, и false, если скрыт. Это особенно полезно,
если нужно провести дополнительные проверки перед попыткой
взаимодействия с элементом.
Пример:
const element = $('#popup');
if (element.isDisplayed()) {
element.click();
}
В этом примере WebdriverIO проверяет, что элемент с id
popup отображается, и только после этого выполняет
клик.
Управление анимациями и динамическими элементами
В случае, когда элементы появляются или исчезают с помощью анимаций,
стоит использовать методы, позволяющие убедиться, что анимация
завершена, прежде чем взаимодействовать с элементом. Например, можно
использовать метод waitUntil, который позволяет подождать
до тех пор, пока элемент не достигнет нужного состояния.
Пример:
const modal = $('#modal');
modal.waitUntil(() => modal.isDisplayed(), { timeout: 10000, timeoutMsg: 'Модальное окно не появилось вовремя' });
modal.click();Работа с элементами в iframes Для взаимодействия
с элементами внутри iframe необходимо переключиться в контекст этого
iframe с помощью метода switchToFrame. После того как
переключение завершится, можно взаимодействовать с элементами внутри
фрейма как обычно.
Пример:
const iframe = $('#iframe-id');
browser.switchToFrame(iframe);
const input = $('#input-field');
input.setValue('Test');
В этом примере WebdriverIO переключается в контекст iframe с id
iframe-id, а затем вводит значение в поле с id
input-field.
waitForDisplayed
помогает избежать ошибок при взаимодействии с элементами, которые ещё не
загружены или не видимы.isEnabled,
isClickable могут быть полезны для дальнейшей проверки
состояния элементов.Проблемы с элементами вне видимости — частая и важная часть работы с
WebdriverIO. Существующие методы, такие как
waitForDisplayed, scrollIntoView, и
isDisplayed, помогают эффективно решать эти проблемы и
обеспечивать надежную работу тестов. Важно правильно управлять
ожиданиями и учитывать специфику взаимодействия с динамическими
элементами и iframe, чтобы тесты выполнялись корректно и быстро.