В настоящее время я пробую 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, которые могли бы повлиять на меня, поэтому я не очень хорошо понимаю, откуда может возникнуть проблема. Любая помощь будет признательна.
С наилучшими пожеланиями
Ошибка, которую я получаю, - это элемент, который не найден, а не тот, который вы упомянули



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Этот код может вам помочь:
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());
}
Это работает, но ответ Брайана более полный и дает объяснение ошибки, которую я делал, в любом случае большое спасибо за ваш ответ !!
Да, это. Я согласен с вами. Спасибо за ответ.
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")
Большое спасибо, у меня будет это соображение на будущее.
Пожалуйста, опубликуйте фактическое сообщение об ошибке. Я предполагаю, что это не элемент, который не найден, если вы используете весь класс внутри
By.className(). Если бы вы сделали это, вы бы получили что-то вроде «Запрещенные имена составных классов», которые в основном заявляют, что вы ищете более одного имени класса внутри локатора, который принимает только одно имя класса.