#java #selenium #selenium-webdriver #css-selectors #automated-tests
Вопрос:
Текущая страница находится https://www.nintendo.co.uk/Games/Games-347085.html
Я запустил тест Селена с driver.findElement для контейнера div.row-page, и он отлично работает
но когда я пытаюсь получить значение цены, перейдя дальше в красную строку ниже для информации о странице, я не могу найти, как получить доступ к классу, он регистрируется: org.openqa.selenium.Исключение NoSuchElementException: такого элемента нет
Как я могу получить значение цены, по возможности избегая XPath?
Ответ №1:
Не знаю, почему вы не хотите иметь XPath.
Но в случае, если вы ищете XPath на основе названия игры, это может дать вам цену. Вы можете использовать приведенный ниже XPath
//p[text()='Animal Crossing: New Horizons']//following-sibling::p[@class='price-small']//span[@data-price]
или приведенного ниже CSS также должно быть достаточно
a[href*='Animal-Crossing-New-Horizons'] > p.price-small > span:nth-child(2)
Он основан на href Animal-Crossing-New-Horizons
Ответ №2:
Прежде всего, использование правильного xpath является важным шагом для удаления исключения NoSuchElementException.Xpath для идентификации элемента является
//p[text()='Animal Crossing: New Horizons']//following-sibling::p[@class='price-small']//span[@data-price]
Даже если это не идентифицирует, то с веб-страницей могут возникнуть некоторые проблемы со временем, т. е. страница
все еще отображается, а вы уже завершили поиск элементов и не получили исключения из элементов.
Вы можете использовать FluentWait для решения этой проблемы.
Допустим, у вас есть элемент, который иногда появляется всего за 1 секунду, а иногда требуется несколько минут, чтобы появиться. В этом случае лучше определить явное ожидание с помощью FluentWait, так как это будет пытаться найти элемент снова и снова, пока он не найдет его или пока не закончится последний таймер.
Экземпляр FluentWait может быть определен для настройки максимального времени ожидания условия, а также частоты, с которой это условие должно проверяться.Пользователь также может настроить ожидание, чтобы игнорировать определенные типы исключений во время ожидания элемента, например, NoSuchElementExceptions на странице.
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS);
.pollingEvery(5, SECONDS) ;
.ignoring(NoSuchElementException.class);
Добавление явного ожидания также может помочь:
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
. . .
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath"))); element.click();