Найти элементы по нескольким именам классов в Selenium Java

Я пытаюсь автоматизировать одну функцию на сайте Amazon по этому URL.

Я получаю пустой список при отладке этой строки:

List<WebElement> e = driver.findElements(By.className("a-box-inner a-padding-extra-large"));

Исходный код сайта выглядит следующим образом:

Мой вопрос: почему я получаю пустой список, а не список со всеми выбранными элементами div?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С методом By.className(String) можно использовать только одно имя класса. Из JavaDoc:

Поиск элементов на основе значения атрибута «класс». Следует использовать только одно имя класса. Если элемент имеет несколько классов, используйте cssSelector(String).

Вместо этого вы можете использовать метод By.cssSelector(String):

driver.findElements(By.cssSelector("div[class='a-box-inner a-padding-extra-large']"));

Благодарю. Знаете ли вы, почему таким образом я получаю список с 1 значением, а не со всеми элементами, которые появляются на изображении?

Yaffa Harari 10.10.2022 22:25

Текущая установка дает вам внешний элемент. Если вам нужны внутренние элементы, то я считаю, что вы можете сделать e.findElements(By.xpath(".//*")) (где e — это 1 элемент, который вы только что нашли). Или вы можете изменить запрос CSS, чтобы настроить таргетинг на все внутренние элементы (может быть, что-то вроде div.a-box-inner.a-padding-extra-large > *, но я не проверял).

blacktide 10.10.2022 22:29
"//div[@class='a-box-inner a-padding-extra-large']/*" сработало для меня
Yaffa Harari 10.10.2022 22:50

Другие вопросы по теме