Ошибки в Selenium — гайд по exceptions

Самые частые exceptions в Selenium и способы устранения

Для начала, в чем разница между error и exception в Selenium?

  • Ошибки типа error — более серьезная вещь, возникают в тестовом окружении, и достаточно трудны для исправления (по крайней мере для новичка в QA)
  • Ошибки типа exception возникают в тестируемом приложении (AuT), и легко могут быть откорректированы тестировщиком, чему и посвящен данный материал.

3 самых частых exceptions в Selenium

Ошибка StaleElementReferenceException

Возможно, самый распространенный “эксепшен” у тестировщиков в Selenium (по крайней мере, о нем часто спрашивают на собеседованиях). Это сообщение означает, что веб-элемент по какой-то причине уже как бы “откреплен” от текущего DOM — сначала был в DOM, но после изменений в DOM он:

  • Был удален (реже)
  • “Завис” и теперь недоступен для действий с ним (чаще)

Причины ошибки StaleElementReferenceException

  • Веб-элемента нет в текущем состоянии DOM.
  • Веб-элемент удален из DOM. 

Почему так случилось? 

  • После перезагрузки страницы (Page Refresh)
  • Или выхода пользователя из страницы
  • Или веб-элемент по какой-то причине заменен на другой, с идентичными атрибутами

Как обработать ошибку StaleElementReferenceException

  • Обновить страницу, и теперь проверить веб-элемент. (Не рекомендуется, если при перезагрузке стираются сессионные данные / введенные пользователем данные)
  • Для проверки элемента воспользоваться интерфейсом JavaScriptExecutor
  • Имплементировать конструкцию try-catch, то есть “ловить” элемент блоком catch
  • Применить эксплицитное ожидание (explicit wait) — то есть ожидать появления элемента
  • Попытаться применить Dynamic XPath для обработки DOM-операций
  • Попытаться работать через Page Factory Model

Ошибка NoSuchElementException

WebDriver не может найти локальный элемент, то есть через метод FindBy кажется нельзя найти этот элемент.

Причины ошибки NoSuchElementException

  • Банальная причина: неправильно прописан локатор в методе findElement(by)
  • Имя элемента изменено разработчиком
  • Позиция элемента изменилась (если ищут локатором XPath)
  • Время загрузки элемента прописано слишком большое

Как устранить причину NoSuchElementException

  • “Пофиксить” некорректный локатор
  • Или добавить wait-команду
  • Или добавить блок try-catch, и/или эксплицитное ожидание элемента

Ошибка ElementClickInterceptedException

Невозможно выполнить команду, из-за того что элемент, “получающий” событие, скрывает за собой запрашиваемый элемент.

Причины ошибки ElementClickInterceptedException

  • Элементы “перекрываются” между собой
  • Один из элементов не загрузился как положено
  • Один из элементов отключен (disabled)
  • Элемент не в фокусе
  • Действие с некорректным веб-элементом
  • Этот элемент нельзя искать на странице по его координатам

Как устранить ElementClickInterceptedException

  • Добавить wait-ожидание пока элемент не будет доступен
  • Применить JavascriptExecutor для операции клика
  • Если элемент “некликабельный”, найти и закрыть “накрывающий” элемент (находящийся сверху нужного нам)
  • Если элементу нужен фокус, перейти на активный элемент и выполнить клик, используя класс Action.
  • Если для идентификации элемента используются координаты, попробовать сначала развернуть окно в полностью развернутое состояние.
Выше речь шла о самых распространенных “эксепшенах”, возникающих у тестировщиков в Selenium. Далее - о менее распространенных, поэтому о них чуть менее подробно.

NoSuchWindowException

Достаточно частая ошибка в Selenium WebDriver, когда текущий список окон некорректно обновился — предыдущего окна не существует, значит нельзя переключиться на него.

Решение: через метод WebDriver’а, driver.getWindowHandles().

NoSuchFrameException

Возникает аналогично предыдущему (NoSuchWindowException) — при переключении между фреймами один из них становится недоступен.

Решение: как в предыдущем примере.

NoAlertPresentException

Пользователь пытается перейти к еще несуществующему “алерту”. Такое бывает, когда тест “слишком быстрый”. Тест пытается найти “алерт”, который еще не открыт браузером.

Решение: чтобы избежать этой ошибки, или предотвратить ее, применяется эксплицитное или быстрое ожидание (explicit wait, fluent wait), желательно во всех случаях с alert’ами.

InvalidSelectorException

Некорректный селектор. В 99% случаев неправильно написано имя.

Решение: внимательность.

TimeoutException

Операция не выполнилась (не завершилась) в нужное время. 

Ожидания (waits) грамотно применяются опытными тестировщиками во избежание частой ошибки №2, NoSuchElementException, однако если элементы страницы не загрузились в прописанное wait-время, будет “выброшена” ошибка timeoutException.

Решение: тривиальное — узнать (оценить) среднее время загрузки страницы и “подобрать” к нему подходящее wait-время.

ElementNotVisibleException

WebDriver пытается найти элемент, по какой-то причине “заслоненный” другим, или в состоянии “невидимый”. 

Решение: узнать причину “невидимости” — это или проблема с вложенными элементами (и тогда найти и исправить проблемный элемент), или с “перекрытием элементов по времени” (и значит применить эксплицитное wait-ожидание).

ElementNotSelectableException

Этот exception относится к тому же типу, что InvalidElementStateException — элемент хотя и есть на странице, но выбран (отмечен, кликнут) быть не может.

Решение: грамотное применение wait-ожидания.

NoSuchSessionException

Такая ошибка “выбрасывается”, когда метод вызван уже после закрытия браузера — после того как браузер закрылся “самопроизвольно” в результате неожиданного сбоя.

Решение: браузер должен регулярно обновляться, и быть в стабильной версии.

Какой была ваша первая зарплата в QA и как вы искали первую работу?

Мега обсуждение в нашем телеграм-канале о поиске первой работы. Обмен опытом и мнения.

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Мы в Telegram

Наш официальный канал
Полезные материалы и тесты
Готовимся к собеседованию
Project- и Product-менеджмент

? Популярное

? Telegram-обсуждения

Наши подписчики обсуждают, как искали первую работу в QA. Некоторые ищут ее прямо сейчас.
Наши подписчики рассказывают о том, как не бояться задавать тупые вопросы и чувствовать себя уверенно в новой команде.
Обсуждаем, куда лучше податься - в менеджмент или по технической ветке?
Говорим о конфликтных ситуациях в команде и о том, как их избежать
$1100*
медианная зарплата в QA в июне 2023

*по результатам опроса QA-инженеров в нашем телеграм-канале

Собеседование

19%*
IT-специалистов переехало или приняло решение о переезде из России по состоянию на конец марта 2022

*по результатам опроса в нашем телеграм-канале

live

Обсуждают сейчас