Как вы обрабатываете исключения в UI или API автотестах?

«Как вы обрабатываете исключения в UI или API автотестах?» — вопрос из категории Автоматизация тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обработка исключений в автотестах — ключ к их стабильности и информативности при падениях. Я разделяю обработку на ожидаемые (часть сценария) и неожиданные (сбой) исключения.

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.