Первый и последний элемент с помощью XPATH [Решено]



  • Привет ребята.

    Вопрос вот в чём:

    На странице есть несколько элементов со свойством aria-expanded="true". Все они находятся внутри контейнера с id="SettingsPage_Content". Мне нужно взять ТОЛЬКО ПЕРВЫЙ из найденных элементов

    Делаю селектор XPATH

    >XPATH> .//*[@id="SettingsPage_Content"]//*[@aria-expanded="true"][1]
    

    Не работает (выбирает все элементы с aria-expanded="true" вместо только первого), хотя должен, поскольку синтаксис в соответствии со справочником по XPATH. Если отбросить окончание [1], то разницы никакой.

    Да, можно решить проблему с помощью >AT>, вот так:

    >XPATH> .//*[@id="SettingsPage_Content"]//*[@aria-expanded="true"] >AT>0
    

    Однако как в таком случае выбрать последний элемент из этого списка, ведь вот так:

    >XPATH> .//*[@id="SettingsPage_Content"]//*[@aria-expanded="true"][last()]
    

    Тоже не работает?



  • @dobry-op said in Первый и последний элемент с помощью XPATH:

    Привет ребята.

    Вопрос вот в чём:

    На странице есть несколько элементов со свойством aria-expanded="true". Все они находятся внутри контейнера с id="SettingsPage_Content". Мне нужно взять ТОЛЬКО ПЕРВЫЙ из найденных элементов

    Делаю селектор XPATH

    >XPATH> .//*[@id="SettingsPage_Content"]//*[@aria-expanded="true"][1]
    

    Не работает (выбирает все элементы с aria-expanded="true" вместо только первого), хотя должен, поскольку синтаксис в соответствии со справочником по XPATH. Если отбросить окончание [1], то разницы никакой.

    Да, можно решить проблему с помощью >AT>, вот так:

    >XPATH> .//*[@id="SettingsPage_Content"]//*[@aria-expanded="true"] >AT>0
    

    Однако как в таком случае выбрать последний элемент из этого списка, ведь вот так:

    >XPATH> .//*[@id="SettingsPage_Content"]//*[@aria-expanded="true"][last()]
    

    Тоже не работает?

    скорее всего неправильно само выражение, так как last() работает корректно в BAS. Приложите файлом html код страницы к которой применяете xpath



  • @Fox
    это FB, там реакт, так что html не получится.
    Для примера можешь зайти на страницу настроек уведомлений

    https://www.facebook.com/settings?tab=notifications

    и раскрыть любой раздел настроек

    Моими примерами будет находить все три элемента, а мне нужен первый и последний. Первый вытаскивается с помощью >AT>0. Последний не понимаю как вытащить.

    1292805d-9b42-49d2-ad6f-d384eed0f618-image.png



  • скорее всего неправильно само выражение, так как last() работает корректно в BAS. Приложите файлом html код страницы к которой применяете xpath

    Короче опытным путём в чате подсказали что порядковый предикат должен стоять ПЕРЕД предикатом-фильтром по свойствам.
    Если нужен первый элемент:

    >XPATH> .//*[@id="SettingsPage_Content"]//*[1]/*[@aria-expanded="true"]
    

    или если нужен последний элемент:

    >XPATH> .//*[@id="SettingsPage_Content"]//*[last()]/*[@aria-expanded="true"]
    


  • правда теперь не пойму как тут работает конструкция /* между порядковым и предикатом-фильтром по свойству

    [1]/*[@aria-expanded="true"]
    

    ведь они не вложены друг в друга, а один и тот же элемент



  • короче полностью разобрался в этом вопросе
    всё что выше - не правильное решение. Если кто желает обмазаться пониманием того как на самом деле работает, предикат last() и [0] рекомендую поиграться вот тут например: http://xpather.com/

    код для примера:

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

    Правильным решением моего вопроса оказалось вот такое решение (обратите внимание на круглые скобки):

    (//div//input)[last()]
    

    То есть мы сначала выбираем все инпуты на странице, а потом ко всей выборке применяем предикат last()

    Разница между

    //div//input[last()]
    

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

    Мало ли кому пригодится мой опыт.


Log in to reply