Исключения в Selenium: Полное руководство

Будучи специалистами по автоматизации, мы наверняка сталкивались с ошибками и исключениями в нашем коде. Хотя оба термина указывают на проблему, между ними есть четкая разница.

Давайте сначала разберем исключения и ошибки на реальном примере. Представьте, что вы находитесь у банкомата, чтобы снять наличные. Вы вводите неправильный PIN-код, и система выдает сообщение об ошибке с просьбой ввести правильный PIN-код, а если лимит превышен, то карта блокируется. Это серьезная ситуация, и вот как выглядит ошибка.

Теперь представим, что вы подошли к банкомату в детстве и захотели опробовать аппарат. Вы достаете карту и вставляете ее в обратном направлении. Банкомат не может считать карту и предлагает вам вставить карту правильно. Вы пробуете вставить карту в обратном направлении, и вуаля! Теперь ваша карта считывается банкоматом. Это менее серьезная проблема, которая была легко устранена. Это можно сравнить с исключением. Давайте теперь погрузимся в технические термины.

Событие, которое происходит во время выполнения программы и нарушает поток инструкций, является исключением. В то время как ошибка возникает до выполнения программы из-за факторов, нарушающих работу системных ресурсов, исключения — это проблемы, возникающие во время выполнения/компиляции.

В Selenium мы можем получить исключения из-за неправильных параметров, тайм-аутов, синтаксиса, проблем со стабильностью сети, совместимостью браузеров и т.д. Работа с исключениями в Selenium — это навык, которым должен обладать любой специалист по автоматизации, и это один из основных сегментов вопросов на собеседовании по Selenium. Прежде чем перейти к рассмотрению типов исключений в Selenium, давайте разберемся в типах исключений в JAVA.

Вот типы исключений:

  • Проверенное исключение: Этот тип исключений обрабатывается во время компиляции. Если оно не поймано, то во время компиляции выдается ошибка компиляции. Примерами могут служить FileNotFoundException, IOException и т.д.
  • Непроверенное исключение: Компилятор игнорирует это исключение во время компиляции. Однако это может создать проблему в выводах. ArrayIndexoutOfBoundException — один из ярких примеров.

Как же нам обрабатывать эти исключения? Конечно же, с помощью следующих методов!

Блок try и catch

Это наиболее распространенный способ обработки исключений, которые должны быть объявлены в блоке catch. Когда исключение возникает в блоке try, управление переходит к блоку catch. В зависимости от типа исключения для одного блока try может быть n-ное количество блоков catch.

try{
Br = new BufferedReader(new FileReader("example"));
}
catch(IOException ie){
ie.printStackTrace();
}
catch(FileNotFoundException file){
file.printStackTrace();
}
Вход в полноэкранный режим Выход из полноэкранного режима

Выбрасывает исключение

Этот метод можно использовать для всех проверяемых исключений. Ключевое слово throws используется для того, чтобы бросить исключение, а не обработать его.

Public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new FileReader("Example"));
while ((line = br.readLine()) != null)
{
System.out.println(line);
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Блок finally

Блок finally выполняется сразу после завершения блока try и catch. Он не зависит от блока try и catch и может существовать даже при отсутствии блока catch. С помощью блока finally можно завершить такие шаги, как закрытие файлов, подключение к базе данных и т.д.

try{
Br = new BufferedReader(new FileReader("Example"));
}
catch(IOException ie)
{
ie.printStackTrace();
Finally
{
br.close();
}
Вход в полноэкранный режим Выход из полноэкранного режима

Throwable

Что происходит в случаях, когда программист не уверен в типе исключения? Они могут использовать родительский класс throwable для ошибок и исключений!

try {
Br = new BufferedReader(new FileReader("Example"));
}
Catch (Throwable t)
{
t.printStackTrace();
}
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь, когда мы имеем представление об исключениях и обработке исключений в целом, давайте перейдем к исключениям в selenium. С его помощью вы сможете обрабатывать исключения, а также отвечать на вопросы Selenium Interview, касающиеся этого!

Обработка исключений в Selenium

Классы исключений в Selenium WebDriver принадлежат к суперклассу WebDriverException. Хотя существует огромное количество исключений, ниже приведены наиболее распространенные исключения в Selenium, с которыми мы сталкиваемся:

  • NoSuchElementException
  • NoSuchWindowException
  • No-SuchFrameException
  • NoAlertPresentException
  • InvalidSelectorException
  • ElementNotVisibleException
  • ElementNotSelectableException
  • TimeoutException
  • NoSuchSessionException
  • StaleElementReferenceException

NoSuchElementException

Это исключение возникает, когда Selenium WebDriver не может найти/расположить элементы, указанные в сценарии. Это довольно простое исключение и может быть устранено путем перекрестной проверки локатора элемента, указанного в методе findElement(By, by). В случае использования класса Page в скриптах, убедитесь, что локаторы элементов обновлены в классе Page Object Model, на случай изменения кода UAT.
Например, если ID для кнопки входа сначала был «login», а теперь изменился на «loginsuccess», WebDriver, очевидно, не сможет найти элемент, и будет выброшено исключение org.openqa.selenium.NoSuchElementException. Иногда это исключение возникает даже тогда, когда элемент не загружен. Мы можем включить неявное ожидание или код thread.sleep, чтобы дать UAT время для полной загрузки его содержимого.

driver.findElement(By.id("login")).click();`
Вход в полноэкранный режим Выход из полноэкранного режима

Обработка исключений с помощью блоков try и catch:

try{
driver.findElement(By.id("login")).click();
} catch (NoSuchElementException e)
Implicit wait and thread.sleep in Selenium:
Package waitExample;

import java.util.concurrent.TimeUnit;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class WaitTest {

public WebDriver driver;
public String Url;
public WebElement element;

@BeforeMethod
public void setUp() throws Exception {
driver = new FirefoxDriver();
Url = ("https://www.example.com");
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}`

@Test
public void testun() throws Exception {
driver.get(Url);
element = driver.findElement(By.id("abc"));
Thread.sleep(1000)
element.sendKeys("testdata");
element.sendKeys(Keys.RETURN);
List<WebElement> 
list = driver.findElements(By.className("test"));
System.out.println(list.size());

}

@AfterMethod
public void tearDown() throws Exception {
driver.quit();
}
}
Вход в полноэкранный режим Выход из полноэкранного режима

Использование неявных ожиданий, thread.sleep и т.д. относится к подходу избегания обработки исключений в Selenium.

NoSuchWindowException

Это исключение возникает, когда WebDriver пытается переключиться на предположительно недопустимое окно. Мы можем предотвратить возникновение этого исключения, введя переключение драйвера для каждого окна на каждом этапе выполнения кода.

for (String handle : driver.getWindowHandles()) {
try {
driver.switchTo().window(handle);
} catch (NoSuchWindowException e) {
driver.quit();
}
}
Вход в полноэкранный режим Выход из полноэкранного режима

Техникой предотвращения этой проблемы может быть включение времени ожидания в сценарии автоматизации. Поскольку это относится к классу NotFoundException, мы также можем использовать предыдущие методы устранения неполадок.

NoSuchFrameException

Когда фрейм недействителен или не существует, в Selenium возникает исключение no such frame. Это исключение относится к классу NotFoundException.

try {
driver.switchTo().frame("frame_2");
} catch (NoSuchWindowException e)
Вход в полноэкранный режим Выход из полноэкранного режима

Все мы знаем, что для полной загрузки всех компонентов веб-сайта может потребоваться время. Поэтому есть вероятность, что кадр еще не загружен. Здесь мы можем использовать явную команду wait, чтобы проверить, появится ли кадр в течение определенного промежутка времени, и если нет, то будет выброшено исключение.

try {
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(frame_10));
try {
driver.switchTo().frame("frame_10");
} catch (WebDriverException e) {
System.out.println("abcd");
}
} catch (TimeOutException e) {
System.out.println("frame not located");`
}
Вход в полноэкранный режим Выход из полноэкранного режима

NoAlertPresentException

Как и вышеперечисленные исключения, это также относится к классу NotFoundException. Это исключение выбрасывается, когда Selenium WebDriver пытается переключиться на оповещение, которое еще не доступно на экране или не существует. В этом случае мы можем использовать явную или свободную команду wait, чтобы дождаться полной загрузки оповещения, и если это не произойдет, то может быть выброшено исключение.

try {
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.alertIsPresent());
try {
driver.switchTo().alert().accept();
} catch (TimeOutException e)
System.out.println("Alert not found");`
}
Вход в полноэкранный режим Выход из полноэкранного режима

InvalidSelectorException

Метод локатора XPATH может показаться точным, но если в нашем пользовательском XPATH есть проблемы с синтаксисом, мы обязательно получим исключение недопустимого селектора. Это может произойти и с другими локаторами. Исключение Invalid Selector в Selenium возникает, когда селектор недействителен или когда синтаксис неверен.

try {
clickXPathButtonAndWait("//button[@type='button1']");
} catch (InvalidSelectorException e) {
}
Вход в полноэкранный режим Выход из полноэкранного режима

ElementNotVisibleException .

Когда WebDriver пытается взаимодействовать с каким-либо невидимым или скрытым элементом, возникает исключение ElementNotVisibleException. Это исключение также относится к классу ElementNotVisibleException. Иногда, когда страница загружается не полностью, возникает исключение ElementNotVisibleException. Как и в предыдущих исключениях, здесь мы также можем использовать явное ожидание, чтобы проверить, появится ли элемент в течение определенного времени, иначе будет выброшено исключение.

try {
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(ExpectedConditions.visibilityOfElementLocated(By.id("test"));
try {
driver.findElement(By.id("test")).click();
} catch (TimeOutException e)
System.out.println("Element not visible");
}
Вход в полноэкранный режим Выход из полноэкранного режима

ElementNotSelectableException

Когда веб-элемент присутствует на веб-странице, но не включен, возникает исключение ElementNotSelectableException. Это происходит с выпадающими меню, радиокнопками, переключателями и т.д. Надклассом этого исключения является InvalidElementStateException. В качестве метода предотвращения и обработки мы можем добавить явную команду wait, чтобы подождать, пока элемент не будет включен и доступен для взаимодействия.

try {
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
wait.Until(ExpectedConditions. elementToBeClickable(By.id("test"));
try {
Select dropdown = new Select(driver.findElement(By.id("test")));
} catch (ElementNotSelectableException e)
System.out.println("Element not enabled");
}
Вход в полноэкранный режим Выход из полноэкранного режима

TimeoutException

В приведенных выше исключениях мы использовали команды ожидания в качестве обходного пути. Но что произойдет, если время выполнения команды превысит время ожидания? Что происходит, если элементы не загружаются полностью даже по истечении времени ожидания? Похоже, это сложная часть вопросов Selenium Interview!
В этом случае возникает исключение TimeoutException. Мы можем вручную засечь время, необходимое веб-странице для полной загрузки своих компонентов, и изменить наши скрипты, или же добавить явное ожидание с помощью исполнителя JavaScript. Вот пример:
Рассмотрим макет веб-сайта под названием «www.exampletestselenium.com». После перехода по странице мы можем использовать тип возврата document.readyState в течение 30 секунд, пока не будет возвращено значение «complete». Поскольку JavaScript является родным языком браузера, при правильном использовании исполнителя JavaScript мы сталкиваемся с меньшим количеством проблем.

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));

wait.until(webDriver -> ((JavascriptExecutor)webDriver).executeScript("return document.readyState").equals("complete"));

driver.get("https://www.exampletestselenium.com");`
Вход в полноэкранный режим Выход из полноэкранного режима

NoSuchSessionException

Это исключение возникает, когда WebDriver не может выполнить какую-либо команду с помощью экземпляра драйвера. Такие проблемы, как сбои браузера, являются веской причиной возникновения этого исключения. Чтобы предотвратить это исключение, мы должны убедиться, что версия браузера, которую мы используем, стабильна, а драйверы должны быть совместимы с версиями браузеров. Использование метода driver.quit() в конце всех тестов может в значительной степени минимизировать возникновение этого исключения.

@BeforeSuite
public void setUp() throws MalformedURLException {
WebDriver driver = new ChromeDriver();
}
@AfterSuite
public void testDown() {
driver.quit();
}
Вход в полноэкранный режим Выход из полноэкранного режима

StaleElementReferenceException

Мы часто сталкиваемся с этим исключением при переходе на новую страницу, обновлении DOM или при переключении окна/фрейма. В этом случае элемент больше не присутствует на веб-странице, и когда WebDriver пытается найти его, возникает исключение. Однако это не то же самое, что ElementNotVisibleException. В ElementNotVisibleException элементы скрыты или загружены с опозданием, тогда как в StaleElementReferenceException элементы отсутствуют на текущей веб-странице. Например, пользователь может захотеть ввести свое имя пользователя в поле username. Но при нажатии на кнопку входа в систему с главной страницы произошел переход в окно. Если сначала создается объект, а переключение выполняется позже, возникает исключение.
Чтобы избежать этого исключения, мы можем попробовать использовать динамический XPath.

try {
driver.findElement(By.xpath("//*[contains(@id,username')]")).sendKeys("testid");
} catch (StaleElementReferenceException e)
Войти в полноэкранный режим Выход из полноэкранного режима

Заключение

Надеюсь, эта статья дала вам четкое понимание исключений в Selenium. Продолжайте учиться и практиковаться, пока вопросы на собеседовании по Selenium не станут для вас легкой прогулкой!

Оцените статью
devanswers.ru
Добавить комментарий