← Назад к вопросам

В чем разница между findElement и findElements?

1.0 Junior🔥 211 комментариев
#Selenium и UI автоматизация#Фреймворки тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между findElement и findElements в Selenium WebDriver

Оба метода являются фундаментальными для поиска элементов на веб-странице в Selenium WebDriver, но имеют принципиальные различия в поведении, возвращаемых значениях и сценариях применения.

Ключевые различия

КритерийfindElement(By by)findElements(By by)
Возвращаемый типОдин WebElementList<WebElement> (коллекция)
Поведение при отсутствии элементовБросает исключение NoSuchElementExceptionВозвращает пустой список List (size = 0)
Количество возвращаемых элементовВсегда первый найденный элементВсе элементы, соответствующие локатору
Основное назначениеРабота с уникальными элементамиРабота с группами однотипных элементов

Подробное объяснение с примерами кода

Метод findElement()

Используется, когда требуется найти один конкретный элемент на странице. Если элемент не найден, возникает исключение, что требует обработки.

// Пример на Java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class FindElementExample {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://example.com");
        
        try {
            // Поиск единственного элемента
            WebElement header = driver.findElement(By.tagName("h1"));
            System.out.println("Заголовок: " + header.getText());
            
            // Если элемент не найден - исключение
            WebElement missingElement = driver.findElement(By.id("non-existent"));
        } catch (org.openqa.selenium.NoSuchElementException e) {
            System.out.println("Элемент не найден: " + e.getMessage());
        }
    }
}

Метод findElements()

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

// Пример на Java
import java.util.List;

public class FindElementsExample {
    public static void main(String[] args) {
        WebDriver driver = new ChromeDriver();
        driver.get("https://example.com/products");
        
        // Поиск всех элементов
        List<WebElement> products = driver.findElements(By.className("product-item"));
        
        // Проверка наличия элементов
        if (products.isEmpty()) {
            System.out.println("Товары не найдены");
        } else {
            System.out.println("Найдено товаров: " + products.size());
            
            // Итерация по всем найденным элементам
            for (WebElement product : products) {
                System.out.println(product.findElement(By.className("title")).getText());
            }
        }
        
        // Безопасный поиск несуществующих элементов
        List<WebElement> noElements = driver.findElements(By.id("non-existent"));
        System.out.println("Найдено несуществующих элементов: " + noElements.size()); // 0
    }
}

Практические сценарии использования

Когда использовать findElement():

  • Работа с уникальными элементами (логотип, главная кнопка, заголовок)
  • Заполнение форм (поля ввода, чекбоксы, радио-кнопки)
  • Клики по конкретным элементам навигации
  • Валидация присутствия критически важных элементов
# Пример на Python
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://login.example.com")

# Уникальные элементы формы логина
username_field = driver.find_element(By.ID, "username")
password_field = driver.find_element(By.NAME, "password")
submit_button = driver.find_element(By.XPATH, "//button[@type='submit']")

username_field.send_keys("testuser")
password_field.send_keys("password123")
submit_button.click()

Когда использовать findElements():

  • Сбор данных из таблиц или списков
  • Подсчет количества одинаковых элементов на странице
  • Фильтрация элементов по дополнительным критериям
  • Проверка отсутствия элементов без генерации исключений
// Пример сложного сценария с findElements()
public void processDynamicTable() {
    // Получаем все строки таблицы
    List<WebElement> rows = driver.findElements(By.cssSelector("table.data-table tbody tr"));
    
    for (WebElement row : rows) {
        // В каждой строке ищем конкретные ячейки
        List<WebElement> cells = row.findElements(By.tagName("td"));
        
        if (cells.size() >= 3) {
            String name = cells.get(0).getText();
            String price = cells.get(1).getText();
            String quantity = cells.get(2).getText();
            
            // Бизнес-логика обработки
            if (Integer.parseInt(quantity) > 0) {
                System.out.println(name + " - " + price);
            }
        }
    }
}

Важные рекомендации для QA Automation

  1. Обработка исключений: Всегда обрабатывайте NoSuchElementException при использовании findElement(), особенно в стабильных тестах.

  2. Комбинированное использование: Часто методы используются вместе:

// Найти контейнер, затем все элементы внутри него
WebElement container = driver.findElement(By.id("items-container"));
List<WebElement> items = container.findElements(By.className("item"));
  1. Производительность: findElements() может быть медленнее при большом количестве элементов. Используйте более специфичные локаторы.

  2. Неявные ожидания: Оба метода учитывают implicit waits, что важно для динамических веб-приложений.

  3. Читаемость кода: Выбор метода делает код более понятным:

    • findElement() → "ожидаю найти один элемент"
    • findElements() → "работаю с коллекцией элементов"

Заключение

Понимание различий между findElement() и findElements() критически важно для написания надежных и эффективных автотестов. Выбор правильного метода зависит от конкретного контекста: findElement() идеален для работы с уникальными элементами с немедленной валидацией их наличия через исключения, тогда как findElements() предоставляет гибкость для работы с коллекциями и безопасную проверку отсутствия элементов. Опытные автоматизаторы умело комбинируют оба метода, создавая стабильные и поддерживаемые тестовые фреймворки.

В чем разница между findElement и findElements? | PrepBro