Обработка на изключения в Selenium Webdriver (типове)

⚡ Умно обобщение

Обработка на изключения 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 и накрая

Какво е изключение?

Изключението е грешка, която възниква по време на изпълнението на програма. Докато програмата работи, езикът за програмиране генерира изключение, което трябва да бъде обработено, в противен случай програмата се срива.

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

Видове изключения в Selenium уебдрайвер

WebDriverException е базовият клас на йерархията и всяко изключение по-долу наследява от него. Таблицата изброява всички 41 изключения, които може да срещнете, заедно с условието, което поражда всяко от тях.

# изключение Когато се случи
1 ElementNotVisibleException Съществуващ елемент в DOM има набор от функции, които са скрити.
2 Изключението „Не е избрано“ на елемента Елементът е в DOM, но не може да бъде избран, така че взаимодействието е невъзможно.
3 NoSuchElementException Елементът не можа да бъде намерен с локатор доставен.
4 NoSuchFrameException - рамка Целта, към която да се превключи, не съществува.
5 NoAlertPresentException Преминаване към сигнализира работи, когато не е подадено предупреждение.
6 NoSuchWindowException Целевият прозорец, към който да се превключи, не съществува.
7 Изключение за препратка към стар елемент Уеб елементът е отделен от текущия DOM.
8 Изключение на SessionNotFoundException WebDriver действа след като затворите браузъра.
9 TimeoutException Команда не е завършена навреме — например, търсеният елемент не е намерен в рамките на чакането.
10 WebDriverException Базов клас на другите изключения на WebDriver; също се повдига, когато WebDriver действа веднага след затваряне на браузъра.
11 Изключение за затворена връзка Има прекъсване на връзката в драйвера.
12 Изключението за прекъснато кликване на елемента Елементът, който получава събитията, скрива елемента, поискан за кликването.
13 Изключението „Не е интерактивно за елемента“ Елементът присъства в DOM, но е невъзможно да се взаимодейства с него.
14 Изключение при грешка в отговор Нещо се е объркало при взаимодействието с Firefox разширение или отдалечения сървър на драйвери.
15 ErrorHandler.UnknownServerException Използва се като заместител, когато сървърът върне грешка без стек trace.
16 Изключение за неуспешна активация на име Активирането на IME двигателя е неуспешно.
17 Изключението „Не е налично“ за Ime Поддръжката на IME не е налична.
18 Изключение за несигурен сертификат Навигацията накара потребителския агент да стигне до предупреждение за сертификат, което може да бъде причинено от невалиден или изтекъл TLS сертификат.
19 Изключение за невалиден аргумент Аргументът не принадлежи към очаквания тип.
20 Изключение за InvalidCookieDomain A курабийка се добавя под различен домейн, вместо под текущия URL.
21 Изключение за невалидни координати Съвпадащата взаимодействаща операция не е валидна.
22 Изключение за състоянието на невалиден елемент Командата не може да бъде завършена, защото елементът е невалиден.
23 Изключение за невалиден идентификатор на сесия Даденият идентификатор на сесия не е сред активните сесии, така че не съществува или е неактивен.
24 НевалиденПревключвателКъмTargetизключение Целта на рамката или прозореца, към която да се превключи, не съществува.
25 Javascriptизключение Възникна грешка при изпълнението JavaСкрипт, даден от потребителя.
26 JsonException Сесията се заявява, когато не е създадена.
27 NoSuchAttributeException Атрибутът на елемент не можа да бъде намерен.
28 ДвижениеTargetИзключение извън границите Целта, предоставена на метода ActionChains move(), е невалидна — например, извън документа.
29 NoSuchContextException ContextAware, който извършва тестване на мобилни устройства, не може да намери заявения контекст.
30 NoSuchCookieException Сред „бисквитките“ на текущо разглеждания документ не е намерена „бисквитка“, съответстваща на даденото име на пътя.
31 Не е намерено изключение Подклас на WebDriverException, който се генерира, когато даден елемент в DOM не съществува.
32 Изключение на RemoteDriverServer Сървърът не отговаря, защото описаните възможности не са правилни.
33 Изключение на екрана Не е възможно да заснемете екран.
34 Изключението SessionNotCreatedException Нова сесия не можа да бъде създадена успешно.
35 Изключението „Не е възможно да се зададе бисквитка“ Шофьорът не може да зададе „бисквитка“.
36 Неочаквано изключение за име на етикет Клас за поддръжка не получи уеб елемент, както се очакваше.
37 Необработено изключение за предупреждение Има предупреждение, но WebDriver не е в състояние да извърши операцията по предупреждението.
38 Изключение за неочаквано предупреждение Появява се неочаквано предупреждение.
39 Изключение за неизвестен метод Заявената команда съвпада с известна URL но не е метод за това конкретно URL.
40 UnreachableBrowserException Браузърът не може да се отвори или по някаква причина се е сринал.
41 Неподдържано изключение за команда Отдалеченият WebDriver не изпраща валидни команди, както се очаква.

Три доминират ежедневното отстраняване на грешки: NoSuchElementException означава грешка XPath или елемент, който не е рендиран, TimeoutException означава, че чакането е твърде кратко за AJAX отговор, а StaleElementReferenceException следва динамичен повторно рендериране.

Как да се обработват изключения в Selenium

Ето стандартните конструкции за обработка на изключения в Selenium WebDriver. Всеки е обикновен Java, така че работи във всеки Скрипт за уеб драйвер без допълнителни библиотеки.

Стъпка 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 много по-надеждно от по-дълъг sleep цикъл.

Те го намаляват рязко, но никога не го премахват. Изричното изчакване решава само проблеми с времето - грешен локатор, прехванато кликване или затворена сесия все още повдига изключение, което нищо друго освен catch блок не може да абсорбира.

Selenium 4 запазва същата йерархия, но конструкторите на изчакване вече приемат Duration вместо цяло число за изчакване, а по-строгата проверка на аргументите на W3C означава, че InvalidArgumentException се появява за стойности, които Selenium 3 приети без оплаквания.

Самовъзстановяващи се двигатели за локация track, които селектори се чупят и разменят в работеща алтернатива, което премахва голям дял от грешките NoSuchElementException. Подобни модели клъстерират повтарящ се стек tracтака че наистина нов дефект да не бъде заровен сред нестабилни повторения.

Copilot е силен по отношение на шаблонните елементи — скелет на try-catch, верига от catch-ове в правилния ред и finally блок, който затваря драйвера. Не може да знае кои изключения хвърля вашето собствено приложение, така че преглеждайте всеки генериран catch.

Те го допълват. ITestListener централизира регистрирането и екранните снимки за всеки неуспешен тест, което поддържа тестовото тяло чисто. Използвайте try-catch само когато скриптът трябва да продължи след грешката, а не просто да я докладва.

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

Обобщете тази публикация с: