Ответ
Обработка исключений в автотестах — ключ к их стабильности и информативности при падениях. Я разделяю обработку на ожидаемые (часть сценария) и неожиданные (сбой) исключения.
1. Обработка ожидаемых исключений/ошибок:
Использую try-catch (или try-except в Python) для проверки негативных сценариев, когда ошибка является валидным результатом.
Пример (Java + Selenium WebDriver):
@Test
public void testLoginWithInvalidCredentialsShowsError() {
loginPage.open();
loginPage.enterCredentials("wrong_user", "wrong_pass");
loginPage.submit();
try {
// Ожидаем, что элемент с ошибкой появится
WebElement error = driver.findElement(By.cssSelector(".alert-error"));
Assert.assertTrue("Error message should be displayed", error.isDisplayed());
Assert.assertEquals("Invalid credentials", error.getText());
} catch (NoSuchElementException e) {
// Если элемента нет — это баг
Assert.fail("Error message was not shown for invalid login attempt.");
}
}
2. Предотвращение и обработка неожиданных исключений:
- Явные ожидания (Explicit Waits): Вместо
Thread.sleep()используюWebDriverWaitдля обработки проблем с таймингом.WebElement element = new WebDriverWait(driver, Duration.ofSeconds(10)) .until(ExpectedConditions.visibilityOfElementLocated(By.id("submit-btn"))); - Стратегии повторных попыток (Retry): Для "flaky"-тестов, зависящих от внешних факторов, настраиваю механизм повторного запуска через возможности фреймворка (аннотация
@Retryв TestNG,pytest-rerunfailures). - Глобальные обработчики и логирование: Настраиваю listeners/hooks (например,
TestNG ITestListener) для перехвата любых падений тестов. В момент падения автоматически сохраняю:- Скриншот страницы.
- Исходный код страницы (page source).
- Логи браузера (console logs). Эта информация прикрепляется к отчёту (Allure, ExtentReports), что значительно ускоряет отладку.
Главный принцип: тест должен чётко показать, что сломалось и в каком состоянии находилась система, а не просто упасть с NullPointerException.