Как мы можем найти значение, отображаемое в теге p в веб-драйвере Selenium

#java #selenium-webdriver

#java #selenium-webdriver

Вопрос:

В Selenium WebDriver я пытаюсь найти некоторое значение, $2,772 /month отображаемое в p теге. Я пробовал следующее, но во время выполнения теста я получаю следующую ошибку :

org.openqa.selenium.Исключение NoSuchElementException: такого элемента нет: не удается найти элемент: {«метод»: «xpath»,»селектор»:»//div[@id=’calculatedresult’]//div[@class=’_3Kmts’]//div[@class=’ant-row _2kHnl’]//div[@class=’z-k7K ant-col-xs- 24′]//p[@class=’_3TRls _2fRgA’]»} (Информация о сеансе: chrome = 84.0.4147.135)

Версия Selenium: selenium-java-4.0.0-alpha-6

 WebElement resultElement = driver.findElement(By.xpath("//div[@id='calculatedresult']//div[@class='_3Kmts']//div[@class='ant-row _2kHnl']//div[@class='z-k7K ant-col-xs-24']//p[@class='_3TRls _2fRgA']"));
String resultText = resultElement.getText();
System.out.println("Amount:" resultText);
  

 <div class="XE8MI" id="calculatedresult">
  <div class="_3Kmts">
    <div class="ant-row _2kHnl">
      <div class="ant-col-xs-24 ant-col-sm-24 ant-col-md-12">
        <p class="_3TRls _145-y">
          <!-- react-text: 559 -->How much will you
          <!-- /react-text -->
          <!-- react-text: 560 -->amp;nbsp;
          <!-- /react-text --><span class="_2O2nq">pay each month?</span></p>
      </div>
      <div class="z-k7K ant-col-xs-24 ant-col-sm-24 ant-col-md-12">
        <p class="_3TRls _1QZuL">
          <!-- react-text: 564 -->Your
          <!-- /react-text -->
          <!-- react-text: 565 -->amp;nbsp;
          <!-- /react-text --><span class="_34T3z">estimated repayments</span>
          <!-- react-text: 567 -->
          <!-- /react-text -->
          <!-- react-text: 568 -->could be
          <!-- /react-text -->
        </p>
        <p class="_3TRls _2fRgA">
          <!-- react-text: 570 -->$
          <!-- /react-text -->
          <!-- react-text: 571 -->2,772
          <!-- /react-text -->
          <!-- react-text: 572 -->amp;nbsp;
          <!-- /react-text --><span class="_3VTnt"><!-- react-text: 574 -->/ month<!-- /react-text --><sup>*</sup></span></p>
        <p class="_3TRls _2w2vj">
          <!-- react-text: 577 -->At an interest rate of
          <!-- /react-text -->
          <!-- react-text: 578 -->2.00
          <!-- /react-text -->
          <!-- react-text: 579 -->% over
          <!-- /react-text -->
          <!-- react-text: 580 -->30
          <!-- /react-text -->
          <!-- react-text: 581 -->years
          <!-- /react-text -->
        </p>
      </div>
    </div>
    <div class="ant-row _3jxXH">
      <div class="ant-col-xs-24 ant-col-sm-24 ant-col-md-16"></div>
      <div class="ant-col-xs-24 ant-col-sm-24 ant-col-md-8">
        <div class="_1A1_k"></div>
      </div>
    </div>
    <p class="_3TRls _2wwQC">
  </div>
</div>  

Комментарии:

1. Не могли бы вы изменить изображение в виде фрагмента HTML

2. Удалил изображение и добавил фрагмент html

Ответ №1:

На основе фрагмента HTML, которым вы поделились (не очень хорошая идея, всегда делитесь текстом). Я вижу проблему с вашим XPath. Для класса div, начинающегося с z-k7K ant-, вы не указываете полное имя класса, но используете = operator . Вместо этого используйте contains .

Использовать :

 WebElement resultElement = driver.findElement(By.xpath("//div[@id='calculatedresult']//div[@class='_3Kmts']//div[@class='ant-row _2kHnl']//div[contains(@class,'z-k7K ant-col-xs-24')]//p[@class='_3TRls _2fRgA']"));
  

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

Комментарии:

1. Спасибо за ответ. В этом случае я использую explicit wait для получения текста WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); WebElement resultElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='calculatedresult']//div[@class='_3Kmts']//div[@class='ant-row _2kHnl']//div[contains(@class,'z-k7K ant-col-xs-24')]//p[@class='_3TRls _2fRgA']"))); String resultText = resultElement.getText();

2. Есть ли какой-либо другой способ, кроме xpath, получить текст из этого тега p. ?

3. Это мы можем определить, только увидев полную страницу HTML DOM. Поскольку мы можем использовать css, меньший xpath, но нам нужно увидеть страницу DOM для правильного локатора.

4. Спасибо, я добавил фрагмент html-кода для этого раздела

5. @soccerway Спасибо, что поделились HTML. После просмотра HTML и анализа, я думаю, вам лучше всего использовать xpath. Причина — Поскольку имя вашего класса p начинается с _, css seletor не работает. Я считаю, что это недостаток, из-за которого мы не можем использовать составные селекторы. Однако вы можете написать гораздо более точные xpaths, чем тот, который вы используете сейчас. Например, driver.find_element_by_xpath(«//p[@class=’_3TRls _2fRgA’]»).text или *driver.find_element_by_xpath(«//div[@id=’calculatedresult’]//p[содержит(@class,’_2fRgA’)]»).text