Все мы знаем, что такое XPath и широко используем его в автоматизации. Но неправильное построение XPath выражений приводит тестровщиков в ужас, делает наши тесты хрупкими, и как результат - получаем долгие вечера отладки кода. В докладе я расскажу о том, что такое XPath, о распространенных ошибках при работе с ним, и как их избегать. Будет интересно и начинающим тестировщикам, и экспертам в области автоматизации.
2. About me
Role: QA Automation
Engineer,
Scrum Master
Company: Ciklum, Betsson
Group
skype: pashko.ivan
email:
pashko.ivan@gmail.com
3. XPath
● .. это язык запросов к элементам XML-документа
● .. призван реализовать навигацию по DOM в XML
● .. является стандартом консорциума W3C
● .. популярный “локатор” автоматизации UI
(c) Wiki
4. XPath. Синтаксис
XPath делится на “шаги”, которые разделяются символом /. Каждый “шаг”
состоит из трех частей:
axis::node[predicate] / axis::node[predicate] / axis::node[predicate]
axis (ось, обязательная часть)
node (узел, обязательная часть)
predicates (предикат, дополнительное условие, необязательная
часть)
5. XPath. Оси (axis)
Оси — это база языка XPath. Они
определяет множество елементов
относительно текущего.
axis::nodetest[predicate]
● parent:: | child::
● following:: | preceding:: (-sibling)
● ancestor:: | descendant:: (-or-self)
http://docstore.mik.ua/orelly/xml/jxslt/figs/jxt_0204.gif
19. .//div[1] → ./descendant::div[1]
./ первый div потомок
<ul>
<li>
<div>FIRST</div>
</li>
<li>
<div>SECOND</div>
</li>
</ul>
XPath. Оси. Абсолютный путь
20. .//div[1] → (.//div)[1]
(первый .//div из группы)
<ul>
<li>
<div>FIRST</div>
</li>
<li>
<div>SECOND</div>
</li>
</ul>
XPath. Оси. Абсолютный путь
21. XPath. Предикаты
P: X→ {true, false}
Неформально, предикат это выражение, которое возвращает значение
булевого типа (истина или ложь) в зависимости от входящих параметров.
Предикаты в Xpath используются для фильтрации.
В качестве параметров, могут быть использованы функции: position(),
name(), count(), contains(), . = и т.д.
29. XPath. Фильтры. Мульти-фильтры.
При множественной фильтрации удобно использовать
последовательную форму:
div[..a..][..b..][..c..] == div[ (..a..) and (..b..) and (..c..) ]
!Но, не для функций : position(), last()
//div[1][@class] != //div[@class][1]