Как найти div с определенным классом с помощью XPath в Selenium?

«Как найти div с определенным классом с помощью XPath в Selenium?» — вопрос из категории Selenium и Selenide, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Чтобы найти элемент div по классу с помощью XPath, нужно учитывать, что атрибут class часто содержит несколько значений. Поэтому я почти всегда использую функцию contains() для поиска по частичному совпадению.

Основные стратегии и примеры:

  1. Поиск по частичному совпадению класса (наиболее надежный):

    // XPath: Найти div, у которого в атрибуте class содержится подстрока 'button-primary'
    By.xpath("//div[contains(@class, 'button-primary')]")

    Это сработает для <div class="btn button-primary large">.

  2. Поиск по точному совпадению (используется редко, так как класс обычно не один):

    // XPath: Найти div, у которого атрибут class в точности равен 'menu'
    By.xpath("//div[@class='menu']")

    Это сработает ТОЛЬКО для <div class="menu"> и НЕ сработает для <div class="menu active">.

  3. Комбинация нескольких классов:

    // XPath: Найти div, который содержит ОБА класса 'active' и 'highlighted'
    By.xpath("//div[contains(@class, 'active') and contains(@class, 'highlighted')]")

Практический пример в Selenium WebDriver (Java):

// Лучше использовать явное ожидание для устойчивости теста
WebElement element = new WebDriverWait(driver, Duration.ofSeconds(10))
    .until(ExpectedConditions.presenceOfElementLocated(
        By.xpath("//div[contains(@class, 'search-result')]")
    ));

Рекомендация: Если есть возможность добавить в разметку data-qa или data-testid атрибуты, я предпочитаю использовать их (By.cssSelector("[data-qa='submit-btn']")), так как они созданы специально для тестов и меньше подвержены изменениям.