top 10 selenium exceptions
Обработка на изключенията на Selenium WebDriver с помощта на Framework за обработка на изключения - Селен Урок # 19
Получаването на изключение в кода за автоматизация е много често. „Изключение“, както показва думата, е специален или необичаен случай.
Изпълнението на кода за автоматизация обикновено може да не се извърши според очакванията поради много фактори, участващи в изпълнението, като проблеми със стабилността на мрежата, проблеми с интернет, стабилност на сървъра и т.н.
как да извикам метод, използващ масив от обекти в java
В последния урок за WebDriver научихме за 3 различни типа важни уеб елементи като Уеб таблици, рамки и динамични елементи и механизмите им за обработка в скрипт за селен
Преди да продължите напред с Framework уроци в това Трениране на селен серия, тук в този урок ще научим за видове изключения и как да се справя с изключенията в Java и Selenium скриптове . Разработчиците / тестерите използват рамка за обработка на изключения, за да се справят с изключение в скриптове за селен.
Какво ще научите:
- Какво е изключение?
- Предимства и недостатъци на подхода Avoid-Handle
- Видове изключения в 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, за да се справите с неща, които се объркват и са извън моя контрол.
Избягвайте тези, които мога да хвана други!
Това е най-добрата стратегия, която е работила при мен.
Например, помислете за тестова страница, която отнема повече от обикновено време за зареждане на тестов сървър. Ще получаваме чести изключения, докато правим действия на тази страница. Така че, вместо просто да хващаме това всеки път, можем
- Добавете команда за изчакване и се опитайте да избегнете изключение
- Използвайте „Опит / улов“, за да се справите в случай, че е възникнал наистина изключителен случай
По този начин намаляват шансовете за изключения.
Предимства и недостатъци на подхода Avoid-Handle
Предимства | Недостатъци |
---|---|
1) Този подход намалява шансовете за получаване на изключения. | 1) Увеличава редовете кодове, защото добавяте допълнителен код, за да избегнете изключения |
Ако все пак се намери изключение, то 2) ще бъде наистина изключителен случай, който си струва да се провери | 2) Трябва да има по-добро разбиране за API на уеб драйвери, команди и изключения |
Намалете времето за отстраняване на грешки. Кодът за автоматизация е предназначен за намиране на грешки и не искате да виждате твърде много нежелани 3) изключения и да намерите причините зад всяка от тях | |
4) В блока Catch се справяте с по-валидни случаи | |
5) Намалете фалшивите откази | |
6) По-ясен доклад |
В този урок ще обсъдим Избягвайте и дръжте подход за 10-те най-често срещани изключения в Selenium WebDriver. Преди това нека да разберем основно блокове за обработка на изключения и опит / улавяне.
Видове изключения в Java и Selenium
По-долу сме описали видовете изключения и различните начини как можем да използваме рамката за обработка на изключения в скриптове за селен.
Има три вида изключения:
- Проверено изключение
- Непроверено изключение
- Грешка
Йерархията на класовете на изключение и грешка:
# 1) Проверено изключение: Провереното изключение се обработва по време на компилацията и дава грешка при компилацията, ако не е уловено и обработено по време на компилацията.
Пример : FileNotFoundException , IOException и т.н.
# 2) Непроверено изключение: В случай на непроверено изключение, компилаторът не е задължен да обработва. Компилаторът игнорира по време на компилацията.
Пример : ArrayIndexoutOfBoundException
# 3) Грешка: Когато даден сценарий е фатален и програмата не може да се възстанови, JVM извежда грешка. Блокът try-catch не може да се справя с грешки. Дори ако потребителят се опита да се справи с грешката с помощта на Try catch block, той не може да се възстанови от грешката.
Пример : Грешка в твърдението , OutOfMemoryError и т.н.
Обработка на изключения
Опитайте и уловете блок:
опитай да хванеш блоковете обикновено се използват за обработка на изключения. Тип изключения се декларира в уловния блок, който се очаква да дойде. Когато в блока за опит се появи изключение, незабавно контролът се премества, за да улови блок
Пример :
try { br = new BufferedReader(new FileReader('Data')); } catch(IOException ie) { ie.printStackTrace(); }
Може да има множество блокиращи блокове за един опитен блок в зависимост от вида на изключението.
Пример :
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.
Забележка : окончателно блокът може да съществува без никакъв блок за улов. Не е необходимо винаги да има блок за хващане.
Може да има много блокиращи блокове, но може да се използва само един окончателен блок.
Хвърляне : 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 =’ бутон ’] [100]“);
Това би хвърлило InvalidSelectorExeption, защото синтаксисът на XPATH е неправилен.
Избягване и боравене : За да избегнем това, трябва да проверим използвания локатор, защото локаторът вероятно е неправилен или синтаксисът е грешен. Използването на Firebug за намиране на xpath може да намали това изключение.
По-долу кодът показва как да се справите с него чрез Try / Catch
try { clickXPathButtonAndWait('//button[@type='button']'); } catch (InvalidSelectorException e) { }
# 6) org.openqa.selenium.ElementNotVisibleException
ElementNotVisibleException class е подклас на ElementNotInteractableException клас. Това изключение се изхвърля, когато WebDriver се опитва да извърши действие върху невидим уеб елемент, с който не може да се взаимодейства. Тоест уеб елементът е в скрито състояние.
Например, в кода по-долу, ако типът бутон с идентификатор 'submit' е „скрит“ в 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 („бърз”)));
Обработка на изключения:
уебсайтове за конвертиране на видеоклипове в YouTube в mp3
опитвам {
Изберете падащото меню = ново Избиране (driver.findElement (By.id („бърз”)));
} catch (ElementNotSelectableException e)
В този случай се хвърля изключение, дори ако елементът се активира след известно време.
Избягване и боравене : Можем да добавим команда за изчакване, за да изчакаме, докато елементът стане кликващ. Ако все пак има изключение, то се улавя.
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 (). implicitlyWait (10, TimeUnit.SECONDS);
driver.get („https://www.softwaretestinghelp.com“);
В горната програма се добавя неявно изчакване от 10 секунди. Ако страницата www.softwaretestinghelp.com не се зарежда за 10 секунди, тогава TimeoutException ще бъде хвърлен.
Избягване и боравене : За да избегнем това, можем ръчно да проверим средното време за зареждане на страница и да коригираме чакането
Или можем да добавим изрично изчакване с помощта на изпълнител на JavaScript, докато страницата се зареди.
В примера по-долу се използва изпълнител на JavaScript. След навигация на страницата извикваме JavaScript return return.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 („firstname“));
driver.switchTo (). window (Child_Window);
element.sendKeys („Аарон“);
В горния код беше създаден обект firstName и след това прозорецът беше превключен. След това WebDriver се опитва да напише „Aaron“ в полето на формуляра. В този случай се изхвърля StaleElementReferenceException.
Избягване и боравене : Потвърдете, че се опитваме да извършим действието в правилния прозорец. За да избегнем проблеми поради DOM опресняване, можем да използваме Dynamic Xpath
Нека обсъдим друг пример.
Кажете „id“ на полето за потребителско име е „username_1“ и XPath ще бъде // * [@ id = ’firstname_1?] . Когато отворите страницата отново, ‘id’ може да се промени да каже на ‘ 'първо име _11 ’. В този случай тестът ще се провали, тъй като WebDriver не можа да намери елемента. В този случай StaleElementReferenceException ще бъде хвърлен.
В този случай можем да използваме динамичен xpath като,
try { driver.findElement(By.xpath(“//*[contains(@id,firstname’)]”)).sendKeys(“Aaron”); } catch (StaleElementReferenceException e)
В примера по-горе се използва динамичен XPATH и ако изключението все още бъде намерено, то се улавя.
Заключение
Обработката на изключения е съществената част на всяка java програма, както и селен скрипт. Можем да изградим надежден и оптимален код от обработка на изключение по интелигентни начини . Освен това е най-добрата практика да се справяте с изключения в скрипт, който ще ви даде по-добър отчет, когато програмата се провали поради някаква причина.
Тук се опитахме да обхванем процеса и рамката на обработка на изключенията, която се изисква да бъде внедрена в скриптове за селен.
Не забравяйте, че не е задължително винаги да се справяте с изключението в a опитай да хванеш блок. Можете също така да хвърлите изключение в зависимост от изискването в скрипта.
Изключение не трябва да се пренебрегва, тъй като нарушават изпълнението на програмата. В този урок преминахме през различни изключения и начини за намаляване на шансовете за получаване чрез ръчни проверки и кодове.
Добавянето на изчаквания може да контролира някои случаи като „NoSuchElementException“, „ElementNotFoundException“, „ElementNotVisibleException“.
Следващ урок # 20 : В предстоящия урок ще обсъдим налични са различни видове рамки за тестване . Също така бихме проучили плюсовете и минусите на използването на подхождащ рамков подход в тестовете за автоматизация. Бихме обсъдили подробно за тестовата рамка, управлявана от данни.
Моля, публикувайте вашите запитвания, свързани с обработка на изключения в Selenium WebDriver, ако имате такива.
Препоръчително четене
- Изключения на Java и обработка на изключения с примери
- Как да боравим със сигнали / изскачащи прозорци в Selenium WebDriver - Урок за селен # 16
- Урок за AutoIt - AutoIt Изтегляне, инсталиране и основен скрипт за AutoIt
- Урок за краставици селен: Интеграция на краставица Java Selenium WebDriver
- Интеграция на селен с JMeter
- Въведение в Selenium WebDriver - Урок № 8 за селен
- 30+ най-добри урока за селен: Научете селен с реални примери
- Възможност за работа на свободна практика на непълно работно време за експерти по селен