Не удается найти элемент по классу селена amazon

В настоящее время я пробую Selenium Webdriver на веб-странице amazon.es. Я успешно прошел по веб-странице, ища элемент по классу (если быть точным, кнопка элемента поиска).

Проблема в том, что я пытаюсь узнать цены на веб-странице. Веб-страницу можно найти здесь (просто найдите Balon Baloncesto => Basketball). Когда я пытаюсь найти элемент по классу, именно этот:

<span class = "a-size-base a-color-price s-price a-text-bold">EUR 33,64</span>

Selenium не может его найти, что дает ошибку «Не найден элемент». Вот реализация Java. nav - объект браузера.

//value = a-size-base a-color-price s-price a-text-bold
elemList = nav.findElements(By.className(value));
//elemList appears to be empty after this

На веб-странице нет каких-либо iFrames, которые могли бы повлиять на меня, поэтому я не очень хорошо понимаю, откуда может возникнуть проблема. Любая помощь будет признательна.

С наилучшими пожеланиями

Пожалуйста, опубликуйте фактическое сообщение об ошибке. Я предполагаю, что это не элемент, который не найден, если вы используете весь класс внутри By.className(). Если бы вы сделали это, вы бы получили что-то вроде «Запрещенные имена составных классов», которые в основном заявляют, что вы ищете более одного имени класса внутри локатора, который принимает только одно имя класса.

JeffC 02.04.2018 20:43

Ошибка, которую я получаю, - это элемент, который не найден, а не тот, который вы упомянули

J. Baron 03.04.2018 09:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
3 651
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Этот код может вам помочь:

WebDriver nav = new FirefoxDriver();
nav.get("https://www.amazon.es/s/ref=nb_sb_noss/261-8047486-3232562?__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&url=search-alias%3Daps&field-keywords=Balon+Baloncesto&rh=i%3Aaps%2Ck%3ABalon+Baloncesto");

 List<WebElement> elements = nav.findElements(By.xpath("//span[contains(@class,'a-size-base a-color-price s-price a-text-bold')]"));
 for(WebElement element: elements) {
         System.out.println(element.getText());
  }

Это работает, но ответ Брайана более полный и дает объяснение ошибки, которую я делал, в любом случае большое спасибо за ваш ответ !!

J. Baron 03.04.2018 09:43

Да, это. Я согласен с вами. Спасибо за ответ.

Thiago Procaci 03.04.2018 14:46
Ответ принят как подходящий

By.className(value) имеет особое поведение для элементов с несколькими классами. Я не могу найти это поведение, задокументированное в привязках JS, но вот отрывок из той же функциональности в Java.

Из документов:

If an element has multiple classes, then this will match against each of them. For example, if the value is "one two onone", then the class names "one" and "two" will match.

Поэтому, когда фактический атрибут класса - class = "a-size-base a-color-price s-price a-text-bold", будут соответствовать только следующие идентификаторы By.className.

By.className("a-size-base")
By.className("a-color-price")
By.className("s-price")
By.className("a-text-bold")

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

Если вы хотите сопоставить ВСЕ классов, попробуйте использовать xpath, который проверяет, содержит ли атрибут @class ваше значение.

В качестве альтернативы (и это обычно будет работать лучше, чем xpath) используйте селектор css, который объединяет все имена классов вместе. Каждому имени класса в селекторе CSS должен предшествовать ..

By.css(".a-size-base.a-color-price.s-price.a-text-bold")

Большое спасибо, у меня будет это соображение на будущее.

J. Baron 03.04.2018 09:41

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