org.openqa.селен.Исключение NoSuchElementException при переходе к дочернему div Selenium Java

#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();