XPath содержит библиотеку встроенных функций для преобразования данных и обработки узлов.
Функции обработки наборов узлов
- node-set node() — возвращает все узлы. В отличие от «*» функция возвращает также текстовые узлы.
xpath: .//div/* <div> Текстовый узел 1 <span>текст внутри элемента</span> Текстовый узел 2 <p>снова текст внутри элемента</p> </div>
xpath: .//div/node() <div> Текстовый узел 1 <span>текст внутри элемента</span> Текстовый узел 2 <p>снова текст внутри элемента</p> </div>
- String text() — возвращает набор текстовых узлов;
xpath: .//span[text()="текст внутри элемента"] <div> Текстовый узел 1 <span>текст внутри элемента</span> Текстовый узел 2 <p>снова текст внутри элемента</p> </div>
xpath: .//span[contains(text(),"текст внутри элемента")] <div> Текстовый узел 1 <span>текст внутри элемента</span> Текстовый узел 2 <p>снова текст внутри элемента</p> </div>
- number position() — возвращает позицию элемента в множестве.
xpath: .//div/input[position()=2] или xpath: .//div/input[2] <div> <label for="login">Имя пользователя</label> <input type="text" id="login" value=""> <label for="password">Пароль</label> <input type="text" id="password" value=""> </div>
- number last() — возвращает номер последнего элемента в множестве. Функция first() не предусмотрена. Для доступа к первому элементу используйте индекс «1».
xpath: .//div/label[last()] <div> <label for="login">Имя пользователя</label> <input type="text" id="login" value=""> <label for="password">Пароль</label> <input type="text" id="password" value=""> </div>
- number count(node-set) — возвращает количество элементов в node-set.
xpath: .//div[count(span)=2] <div> <span>Авторизация</span> </div> <div> <span>Имя пользователя:</span> <input type="text" id="login" value=""> <span>Пароль</span> <input type="text" id="password" value=""> </div>
- node-set id(object) — находит элемент с уникальным идентификатором.
xpath: id('password') .//id('password') - неверный xpath <div> <label for="login">Имя пользователя</label> <input type="text" id="login" value=""> <label for="password">Пароль</label> <input type="text" id="password" value=""> </div>
Строковые функции
- string string(object) — возвращает текстовое содержимое элемента. По сути возвращает объединенное множество текстовых узлов на один уровень ниже.
- string concat(string, string, string*) — объединяет две или более строк
- number string-length(string) — возвращает длину строки.
- boolean contains(string, string) — возвращает true, если первая строка содержит вторую, иначе возвращает false.
- string substring(string, number, number) — возвращает строку вырезанную из строки начиная с указанного номера, второй параметр number (необязательный) — количество символов.
- string substring-before(string, string) — если найдена вторая строка в первой, возвращает строку до первого вхождения второй строки.
- string substring-after(string, string) — если найдена вторая строка в первой, возвращает строку после первого вхождения второй строки.
- boolean starts-with(string, string) — возвращает true если первая строка начинается со второй, иначе возвращает false.
- boolean ends-with(string, string) — возвращает true если первая строка заканчивается второй, иначе возвращает false.
- string normalize-space(string) — убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами.
- string translate(string, string, string) — заменяет символы первой строки, которые встречаются во второй строке, на соответствующие позиции символам из второй строки символы из третьей строки. translate(«cat», «abc», «ABC») вернет CAt.
xpath: .//label[contains(text(),"пользователя")] или .//label[starts-with(text(),"Имя")] <div> <label for="login">Имя пользователя</label> <input type="text" id="login" value=""> <label for="password">Пароль</label> <input type="text" id="password" value=""> </div>
Логические функции
or — логическое «или»
and — логическое «и»
= — логическое «равно»
< (<) — логическое «меньше»
> (>) — логическое «больше»
= (>=) — логическое «больше либо равно»
boolean boolean(object) — приводит объект к логическому типу;
boolean true() -возвращает истину.
boolean false() — возвращает ложь.
boolean not(boolean) — логическое отрицание, возвращает true если аргумент false и наоборот.
xpath: .//label[text()="Пароль" and @for="password"] или .//label[not(@for="login")] <div> <label for="login">Имя пользователя</label> <input type="text" id="login" value=""> <label for="password">Пароль</label> <input type="text" id="password" value=""> </div>
Числовые функции
+ — сложение
− — вычитание
* — умножение
div — обычное деление (не деление нацело!)
mod — остаток от деления
number number(object) — переводит объект в число.
number sum(node-set) — возвращает сумму множества, каждый тег множества будет преобразован в строку и из него получено число.
number floor(number) — округление аргумента в меньшую сторону.
number ceiling(number) — округление элемента в большую сторону.
number round(number) — округление числа по математическим правилам.
xpath: .//div/*[position() mod 2 = 0] <div> <label for="login">Имя пользователя</label> <input type="text" id="login" value=""> <label for="password">Пароль</label> <input type="text" id="password" value=""> </div>
Я ошибаюсь, или в примере использование логических функций у вас ошибка — выделен не тот элемент, который должен сообветствовать запросу?
Вот этому запросу
.//label[text()=»Пароль» and @for=»password»]
или
.//label[not(@for=»login»)]
соответствует вот этот элемент
Пароль
Да, спасибо, исправила ))
Спасибо, хороший мануал
спасибо, в избранное.
но вопрос — не подскажете,Как найти элемент, у которого соседний элемент ***.
[td]
[input type=»radio»/]
[label]первый[/label]
[/td]
[td]
[input type=»radio»/]
[label]второй[/label]
[/td]
вот2 rb я могу найти:
.//*[@id=’workitemForm:taxablePeriod’]/table/tbody/tr[1]/td //input[@type=’radio’]
или первый
.//*[@id=’workitemForm:taxablePeriod’]/table/tbody/tr[1]/td/div/div/span/table/tbody/tr/td[1]/input[@type=’radio’]
как найти первого, без длинного запроса?)