Ответ
Чтобы найти элемент div по классу с помощью XPath, нужно учитывать, что атрибут class часто содержит несколько значений. Поэтому я почти всегда использую функцию contains() для поиска по частичному совпадению.
Основные стратегии и примеры:
-
Поиск по частичному совпадению класса (наиболее надежный):
// XPath: Найти div, у которого в атрибуте class содержится подстрока 'button-primary' By.xpath("//div[contains(@class, 'button-primary')]")Это сработает для
<div class="btn button-primary large">. -
Поиск по точному совпадению (используется редко, так как класс обычно не один):
// XPath: Найти div, у которого атрибут class в точности равен 'menu' By.xpath("//div[@class='menu']")Это сработает ТОЛЬКО для
<div class="menu">и НЕ сработает для<div class="menu active">. -
Комбинация нескольких классов:
// 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']")), так как они созданы специально для тестов и меньше подвержены изменениям.