top 10 selenium exceptions
Обробка винятків Selenium WebDriver за допомогою Framework Handling Framework - Підручник селену №19
Отримання винятку в коді автоматизації є дуже поширеним явищем. «Виняток», як вказує слово, є особливим або рідкісним випадком.
Виконання коду автоматизації зазвичай може виконуватися не так, як очікувалося, через багато факторів, що беруть участь у виконанні, таких як проблеми зі стабільністю мережі, проблеми з Інтернетом, стабільність сервера тощо. Ми можемо отримати винятки через недостатній час очікування або неправильні синтаксиси, параметри тощо.
В останньому посібнику з WebDriver ми дізналися про 3 різні типи важливих веб-елементів, таких як Веб-таблиці, кадри та динамічні елементи та механізми їх обробки на сценарії селену
Перш ніж продовжувати роботу з навчальними посібниками з Framework у цьому Тренування селену тут, у цьому посібнику ми дізнаємось про типи винятків та способи обробки винятків у сценаріях Java та Selenium . Розробники / тестувальники використовують систему обробки винятків для обробки винятків у сценаріях селену.
Що ви дізнаєтесь:
- Що таке виняток?
- Переваги та недоліки підходу «Уникайте ручок»
- Типи винятків у Java та Selenium
- Обробка винятків
- Поширені винятки в Selenium WebDriver
- Уникнення та обробка поширених винятків
- # 1) org.openqa.selenium.NoSuchElementException
- # 2) org.openqa.selenium.NoSuchWindowException
- # 3) org.openqa.selenium.NoSuchFrameException
- # 4) org.openqa.selenium.NoAlertPresentException
- # 5) org.openqa.selenium.InvalidSelectorException
- # 6) org.openqa.selenium.ElementNotVisibleException
- # 7) org.openqa.selenium.ElementNotSelectableException
- # 8) org.openqa.selenium.TimeoutException
- # 9) org.openqa.selenium.NoSuchSessionException
- # 10) org.openqa.selenium.StaleElementReferenceException
- Висновок
- Рекомендована література
Що таке виняток?
Виняток становлять події, через які програма Java різко закінчується, не даючи очікуваних результатів. Java забезпечує структуру, в якій користувач може обробляти винятки.
Процес обробки винятків називається обробкою винятків.
Потрібно обробляти винятки, оскільки вони порушують звичайний потік виконання програми. Одним з важливих намірів обробки винятків є запобігання цій перерві та продовження виконання програми. Іноді, можливо, ви захочете виконати ряд дій щодо виникнення певного винятку.
Коли виникає виняток, створюється об’єкт винятку, який технічно називається „ Виняток і додаємо Спробуйте / зловити блоки типу,
try { // Protected code } catch (ExceptionName e) { // Catch block }
# 1) Шматок коду, який може викликати виняток, додається всередину блоку Try.
# два) Оператор Catch ловить виняток і приймає його як параметр.
# 3) Коли не викидається жоден виняток, виконується оператор try, а не оператор catch.
Приклад : Коли сценарій селену виходить з ладу через неправильний локатор, розробник повинен мати можливість зрозуміти причину несправності, і цього можна легко досягти, якщо виняток правильно обробляється в програмі.
З мого досвіду, найкраще намагатися уникати винятків WebDriver, коли це можливо, і ловити справді виняткові випадки. Використовуйте функцію try / catch, щоб обробляти речі, які підуть не так, і вони не піддаються моєму контролю.
Уникай тих, кого я можу зловити інших!
Це найкраща стратегія, яка спрацювала для мене.
Наприклад, розгляньте тестову сторінку, яка завантажує на тестовому сервері більше, ніж зазвичай. Ми будемо часто отримувати винятки, виконуючи дії на цій сторінці. Отже, замість того, щоб просто ловити це щоразу, ми можемо
- Додайте команду очікування та спробуйте уникнути винятку
- Використовуйте функцію «Спробуй / злови» для обробки випадків, якщо трапився справді винятковий випадок
Тим самим зменшуючи шанси на винятки.
Переваги та недоліки підходу «Уникайте ручок»
Переваги | Недоліки |
---|---|
1) Цей підхід зменшує шанси отримати винятки. | 1) Збільшує рядки кодів, оскільки ви додаєте додатковий код, щоб уникнути винятків |
Якщо виняток все ж виявляється, це буде 2) справді винятковим випадком, який варто перевірити | 2) Має краще розуміти API веб-драйверів, команди та винятки |
Скоротіть час налагодження. Код автоматизації призначений для пошуку помилок, і ви не хочете бачити занадто багато небажаних 3) винятків і знаходити причини кожного з них | |
4) У блоці Catch ви маєте справу з більш дійсними справами | |
5) Зменшити помилкові збої | |
6) Більш чіткий звіт |
У цьому підручнику ми обговоримо Уникайте і обробляйте 10 найпоширеніших винятків у Selenium WebDriver. До цього давайте базове розуміння блоків обробки винятків та спроб / лову.
Типи винятків у Java та Selenium
Нижче ми описали типи винятків та різні способи використання механізму обробки винятків у сценаріях селену.
Є три види винятків:
- Позначений виняток
- Невизначений виняток
- Помилка
Ієрархія класів винятків та помилок:
# 1) Перевірений виняток: Перевірений виняток обробляється під час компіляції, і він видає помилку компіляції, якщо він не виявлений та оброблений під час компіляції.
Приклад : FileNotFoundException , IOException тощо
# 2) Невизначений виняток: У випадку неперевіреного винятку компілятор не зобов'язує обробляти. Компілятор ігнорує під час компіляції.
Приклад : ArrayIndexoutOfBoundException
# 3) Помилка: Коли сценарій фатальний, і програма не може відновити, тоді JVM видає помилку. Блок try-catch не може усунути помилки. Навіть якщо користувач намагається обробити помилку за допомогою блоку Спробувати зловити, він не може відновити помилку.
Приклад : Помилка твердження , OutOfMemoryError тощо
Обробка винятків
Спробуй і лови блок:
спробувати-зловити блоки зазвичай використовуються для обробки винятків. Тип винятків оголошується в блоці catch, який очікується. Коли в блоці try з’являється виняток, негайно керування рухається до блоку catch.
Приклад :
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); }
За один блок спроби може бути кілька блоків catch, залежно від типу винятку.
Приклад :
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); } catch(FileNotFoundException file){ file.printStackTrace(); }
кидає Виняток:
кидає Ключове слово в Java використовується для створення винятку, а не обробки. Усі перевірені винятки можна кинути методами.
Приклад :
public static void main(String() args) throws IOException { BufferedReader br=new BufferedReader(new FileReader('Data')); while ((line = br.readLine()) != null) { System.out.println(line); } }
нарешті блок:
нарешті , блок виконується незалежно від виконання блоку try-catch, і він виконується відразу після завершення блоку try / catch.
В основному закриття файлу, підключення до бази даних тощо можна закрити в блоці нарешті.
Приклад :
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); } Finally { br.close(); }
У наведеному вище прикладі BufferReader потік закритий у блоці нарешті. br.close () завжди буде виконуватися незалежно від виконання блоку try and catch.
Примітка : нарешті блок може існувати без блоку catch. Не обов'язково мати блок блокування завжди.
Блоків блокування може бути багато, але можна використовувати лише один кінцевий блок.
Кидальний : Throwable - це батьківський клас для помилок та винятків. Як правило, в Java важко обробляти помилки. Якщо програміст не впевнений у питанні про тип помилки та виняток, радимо використовувати клас Throwable, який може виявити як помилку, так і виняток.
Приклад :
try { br = new BufferedReader(new FileReader('Data')); } catch (Throwable t) { t.printStackTrace(); }
Поширені винятки в Selenium WebDriver
Селен має свій набір винятків. Під час розробки сценаріїв селену програміст повинен обробляти або викидати ці винятки.
Нижче наведено кілька прикладів винятків у селені:
Усі класи винятків виконання в Selenium WebDriver підпадають під суперклас WebDriverException.
Хоча під WebDriverException існує багато класів винятків, ми зазвичай бачимо наведені нижче.
- NoSuchElementException
- NoSuchWindowException
- NoSuchFrameException
- NoAlertPresentException
- InvalidSelectorException
- ElementNotVisibleException
- ElementNotSelectableException
- TimeoutException
- NoSuchSessionException
- StaleElementReferenceException
Деталі :
ElementNotVisibleException : Якщо селен намагається знайти елемент, але елемент не видно на сторінці
NoAlertPresentException : Якщо користувач намагається обробити поле сповіщення, але попередження відсутнє.
NoSuchAttributeException : Під час спроби отримати значення атрибута, але атрибут недоступний у DOM.
NoSuchElementException : Цей виняток пов’язаний із доступом до елемента, який недоступний на сторінці.
WebDriverException : Виняток виникає, коли код не може ініціалізувати WebDriver.
Уникнення та обробка поширених винятків
Давайте обговоримо підхід «Уникай і обробляй» для вищезазначених винятків:
# 1) org.openqa.selenium.NoSuchElementException
Цей найчастіше зустрічається клас винятків є підкласом NotFoundException клас. Виняток виникає, коли WebDriver не може знайти та знайти елементи.
Зазвичай це трапляється, коли тестер пише неправильний локатор елементів у методі findElement (By, by).
Врахуйте, що у наведеному нижче прикладі правильним ідентифікатором для текстового поля було «firstfield», але тестер неправильно вказав його як «fistfield». У цьому випадку WebDriver не може знайти елемент і org.openqa.selenium.NoSuchElementException буде кинуто
driver.findElement(By.id('submit')).click(); Exception Handling: try { driver.findElement(By.id('submit')).click(); } catch (NoSuchElementException e)
У цьому випадку виняток викидається, навіть якщо елемент не завантажений.
Уникнення та поводження : Спробуйте дати команду очікування.
Приклад: Команда очікування нижче очікує 10 секунд на наявність веб-елемента з ідентифікатором „submit”. Потім він намагається клацнути на ньому. Якщо елемент доступний, але клацання все одно не вдається, виявляється виняток.
Використання відкладеного часу є звичайною практикою автоматизації тестів, щоб створити паузу між кроками. Додаючи функцію Try / Catch, ми гарантуємо продовження програми, навіть якщо очікування не допомогло.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.presenceOfElementLocated(By.id('submit'))); try { driver.findElement(By.id('submit')).click(); } catch (WebDriverException e) { System.out.println(“An exceptional case.”); } } catch (TimeOutException e) { System.out.println(“WebDriver couldn’t locate the element”); }
# 2) org.openqa.selenium.NoSuchWindowException
NoSuchWindowException підходить NotFoundException клас. Це виникає, коли WebDriver намагається переключитися на недійсне вікно.
Наведений нижче код може викинути org.openqa.selenium.NoSuchWindowException, якщо дескриптор вікна не існує або недоступний для перемикання.
driver.switchTo (). window (handle_1);
Уникнення та поводження : Ми використовували б ручки вікон, щоб отримати набір активних вікон, а потім виконувати дії над ними.
У наведеному нижче прикладі для кожного дескриптора вікна виконується перемикання драйвера на. Тому шанси передачі неправильного параметра вікна зменшуються.
for (String handle : driver.getWindowHandles()) { try { driver.switchTo().window(handle); } catch (NoSuchWindowException e) { System.out.println(“An exceptional case”); } }
# 3) org.openqa.selenium.NoSuchFrameException
Коли WebDriver намагається переключитися на неприпустимий кадр, викидається NoSuchFrameException у класі NotFoundException.
Наведений нижче код може викинути org.openqa.selenium.NoSuchFrameException, якщо кадр “frame_11” не існує або недоступний.
driver.switchTo (). frame (“frame_11”);
Обробка винятків:
try { driver.switchTo().frame('frame_11'); } catch (NoSuchFrameException e)
У цьому випадку виникає виняток, навіть якщо кадр не завантажений.
Уникнення та поводження : Спробуйте дати команду очікування.
У наведеному нижче прикладі WebDriver чекає 10 секунд, поки кадр стане доступним. Якщо кадр доступний і все ще існує виняток, він потрапляє.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.frameToBeAvaliableAndSwitchToIt(frame_11)); try { driver.switchTo().frame('frame_11'); } catch (WebDriverException e) { System.out.println(“An exceptional case”); } } catch (TimeOutException e) { System.out.println(“WebDriver couldn’t locate the frame”); }
# 4) org.openqa.selenium.NoAlertPresentException
NoAlertPresentException під NotFoundException викидається, коли WebDriver намагається переключитися на попередження, яке недоступне.
org.openqa.selenium.NoAlertPresentException буде викинуто. Якщо нижче код автоматизації викликає операцію accept () для класу Alert (), коли попередження ще немає на екрані.
driver.switchTo (). alert (). accept ();
Обробка винятків:
try { driver.switchTo().alert().accept(); } catch (NoSuchAlertException e)
У цьому випадку виникає виняток, навіть якщо попередження завантажується не повністю.
Уникнення та поводження : Завжди використовуйте явне або плавне очікування певного часу у всіх випадках, коли очікується попередження. Якщо попередження доступне і все ще існує виняток, воно потрапляє.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.alertIsPresent()); try { driver.switchTo().alert().accept(); } catch (NoAlertPresentException e) { System.out.println(“An exceptional case”); } } catch (TimeOutException e) System.out.println(“WebDriver couldn’t locate the Alert”); }
# 5) org.openqa.selenium.InvalidSelectorException
Цей підклас NoSuchElementException клас виникає, коли селектор неправильний або синтаксично невірний. Цей виняток трапляється часто, коли використовується локатор XPATH.
Розглянемо наведений нижче приклад:
clickXPathButtonAndWait (“// кнопка (@ type =’ button ’) (100)”);
Це викличе InvalidSelectorExeption, оскільки синтаксис XPATH неправильний.
Уникнення та поводження : Щоб цього уникнути, слід перевірити використаний локатор, оскільки локатор, ймовірно, неправильний або синтаксис неправильний. Використання Firebug для пошуку xpath може зменшити цей виняток.
Нижче код показує, як з цим працювати, використовуючи функцію Try / Catch
try { clickXPathButtonAndWait('//button(@type='button')'); } catch (InvalidSelectorException e) { }
# 6) org.openqa.selenium.ElementNotVisibleException
ElementNotVisibleException class є підкласом ElementNotInteractableException клас. Цей виняток виникає, коли WebDriver намагається виконати дію над невидимим веб-елементом, з яким неможливо взаємодіяти. Тобто веб-елемент перебуває у прихованому стані.
Наприклад, у наведеному нижче коді, якщо тип кнопки з ідентифікатором 'надіслати' є 'прихованим' у HTML, org.openqa.selenium.ElementNotVisibleException буде кинуто.
driver.findElement(By.id('submit')).click(); Exception Handling: try { driver.findElement(By.id('submit')).click(); } catch (ElementNotVisibleException e)
У цьому випадку виникає виняток, навіть якщо сторінка завантажена не повністю.
Уникнення та поводження : Є два способи зробити це. Ми можемо використовувати очікування, щоб елемент повністю отримав.
Наведений нижче код чекає на елемент 10 секунд. Якщо елемент видно і все-таки викинуто виняток, він ловиться.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions.visibilityOfElementLocated(By.id(”submit”)); try { driver.findElement(By.id('submit')).click(); } catch (WebDriverException e) { System.out.println(“Exceptional case”); } } catch (TimeOutException e) System.out.println(“WebDriver couldn’t find this element visible”); }
# 7) org.openqa.selenium.ElementNotSelectableException
Цей виняток підпадає під InvalidElementStateException клас . ElementNotSelectableException вказує на те, що веб-елемент присутній на веб-сторінці, але його неможливо вибрати.
Наприклад, нижченаведений код може викинути ElementNotSelectableException, якщо ідентифікатор 'швидкий' вимкнений.
Виберіть спадне меню = новий Вибір (driver.findElement (By.id (“швидкий”)));
Обробка винятків:
спробуй {
Виберіть спадне меню = новий Вибір (driver.findElement (By.id (“швидкий”)));
} catch (ElementNotSelectableException e)
У цьому випадку виникає виняток, навіть якщо елемент через деякий час стає ввімкненим.
Уникнення та поводження : Ми можемо додати команду wait, щоб зачекати, поки елемент стане клікабельним. Якщо все-таки є виняток, його ловлять.
try { WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(ExpectedConditions. elementToBeClickable(By.id(”swift”)); try { Select dropdown = new Select(driver.findElement(By.id('swift'))); } catch (WebDriverException e) { System.out.println(“Exceptional case”); } } catch (TimeOutException e) System.out.println(“WebDriver found that this element was not selectable.”); }
# 8) org.openqa.selenium .TimeoutException
Цей виняток виникає, коли завершення команди займає більше часу очікування. Очікування в основному використовується у WebDriver, щоб уникнути винятку ElementNotVisibleException.
Іноді тестова сторінка може не завантажитися повністю перед наступною командою в програмі. Якщо WebDriver намагається знайти елемент на веб-сторінці до того, як сторінка повністю завантажиться, буде вилучено виняток ElementNotVisibleException. Щоб уникнути цього винятку, додаються команди очікування.
Однак, якщо компоненти не завантажуються навіть після очікування, виняток org.openqa.selenium .TimeoutException буде кинуто.
driver.manage (). timeouts (). неявноWait (10, TimeUnit.SECONDS);
driver.get (“https://www.softwaretestinghelp.com”);
У наведеній вище програмі додано неявне очікування 10 секунд. Якщо сторінка www.softwaretestinghelp.com не завантажується за 10 секунд, тоді буде викинуто TimeoutException.
Уникнення та поводження : Щоб цього уникнути, ми можемо вручну перевірити середній час завантаження сторінки та відрегулювати очікування
Або ми можемо додати явне очікування за допомогою виконавця JavaScript, поки сторінка не завантажиться.
У наведеному нижче прикладі використовується виконавець JavaScript. Після навігації сторінкою ми викликаємо JavaScript return document.readyState протягом 20 секунд, доки не буде повернуто “complete”.
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30)); wait.until(webDriver -> ((JavascriptExecutor)webDriver).executeScript('return document.readyState').equals('complete')); driver.get('https://www.softwaretestinghelp.com');
# 9) org.openqa.selenium.NoSuchSessionException
Цей виняток виникає, коли метод викликається після виходу з браузера за допомогою WebDriver.quit (). Це також може статися через проблеми веб-браузера, такі як збої, і WebDriver не може виконати жодну команду за допомогою екземпляра драйвера.
Щоб побачити цей виняток, можна виконати наведений нижче код.
driver.quit ()
Виберіть спадне меню = новий Вибір (driver.findElement (By.id (“швидкий”)));
Уникнення та поводження : Завжди вибирайте останню стабільну версію браузера для запуску тестів Selenium Webdriver.
Цей виняток можна зменшити, використовуючи driver.quit () після завершення всіх тестів. Не намагайтеся використовувати їх після кожного тесту. Це може призвести до проблем, коли екземпляр драйвера є нульовим, а майбутні тестові випадки намагаються використовувати його без ініціалізації.
Наведений нижче код створює екземпляр WebDriver в анотації @BeforeSuite TestiNG і знищує його в анотації @AfterSuite TestiNG
@BeforeSuite public void setUp() throws MalformedURLException { WebDriver driver = new FirefoxDriver(); } @AfterSuite public void testDown() { driver.quit(); }
# 10) org.openqa.selenium.StaleElementReferenceException
Цей виняток говорить про те, що веб-елемент більше не присутній на веб-сторінці.
Ця помилка не те саме, що ElementNotVisibleException.
StaleElementReferenceException викидається, коли об'єкт для певного веб-елемента створювався в програмі без будь-яких проблем, однак; цього елемента більше немає у вікні. Це може статися, якщо був
- Перехід до іншої сторінки
- DOM оновлено
- Перемикач рами або вікна
WebElement firstName = driver.findElement (By.id (“ім'я”));
driver.switchTo (). window (Child_Window);
element.sendKeys (“Аарон”);
У наведеному вище коді створено об'єкт firstName, а потім переключено вікно. Потім WebDriver намагається набрати в полі форми «Аарон». У цьому випадку викидається StaleElementReferenceException.
Уникнення та поводження : Підтвердьте, що ми намагаємось виконати дію у правильному вікні. Щоб уникнути проблем із оновленням DOM, ми можемо використовувати Dynamic Xpath
Давайте обговоримо ще один приклад.
Скажімо, 'ідентифікатор' поля імені користувача 'username_1', і XPath буде // * (@ id = ’firstname_1?) . Коли ви знову відкриваєте сторінку, ідентифікатор може змінитись на ' 'ім'я _11 ’. У цьому випадку тест не вдасться, оскільки WebDriver не зміг знайти елемент. У цьому випадку буде викинуто StaleElementReferenceException.
У цьому випадку ми можемо використовувати динамічний xpath, наприклад,
try { driver.findElement(By.xpath(“//*(contains(@id,firstname’))”)).sendKeys(“Aaron”); } catch (StaleElementReferenceException e)
У наведеному вище прикладі використовується динамічний XPATH, і якщо виняток все-таки знайдено, він ловиться.
Висновок
Обробка винятків є важливою частиною кожної програми Java, а також сценарію селену. Ми можемо створити надійний і оптимальний код за допомогою обробка винятку розумними способами . І це також найкраща практика для обробки винятків у сценарії, який дасть вам кращий звіт, коли програма не працює з будь-якої причини.
Тут ми спробували висвітлити процес та основи обробки винятків, які потрібно впровадити в сценарії селену.
c ++ порівняно з java
Пам'ятайте, що не обов'язково завжди обробляти винятки в спробувати-зловити блок. Ви також можете створити виняток залежно від вимоги сценарію.
Не слід ігнорувати виняток, оскільки вони порушують виконання програми. У цьому посібнику ми пройшли різні винятки та способи зменшення шансів отримати їх за допомогою ручних перевірок та кодів.
Додавання очікування може контролювати деякі випадки, такі як „NoSuchElementException“, „ElementNotFoundException“, „ElementNotVisibleException“.
Наступний підручник No20 : У наступному уроці ми обговоримо доступні різні типи рамок тестування . Ми також вивчимо плюси і мінуси використання повноцінного фреймворкового підходу в тестуванні автоматизації. Ми б детально обговорили тестову структуру, керовану даними.
Будь ласка, опублікуйте свої запити, пов’язані з обробкою винятків у Selenium WebDriver, якщо вони є.
Рекомендована література
- Винятки Java та обробка винятків з прикладами
- Як обробляти сповіщення / спливаючі вікна в Selenium WebDriver - Підручник з селену No16
- Підручник з AutoIt - Автозавантаження, встановлення та базовий сценарій AutoIt
- Підручник з огірка селену: інтеграція огірка Java Selenium WebDriver
- Інтеграція селену з JMeter
- Вступ до Selenium WebDriver - Підручник з селену №8
- 30+ найкращих підручників із селену: вивчіть селен на реальних прикладах
- Можливість сумісництва для експертів із селену