Обробка винятків у Selenium Веб-драйвер (типи)

⚡ Розумний підсумок

Обробка винятків у Selenium WebDriver запобігає зупинці команди, що не вдаласяping цілий тестовий пробіг. Java try-catch, кілька блоків catch, throw, throws і, нарешті, кожен з них надає скрипту різний спосіб відновлення.

  • 🔘 Визначення: Виняток – це помилка, що виникає під час виконання програми, а необроблена помилка призводить до аварійного завершення роботи.
  • ☑️ Сфера застосування: Selenium WebDriver постачає понад сорок класів винятків, і кожен з них походить від WebDriverException.
  • Часті правопорушники: Винятки NoSuchElementException, TimeoutException, StaleElementReferenceException та ElementNotInteractableException спричиняють більшість реальних збоїв.
  • 🧪 Обробка: Пара try-catch ізолює один тип помилки, кілька блоків catch розділяють кілька, і нарешті завжди виконується.
  • 🛠️ Ескалація: Ключові слова throw та throws передають виняток назад викликаючій метці, коли поточний метод не може його вирішити.
  • 📊 діагноз: printStackTrace(), toString() та getMessage() повідомляють про помилку з різним рівнем деталізації.

Обробка винятків у Selenium WebDriver з try-catch, throw та finally

Що таке виняток?

Виняток – це помилка, яка виникає під час виконання програми. Під час роботи програми мова програмування генерує виняток, який необхідно обробити, інакше програма аварійно завершує роботу.

Виняток вказує на те, що, хоча подія може статися, цей тип події трапляється рідко. Коли метод не може обробити виняток, він викидається до функції, що його викликає. Java, що керує більшістю Selenium У пакетах кожен виняток WebDriver не перевіряється, тому компілятор ніколи не змушує вас перехоплювати його — необроблена помилка виникає лише під час виконання.

Типи винятків у Selenium веб-драйвер

WebDriverException – це базовий клас ієрархії, і кожен виняток нижче успадковується від нього. У таблиці перелічено всі 41 виняток, які ви можете зустріти, разом з умовою, яка викликає кожен з них.

# Виняток Коли це відбувається
1 ElementNotVisibleException Існуючий елемент у DOM має набір функцій, що є прихованим.
2 Виняток ElementNotSelectableException Елемент знаходиться в DOM, але його не можна вибрати, тому взаємодія неможлива.
3 NoSuchElementException Елемент не вдалося знайти за допомогою локатор постачається.
4 NoSuchFrameException Команда кадр ціль, на яку потрібно переключитися, не існує.
5 NoAlertPresentException Перехід до попередження працює, коли немає сповіщення.
6 NoSuchWindowException Цільове вікно, на яке потрібно переключитися, не існує.
7 Виняток StaleElementReferenceException Веб-елемент відокремлено від поточного DOM.
8 Виняток SessionNotFoundException WebDriver починає діяти після закриття браузера.
9 TimeoutException Команда не була виконана вчасно — наприклад, елемент, який шукали, не був знайдений протягом часу очікування.
10 WebDriverException Базовий клас інших винятків WebDriver; також викликається, коли WebDriver діє одразу після закриття браузера.
11 Виняток ConnectionClosedException У драйвері є обрив зв'язку.
12 Виняток перехоплення кліку елемента Елемент, який отримує події, приховує елемент, запитуваний для кліку.
13 Виняток ElementNotInteractableException Елемент присутній у DOM, але взаємодіяти з ним неможливо.
14 Виняток ErrorInResponse Щось не вдалося під час взаємодії з Firefox розширення або сервер віддаленого драйвера.
15 ErrorHandler.UnknownServerException Використовується як заповнювач, коли сервер повертає помилку без стеку trace.
16 Виняток «Невдала активація імені» Не вдалося активувати механізм IME.
17 Виняток ImeNotAvailableException Підтримка редактора IME недоступна.
18 Виняток небезпеки сертифіката Навігація призвела до того, що користувацький агент натрапив на попередження сертифіката, що може бути спричинено недійсним або простроченим сертифікатом TLS.
19 Виняток InvalidArgumentException Аргумент не належить до очікуваного типу.
20 Виняток InvalidCookieDomainException A cookie додається під іншим доменом замість поточного URL.
21 Виняток InvalidCoordinates Зіставлена ​​взаємодіюча операція недійсна.
22 Виняток стану недійсного елемента Команду неможливо завершити, оскільки елемент недійсний.
23 Виняток InvalidSessionId Вказаний ідентифікатор сеансу не входить до числа активних сеансів, тому він не існує або є неактивним.
24 Недійсний перемикачTargetВиняток Цільовий кадр або вікно, на яке потрібно переключитися, не існує.
25 JavascriptВиняток Під час виконання виникла помилка JavaСкрипт, наданий користувачем.
26 JsonException Сеанс запитується, коли сеанс не створено.
27 Виняток NoSuchAttributeException Атрибут елемента не знайдено.
28 РухатисяTargetВиняток OutOfBoundsException Ціль, надана методу ActionChains move(), недійсна — наприклад, поза документом.
29 NoSuchContextException ContextAware, який виконує тестування мобільних пристроїв, не може знайти запитуваний контекст.
30 NoSuchCookieException Серед файлів cookie документа, що наразі переглядається, не знайдено жодного файлу cookie, що відповідає вказаному шляху.
31 Виняток NotFoundException Підклас WebDriverException, що виникає, коли елемент у DOM не існує.
32 Виняток сервера віддаленого драйвера Сервер не відповідає, оскільки описані можливості неналежні.
33 Виняток екрана Неможливо захопити екран.
34 Виняток SessionNotCreatedException Не вдалося успішно створити новий сеанс.
35 Виняток UnableToSetCookieException Водій не може встановити файл cookie.
36 Неочікуваний виняток назви тегу Клас підтримки не отримав веб-елемент належним чином.
37 Необроблений виняток сповіщення Сповіщення є, але WebDriver не може виконати операцію сповіщення.
38 Неочікуваний виняток сповіщення про присутність З'являється неочікуване сповіщення.
39 Виняток невідомого методу Запитана команда відповідає відомому URL але не метод для цього конкретного URL.
40 Виняток недоступного браузера Браузер не вдається відкрити, або з якоїсь причини стався збій.
41 Непідтримуваний виняток команди Віддалений веб-драйвер не надсилає коректні команди належним чином.

Три домінують у щоденному налагодженні: NoSuchElementException означає помилку XPath або елемент, який не відобразився, TimeoutException означає занадто коротке очікування для AJAX відповідь, а StaleElementReferenceException йде за динамічний повторно відрендерити.

Як обробляти винятки в Selenium

Ось стандартні конструкції для обробки винятків у Selenium WebDriver. Кожен з них простий Java, тому це працює в будь-якому Скрипт WebDriver без додаткових бібліотек.

Крок 1) Спроба-злов

Цей метод може перехоплювати винятки, використовуючи комбінацію ключових слів try та catch. Команда try позначає початок блоку, а catch розміщується в кінці блоку try, де вона вирішує виняток.

try
{
// Code
} catch (Exception e) {
// Code for Handling exception
}

Крок 2) Кілька блоків захоплення

Існують різні типи винятків, і один блок коду може викликати більше одного. Кілька блоків catch дозволяють обробляти кожен тип окремо за допомогою власного коду. Ви можете використовувати більше двох блоків catch, і немає обмежень на те, скільки ви можете додати.

try
{
//Code
} catch (ExceptionType1 e1) {
//Code for Handling Exception 1
} catch (ExceptionType2 e2) {
//Code for Handling Exception 2
}

Крок 3) Киньте

Коли потрібно згенерувати виняток, ключове слово throw передає його на обробку під час виконання. Використовуйте throw, коли передаєте виняток далі, замість того, щоб вирішувати його в поточному методі.

public static void anyFunction() throws Exception{

try {
// write your code here
} catch (Exception b) {
// Do whatever you want to perform 
// Throw the Exception back to the system
throw(b);
}
}

Крок 4) Кілька винятків

Ви можете згадати різні винятки в реченні throws.

public static void anyFunction() throws ExceptionType1, ExceptionType2{

try {
// write your code here
} catch (ExceptionType1 e1) {
// Code to handle exception 1
} catch (ExceptionType2 e2) {
// Code to handle exception 2
}

Крок 5) Нарешті

Ключове слово finally створює блок під блоком try. Він виконується незалежно від того, чи виник виняток, що робить його правильним місцем для закриття драйвера або звільнення дескриптора файлу.

try {
//Code
} catch (ExceptionType1 e1) {
//Catch block
} catch (ExceptionType2 e2) {
//Catch block
} catch (ExceptionType3 e3) {
//Catch block
} finally {
//The finally block always executes.
}

Методи відображення інформації про винятки

Після перехоплення винятку об'єкт сам містить діагностичні деталі. Ви можете використовувати такі методи для їх відображення:

Метод Про що повідомляється
printStackTracе() Друкує стек tracе., назва винятку та інші корисні описи.
toString () Повертає текстове повідомлення з описом назви та опису винятку.
getMessage() Відображає опис винятку окремо.

Поєднайте це зі скріншотом, зробленим усередині блоку catch, і невдалий запуск покаже як те, що зламалося, так і як виглядала сторінка.

Поширені запитання

Кожен виняток WebDriver не перевіряється, оскільки всі вони розширюють RuntimeException через WebDriverException. Тому компілятор ніколи не вимагає try-catch, що зручно, але це також означає, що помилка незахищеного локатора з'являється лише під час фактичного виконання тесту.

Перемістіть елемент безпосередньо перед тим, як виконувати з ним дії, замість того, щоб кешувати посилання. Короткий цикл повторної спроби, який ігнорує виняток і знову отримує вузол, обробляє повторні рендери React або Vue набагато надійніше, ніж довший цикл сну.

Вони різко зменшують його, але ніколи не видаляють. Явне очікування вирішує лише проблеми з часом — неправильний локатор, перехоплене клацання або закритий сеанс все одно викликають виняток, який ніщо, крім блоку catch, не може поглинути.

Selenium 4 зберігає ту саму ієрархію, але конструктори очікування тепер приймають значення Duration замість цілочисельного таймауту, а суворіша перевірка аргументів W3C означає, що InvalidArgumentException виникає для значень, які Selenium 3 прийнято без скарг.

Самовідновлювальні двигуни локатора track, які селектори ламаються та міняються місцями в робочій альтернативі, що усуває значну частку збоїв NoSuchElementException. Подібні моделі кластерують повторюваний стек tracщоб справді новий дефект не був похований серед ненадійних повторів.

Copilot сильний у плані шаблонів — скелет try-catch, ланцюжок catch у правильному порядку, блок finally, який завершує роботу драйвера. Він не може знати, які винятки викидає ваша власна програма, тому переглядайте кожен згенерований catch.

Вони доповнюють його. ITestListener централізує логування та скріншоти для будь-якого тесту, який не пройшов, що підтримує чистоту тіла тесту. Використовуйте try-catch лише там, де скрипт має продовжувати роботу після помилки, а не просто повідомляти про неї.

Передайте драйвер до TakesScreenshot всередині блоку catch або finally та запишіть файл перед закриттям сеансу. Надання зображення імені тестовому методу робить невдалий запуск CI читабельним без локального відтворення помилки.

Підсумуйте цей пост за допомогою: