Проверка наличия элемента в Selenium WebDriver без try-catch
Быстрый ответ
Для быстрой проверки наличия элемента в Selenium WebDriver, рекомендуется использовать комбинацию методов findElements()
и isEmpty()
. Такой подход исключает необходимость обрабатывания исключений, предлагая простую булеву проверку.
Пример кода:
boolean isElementPresent = !driver.findElements(By.id("SomeId")).isEmpty();
Если элемент присутствует на странице, этот фрагмент кода вернёт true
, в противном случае – false
.
Углубление и оптимизация
Чтобы повысить эффективность базового метода, можно применять разные подходы к проверке наличия элемента на странице. Это сделает тесты надёжнее и удобнее в использовании.
Быстрая проверка с неявными ожиданиями
Для ускорения процесса можно временно установить минимальное значение неявного ожидания. Это аналогично ситуации, когда вы ожидаете доставку пиццы без нетерпения и начинаете узнавать о её прибытии с частыми звонками.
driver.manage().timeouts().implicitlyWait(0, TimeUnit.MILLISECONDS); // "Буду ждать сколько нужно".
boolean isElementFound = !driver.findElements(By.id("SweetId")).isEmpty(); // "Но где же моя пицца?".
driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); // "А, вот она наконец прибыла".
Универсальные вспомогательные методы (повторение – мать учения, но не программирования!)
Создавайте универсальные методы, чтобы избегать дублирования кода:
public boolean isElementExists(WebDriver driver, By by) {
return !driver.findElements(by).isEmpty(); // Трансформация идеи в код
}
Расширение WebDriver и WebElement всё потому, что мы можем!
Рассмотрите возможность расширения функциональности WebDriver
и WebElement
посредством наследования:
public class EnhancedWebDriver extends WebDriver { // Теперь я – ваш надёжный WebDriver!
boolean isElementExists(By by) { // "Меня не волнует `NoSuchElementException`, я его не знаю".
// Реализация с использованием вспомогательного метода
}
}
public class EnhancedWebElement extends WebElement { // Потому что обычный WebElement для нас уже не подходит!
boolean exists() { // "Если ты есть, я это вижу. Если нет – значит, никогда и не было тебя".
// Специализированная реализация
}
}
Визуализация
Проработаем аналогию и представим WebDriver как стойку регистрации в гостинице – тогда проверка наличия элементов станет более наглядной.
гостиница => WebElement
стойка регистрации => WebDriver
Проверить наличие номера 404, обратившись на стойку регистрации, – всё равно что:
boolean isRoomAvailable = driver.findElements(By.id("room#404")).size() > 0;
Сценарий | Аналогия с гостиницей | Метод WebDriver |
---|---|---|
Проверка номера | Расспрос на стойке | findElements(By.id("room#404")).size() > 0 |
Номер свободен | ✅ Номер доступен | Элемент присутствует на странице |
Номер занят | ❌ Номера не существует | Элемент отсутствует |
Уравновешивание ожиданий и проверок
Существуют различные методы, позволяющие гибко сочетать ожидания и проверку наличия элементов.
Избегайте обработки исключений
Охватывание try-catch
для перехвата NoSuchElementException
может быть излишним и затратным.
// Обойтись без `NoSuchElementException` всё-таки получится...
boolean isElementExisting = !driver.findElements(By.id("elementId")).isEmpty();
Внимание к загружающимся страницам
Некоторые методы учитывают время загрузки страницы, поэтому явные ожидания могут быть полезными:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); // Дадим странице время для загрузки
boolean isElementExist = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("elementId"))) != null;
Полезные материалы
- /documentation/webdriver/elements/ — официальная документация по WebElement в Selenium.
- WebDriver – ожидание элемента с использованием Java – Stack Overflow
- ExpectedConditions
- Ожидание команд в Selenium WebDriver | Уроки Selenium | ToolsQA
- Codementor – опыт программирования и дизайна от наставников-профессионалов