Самые частые exceptions в Selenium и способы устранения
- NoSuchWindowException
- NoSuchFrameException
- NoAlertPresentException
- InvalidSelectorException
- TimeoutException
- ElementNotVisibleException
- ElementNotSelectableException
- NoSuchSessionException
Для начала, в чем разница между 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
Такая ошибка “выбрасывается”, когда метод вызван уже после закрытия браузера — после того как браузер закрылся “самопроизвольно” в результате неожиданного сбоя.
Решение: браузер должен регулярно обновляться, и быть в стабильной версии.