ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Проверка наличия элемента в Selenium WebDriver без try-catch

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для быстрой проверки наличия элемента в Selenium WebDriver, рекомендуется использовать комбинацию методов findElements() и isEmpty(). Такой подход исключает необходимость обрабатывания исключений, предлагая простую булеву проверку.

Пример кода:

Java
Скопировать код
boolean isElementPresent = !driver.findElements(By.id("SomeId")).isEmpty();

Если элемент присутствует на странице, этот фрагмент кода вернёт true, в противном случае – false.

Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Углубление и оптимизация

Чтобы повысить эффективность базового метода, можно применять разные подходы к проверке наличия элемента на странице. Это сделает тесты надёжнее и удобнее в использовании.

Быстрая проверка с неявными ожиданиями

Для ускорения процесса можно временно установить минимальное значение неявного ожидания. Это аналогично ситуации, когда вы ожидаете доставку пиццы без нетерпения и начинаете узнавать о её прибытии с частыми звонками.

Java
Скопировать код
driver.manage().timeouts().implicitlyWait(0, TimeUnit.MILLISECONDS);       // "Буду ждать сколько нужно".
boolean isElementFound = !driver.findElements(By.id("SweetId")).isEmpty(); // "Но где же моя пицца?".
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);            // "А, вот она наконец прибыла".

Универсальные вспомогательные методы (повторение – мать учения, но не программирования!)

Создавайте универсальные методы, чтобы избегать дублирования кода:

Java
Скопировать код
public boolean isElementExists(WebDriver driver, By by) {
    return !driver.findElements(by).isEmpty();  // Трансформация идеи в код
}

Расширение WebDriver и WebElement всё потому, что мы можем!

Рассмотрите возможность расширения функциональности WebDriver и WebElement посредством наследования:

Java
Скопировать код
public class EnhancedWebDriver extends WebDriver {  // Теперь я – ваш надёжный WebDriver!
    boolean isElementExists(By by) {                // "Меня не волнует `NoSuchElementException`, я его не знаю".
        // Реализация с использованием вспомогательного метода
    }
}

public class EnhancedWebElement extends WebElement {  // Потому что обычный WebElement для нас уже не подходит!
    boolean exists() {                                // "Если ты есть, я это вижу. Если нет – значит, никогда и не было тебя".
        // Специализированная реализация
    }
}

Визуализация

Проработаем аналогию и представим WebDriver как стойку регистрации в гостинице – тогда проверка наличия элементов станет более наглядной.

Markdown
Скопировать код
гостиница => WebElement
стойка регистрации => WebDriver

Проверить наличие номера 404, обратившись на стойку регистрации, – всё равно что:

Java
Скопировать код
boolean isRoomAvailable = driver.findElements(By.id("room#404")).size() > 0;
СценарийАналогия с гостиницейМетод WebDriver
Проверка номераРасспрос на стойкеfindElements(By.id("room#404")).size() > 0
Номер свободен✅ Номер доступенЭлемент присутствует на странице
Номер занят❌ Номера не существуетЭлемент отсутствует

Уравновешивание ожиданий и проверок

Существуют различные методы, позволяющие гибко сочетать ожидания и проверку наличия элементов.

Избегайте обработки исключений

Охватывание try-catch для перехвата NoSuchElementException может быть излишним и затратным.

Java
Скопировать код
// Обойтись без `NoSuchElementException` всё-таки получится...
boolean isElementExisting = !driver.findElements(By.id("elementId")).isEmpty();

Внимание к загружающимся страницам

Некоторые методы учитывают время загрузки страницы, поэтому явные ожидания могут быть полезными:

Java
Скопировать код
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));   // Дадим странице время для загрузки
boolean isElementExist = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementId"))) != null;

Полезные материалы

  1. /documentation/webdriver/elements/ — официальная документация по WebElement в Selenium.
  2. WebDriver – ожидание элемента с использованием Java – Stack Overflow
  3. ExpectedConditions
  4. Ожидание команд в Selenium WebDriver | Уроки Selenium | ToolsQA
  5. Codementor – опыт программирования и дизайна от наставников-профессионалов