Если сайт на одном языке, самое простое сделать так:
MATCH>Авторизоваться
MATCH>Войти
и тд.
Привет ребята.
Вопрос вот в чём:
На странице есть несколько элементов со свойством 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. Последний не понимаю как вытащить.

скорее всего неправильно само выражение, так как last() работает корректно в BAS. Приложите файлом html код страницы к которой применяете xpath
Короче опытным путём в чате подсказали что порядковый предикат должен стоять ПЕРЕД предикатом-фильтром по свойствам.
Если нужен первый элемент:
>XPATH> .//*[@id="SettingsPage_Content"]//*[1]/*[@aria-expanded="true"]
или если нужен последний элемент:
>XPATH> .//*[@id="SettingsPage_Content"]//*[last()]/*[@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()]
в том, что крайний пример выберет все последние инпуты во всех последних контейнерах. То есть их будет несколько. В то время как круглые скобки указывают сначала сделать выборку по всем инпутам, на странице, а потом уже среди них взять самый последний.
Мало ли кому пригодится мой опыт.