XPath для элемента с одинаковыми именами классов

#c# #selenium #xpath

#c# #selenium #xpath

Вопрос:

Кто-нибудь может помочь мне получить xpath (из второго div-метки элемента span, которая является GP)

 <div class="ohg-patient-banner-suppl-info-section ohg-patient-banner-suppl-info-custom pure-u-1-5">
            <div class="ohg-patient-banner-suppl-info-component-container ohg-patient-banner-suppl-info-component-left-bordered ohg-patient-banner-suppl-info-custom" aria-label="Visit Info" role="group"><div class="ohg-patient-banner-suppl-info-section-summary" aria-hidden="false">
    
        
    
</div>
<div class="ohg-patient-banner-suppl-info-section-detail" aria-label="" aria-hidden="true">
    
        <div class="ohg-patient-banner-suppl-info-custom-field">
            <span class=" " aria-hidden="true"></span>
            
                <span class=" ohp-metadata-label">Location</span>
            
            <span class="ohg-patient-banner-suppl-info-custom-row-value-icon  " aria-hidden="true"></span>
            <span class=" ohg-patient-banner-suppl-info-value">Tauranga Hospital - Assmt Plan Unit TAU - </span>
        </div>
    
        
</div>
</div>
</div>

<div class="ohg-patient-banner-suppl-info-section ohg-patient-banner-suppl-info-custom pure-u-1-5">
            <div class="ohg-patient-banner-suppl-info-component-container ohg-patient-banner-suppl-info-component-left-bordered ohg-patient-banner-suppl-info-custom" aria-label="GP Info" role="group"><div class="ohg-patient-banner-suppl-info-section-summary" aria-hidden="false">
    
        
</div>
<div class="ohg-patient-banner-suppl-info-section-detail" aria-label="" aria-hidden="true">
    
        <div class="ohg-patient-banner-suppl-info-custom-field">
            <span class=" " aria-hidden="true"></span>
            
                <span class=" ohp-metadata-label">GP</span>
            
            <span class="ohg-patient-banner-suppl-info-custom-row-value-icon  " aria-hidden="true"></span>
            <span class=" ohg-patient-banner-suppl-info-value">-</span>
        </div>

</div>
</div>
    
</div>  

Мой XPath, который я написал, работает для первого div, и он возвращает значение Location :

 .//*[@class='ohg-patient-banner-suppl-info-section-detail']/div[@class='ohg-patient-banner-suppl-info-custom-field']/span[@class=' ohp-metadata-label']
  

Ответ №1:

Xpath:

 //*[@class='ohg-patient-banner-suppl-info-custom-field']//span[2]
  

затем вы можете использовать gettext(), чтобы получить GP в виде текста

Ответ №2:

Попробуйте это выражение XPath-1.0:

 //*[@class='ohg-patient-banner-suppl-info-section-detail']/div[@class='ohg-patient-banner-suppl-info-custom-field' and span[@class=' ohg-patient-banner-suppl-info-value']='-']/span[@class=' ohp-metadata-label']
  

Его результатом является:

GP

Ответ №3:

  1. программное решение:

ваш xpath фактически возвращает оба элемента:

Результат XPath

в вашей библиотеке selenium вы, скорее всего, получаете массив и можете выбрать второй его элемент

  1. выберите второй элемент:

если это всегда второй элемент, добавление [2] в xpath помогает, например "(.//*[@class='ohg-patient-banner-suppl-info-section-detail'])[2]/div[@class='ohg-patient-banner-suppl-info-custom-field']/span[@class=' ohp-metadata-label']"

  1. фиксированным текстом

Если у вас есть какой-либо текст на странице, который исправлен, например, Location , вы можете использовать его в качестве ссылки, а затем использовать оси ancestor и sibling

".//span[.='Location']//ancestor::div[@class='ohg-patient-banner-suppl-info-section-detail']//following-sibling::div[@class='ohg-patient-banner-suppl-info-section-detail']//span[@class=' ohp-metadata-label']"

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

1. спасибо за ответ, и я попробовал первый XPath, как вы упомянули, и я получил исключение NoSuchElementException (Сообщение = Не удается найти элемент с помощью xpath == .//*[@class=’ohg-patient-banner-suppl-info-section-detail’][2]/div[@class=’ohg-patient-banner-suppl-info-custom-field’]/span[@class= ‘ohp-metadata-label’])

2. извините, в моем ответе была ошибка, теперь ее следует исправить

Ответ №4:

Поскольку у вас нет других уникальных идентификаторов, а имя класса используется двумя промежутками, вот как вы можете идентифицировать этот промежуток на основе его индекса, и это самый короткий способ:

 xpath:  (//span[@class=' ohp-metadata-label'])[2]
  

Теперь вы можете очистить текст с помощью метода selenium getText().
Обратите внимание, что мы использовали индекс 2 для определения вашего локатора, но если html-код изменится, и новые аналогичные области будут добавлены до этого, вам нужно будет изменить индекс.