Найти элемент с помощью xpath - PullRequest
1 голос
/ 03 февраля 2020

Сегодня я столкнулся с этой проблемой: у меня есть код html:

<div class="Main">
    <div>
        <div class="display">First:</div>
        <div class="price">$0.01</div>
    </div>
    <div>
        <div class="display">Second:</div>
        <div class="price">$0.02</div>
    </div>
    <div>
        <div class="display">Third:</div>
        <div class="price">$0.03</div>
    </div>
</div>

Я хочу, например, найти второй элемент. Что мне делать? Я использую Java и Selenium, и этот способ не работает:

chromeDriver.findElement(By.className("Main"))
        .findElement(By.xpath(".//*[starts-with(@class, 'price')][2]")).getText()

Я знаю о методе findElements, но я хочу через xpath.

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Использование [1] или [2] в xpath - это НЕ хороший подход ... потому что когда структура страницы изменится, ваш локатор не будет указывать на тот же веб-элемент.

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

xpath = "// div [conatins (text (), '$ 0,02')] ";

Это поможет вам.

1 голос
/ 03 февраля 2020

Глядя на ваше выражение XPath, вы обнаружите пару проблем:

  • Вам необходимо разместить контейнер <div>, содержащий элементы <div class="display"></div> и <div class="price"></div>.
  • Вам нужно заключить ваш селектор в (), если вы хотите извлечь элемент на основе его индекса.
  • Вы можете использовать одно выражение XPath вместо того, чтобы дважды вызывать findElement.

Вот выражение, которое я бы использовал. Обратите внимание, что он:

  • Ищет элемент <div class="Main">
  • Вмещает контейнер <div>
  • Извлекает text() с использованием XPath
  • Заворачивает селектор в (), чтобы мы могли использовать индексный аксессор

(//*[@class='Main']/*/*[starts-with(@class, 'price')])[2]/text()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...