Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
XPath yourself
Tip’s & Trick’s
About me
Role: QA Automation
Engineer,
Scrum Master
Company: Ciklum, Betsson
Group
skype: pashko.ivan
email:
pashko.ivan@g...
XPath
● .. это язык запросов к элементам XML-документа
● .. призван реализовать навигацию по DOM в XML
● .. является станд...
XPath. Синтаксис
XPath делится на “шаги”, которые разделяются символом /. Каждый “шаг”
состоит из трех частей:
axis::node[...
XPath. Оси (axis)
Оси — это база языка XPath. Они
определяет множество елементов
относительно текущего.
axis::nodetest[pre...
XPath. Оси
//div[@class=’self’]/parent::div //div[@class=’self’]/preceding::div
//div[@class=’self’]/child::div //div[@cla...
/child::html/descendant-or-self::node()/child::body/*[position() = 1]
XPath. Оси. Полная форма
/html//body/*[1]
XPath. Оси. Сокращенная форма
XPath. Оси. Сокращения
// ~ /descendant-or-self::
@abc ~ attribute::abc
node ~ child::node
.. ~ parent::
. ~ self::
XPath. Оси. Относительный путь
//div[@class=’self’]/../../../div
<body>
<div value=’xpath me’>
<div>
<div class='self'/>
<...
XPath. Оси. Относительный путь
//div[@class=’self’]/ancestor::body/div
<body>
<div value=’xpath me’>
<div>
<div class='sel...
XPath. Оси. Относительный путь
//div[@class=’self’]/ancestor::div[2]
<div>
<div value=’xpath me’>
<div>
<div class='self'/...
.//div
<ul>
<li>
<div>FIRST</div>
</li>
</ul>
XPath. Оси. Абсолютный путь
.//div
<ul>
<li>
<div>FIRST</div>
<div>SECOND</div>
</li>
</ul>
XPath. Оси. Абсолютный путь
.//div → .//div[1]
<ul>
<li>
<div>FIRST</div>
<div>SECOND</div>
</li>
</ul>
XPath. Оси. Абсолютный путь
.//div
<ul>
<li>
<div>FIRST</div>
</li>
<li>
<div>SECOND</div>
</li>
</ul>
XPath. Оси. Абсолютный путь
.//div[1]
<ul>
<li>
<div>FIRST</div>
</li>
<li>
<div>SECOND</div>
</li>
</ul>
XPath. Оси. Абсолютный путь
.//div[1] == ./descendant-or-self::node()/div[position()=1]
./ где угодоно, среди потомков / первый div наследник
<ul>
<li...
.//div[1] → ./descendant::div[1]
./ первый div потомок
<ul>
<li>
<div>FIRST</div>
</li>
<li>
<div>SECOND</div>
</li>
</ul>...
.//div[1] → (.//div)[1]
(первый .//div из группы)
<ul>
<li>
<div>FIRST</div>
</li>
<li>
<div>SECOND</div>
</li>
</ul>
XPat...
XPath. Предикаты
P: X→ {true, false}
Неформально, предикат это выражение, которое возвращает значение
булевого типа (истин...
XPath. Функции. position()
.//div[1]
.//div[position()=1]
<ul>
<li>
<div>FIRST NODE</div>
<div>SECOND NODE</div>
</li>
</u...
XPath. Функции. text() .=
.//div[text()=’FIRST NODE’]
.//div[.=’FIRST NODE’] --inner html
<ul>
<li>
<div>FIRST NODE</div>
...
XPath. Функции. contains()
.//div[ contains(text(), ’NODE’) ]
.//div[ contains(., ’NODE’) ]
<ul>
<li>
<div>FIRST NODE</div...
XPath. Функции. contains()
.//div[ contains(@class, ’NODE’) ]
<ul>
<li>
<div class=’FIRST NODE’</div>
<div>SECOND NODE</di...
XPath. Функции. not()
.//div[ not(@class) ]
<ul>
<li>
<div class=’FIRST NODE’</div>
<div>SECOND NODE</div>
</li>
</ul>
XPath. Функции. last()
.//div[ last() ]
<ul>
<li>
<div class=’FIRST NODE’</div>
<div>SECOND NODE</div>
<div>last node</div...
XPath. Функции. last()
.//div[ last() - 1]
<ul>
<li>
<div class=’FIRST NODE’</div>
<div>SECOND NODE</div>
<div>last node</...
XPath. Фильтры. Мульти-фильтры.
При множественной фильтрации удобно использовать
последовательную форму:
div[..a..][..b..]...
XPath. Порядок фильтрации
//div[1][@class]
<div>
<div > </div>
<div class='c11'></div>
<div class='c12'></div>
</div>
<div...
XPath. Порядок фильтрации
(//div[1])[@class]
<div>
<div > </div>
<div class='c11'></div>
<div class='c12'></div>
</div>
<d...
XPath. Порядок фильтрации
//div[@class][1]
<div>
<div> </div>
<div class='c11'></div>
<div class='c12'></div>
</div>
<div>...
XPath. Порядок фильтрации
(//div[@class])[1]
<div>
<div> </div>
<div class='c11'></div>
<div class='c12'></div>
</div>
<di...
Комбинируем все вместе
XPath. Таблицы
Получить все Last Name из таблицы:
//tr/td[2]
<table>
<thead>
<tr>
<th>First Name</th>
<th>Last Name</th>
<...
XPath. Таблицы
Получить все Last Name из таблицы:
//tr/td[2]
<table>
<thead>
<tr>
<th>First Name</th>
<th>Middle Name</th>...
XPath. Таблицы.
//tr/td[ index_of (//th(.=’Last Name’)) ]
К сожалению, index_of не существует, но :
index_of == count()
<t...
XPath. Таблицы.
a = //thead/tr/th[.='Last Name'] /
preceding-sibling::th
//tr/td[count(a) + 1]
но, +1 не учитывает сам еле...
XPath. Таблицы.
a = //thead/tr/th[.='Last Name'] /
preceding-sibling::th
+
b = //thead/tr/th[.='Last Name']
count(a) + cou...
XPath. Таблицы.
tr/th[
count( //thead/tr/th[.='Last Name']/
preceding-sibling::th )
+ count( //thead/tr/th[.='Last Name'] ...
XPath. Таблицы.
tr/th[
count( //thead/tr/th[.='Last Name']/
preceding-sibling::th )
+ count( //thead/tr/th[.='Last Name'] ...
Спасибо за внимание!
Q & A
◦ Xpath basics (W3C) -
http://www.w3schools.com/xpath
/default.asp
◦ Xpath basics(Microsoft) -
https://msdn.microsof...
Thank you!
Upcoming SlideShare
Loading in …5
×

QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks

1,203 views

Published on

Все мы знаем, что такое XPath и широко используем его в автоматизации. Но неправильное построение XPath выражений приводит тестровщиков в ужас, делает наши тесты хрупкими, и как результат - получаем долгие вечера отладки кода. В докладе я расскажу о том, что такое XPath, о распространенных ошибках при работе с ним, и как их избегать. Будет интересно и начинающим тестировщикам, и экспертам в области автоматизации.

Published in: Education
  • Be the first to comment

QA Fest 2015. Иван Пашко. XPath yourself. Tips & Tricks

  1. 1. XPath yourself Tip’s & Trick’s
  2. 2. About me Role: QA Automation Engineer, Scrum Master Company: Ciklum, Betsson Group skype: pashko.ivan email: pashko.ivan@gmail.com
  3. 3. XPath ● .. это язык запросов к элементам XML-документа ● .. призван реализовать навигацию по DOM в XML ● .. является стандартом консорциума W3C ● .. популярный “локатор” автоматизации UI (c) Wiki
  4. 4. XPath. Синтаксис XPath делится на “шаги”, которые разделяются символом /. Каждый “шаг” состоит из трех частей: axis::node[predicate] / axis::node[predicate] / axis::node[predicate] axis (ось, обязательная часть) node (узел, обязательная часть) predicates (предикат, дополнительное условие, необязательная часть)
  5. 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
  6. 6. XPath. Оси //div[@class=’self’]/parent::div //div[@class=’self’]/preceding::div //div[@class=’self’]/child::div //div[@class=’self’]/following::div <div class=’parent’> <div class='preceding'/> <div class='self'> <div class='child'/> </div> <div class='following'></div> </div> </div> ancestors descendant
  7. 7. /child::html/descendant-or-self::node()/child::body/*[position() = 1] XPath. Оси. Полная форма
  8. 8. /html//body/*[1] XPath. Оси. Сокращенная форма
  9. 9. XPath. Оси. Сокращения // ~ /descendant-or-self:: @abc ~ attribute::abc node ~ child::node .. ~ parent:: . ~ self::
  10. 10. XPath. Оси. Относительный путь //div[@class=’self’]/../../../div <body> <div value=’xpath me’> <div> <div class='self'/> </div> </div> </body>
  11. 11. XPath. Оси. Относительный путь //div[@class=’self’]/ancestor::body/div <body> <div value=’xpath me’> <div> <div class='self'/> </div> </div> </body>
  12. 12. XPath. Оси. Относительный путь //div[@class=’self’]/ancestor::div[2] <div> <div value=’xpath me’> <div> <div class='self'/> </div> </div> </div>
  13. 13. .//div <ul> <li> <div>FIRST</div> </li> </ul> XPath. Оси. Абсолютный путь
  14. 14. .//div <ul> <li> <div>FIRST</div> <div>SECOND</div> </li> </ul> XPath. Оси. Абсолютный путь
  15. 15. .//div → .//div[1] <ul> <li> <div>FIRST</div> <div>SECOND</div> </li> </ul> XPath. Оси. Абсолютный путь
  16. 16. .//div <ul> <li> <div>FIRST</div> </li> <li> <div>SECOND</div> </li> </ul> XPath. Оси. Абсолютный путь
  17. 17. .//div[1] <ul> <li> <div>FIRST</div> </li> <li> <div>SECOND</div> </li> </ul> XPath. Оси. Абсолютный путь
  18. 18. .//div[1] == ./descendant-or-self::node()/div[position()=1] ./ где угодоно, среди потомков / первый div наследник <ul> <li> <div>FIRST</div> </li> <li> <div>SECOND</div> </li> </ul> XPath. Оси. Абсолютный путь
  19. 19. .//div[1] → ./descendant::div[1] ./ первый div потомок <ul> <li> <div>FIRST</div> </li> <li> <div>SECOND</div> </li> </ul> XPath. Оси. Абсолютный путь
  20. 20. .//div[1] → (.//div)[1] (первый .//div из группы) <ul> <li> <div>FIRST</div> </li> <li> <div>SECOND</div> </li> </ul> XPath. Оси. Абсолютный путь
  21. 21. XPath. Предикаты P: X→ {true, false} Неформально, предикат это выражение, которое возвращает значение булевого типа (истина или ложь) в зависимости от входящих параметров. Предикаты в Xpath используются для фильтрации. В качестве параметров, могут быть использованы функции: position(), name(), count(), contains(), . = и т.д.
  22. 22. XPath. Функции. position() .//div[1] .//div[position()=1] <ul> <li> <div>FIRST NODE</div> <div>SECOND NODE</div> </li> </ul>
  23. 23. XPath. Функции. text() .= .//div[text()=’FIRST NODE’] .//div[.=’FIRST NODE’] --inner html <ul> <li> <div>FIRST NODE</div> <div>SECOND NODE</div> </li> </ul>
  24. 24. XPath. Функции. contains() .//div[ contains(text(), ’NODE’) ] .//div[ contains(., ’NODE’) ] <ul> <li> <div>FIRST NODE</div> <div>SECOND NODE</div> </li> </ul>
  25. 25. XPath. Функции. contains() .//div[ contains(@class, ’NODE’) ] <ul> <li> <div class=’FIRST NODE’</div> <div>SECOND NODE</div> </li> </ul>
  26. 26. XPath. Функции. not() .//div[ not(@class) ] <ul> <li> <div class=’FIRST NODE’</div> <div>SECOND NODE</div> </li> </ul>
  27. 27. XPath. Функции. last() .//div[ last() ] <ul> <li> <div class=’FIRST NODE’</div> <div>SECOND NODE</div> <div>last node</div> </li> </ul>
  28. 28. XPath. Функции. last() .//div[ last() - 1] <ul> <li> <div class=’FIRST NODE’</div> <div>SECOND NODE</div> <div>last node</div> </li> </ul>
  29. 29. XPath. Фильтры. Мульти-фильтры. При множественной фильтрации удобно использовать последовательную форму: div[..a..][..b..][..c..] == div[ (..a..) and (..b..) and (..c..) ] !Но, не для функций : position(), last() //div[1][@class] != //div[@class][1]
  30. 30. XPath. Порядок фильтрации //div[1][@class] <div> <div > </div> <div class='c11'></div> <div class='c12'></div> </div> <div> <div class='c21'></div> <div class='c22'></div> </div>
  31. 31. XPath. Порядок фильтрации (//div[1])[@class] <div> <div > </div> <div class='c11'></div> <div class='c12'></div> </div> <div> <div class='c21'></div> <div class='c22'></div> </div>
  32. 32. XPath. Порядок фильтрации //div[@class][1] <div> <div> </div> <div class='c11'></div> <div class='c12'></div> </div> <div> <div class='c21'></div> <div class='c22'></div> </div>
  33. 33. XPath. Порядок фильтрации (//div[@class])[1] <div> <div> </div> <div class='c11'></div> <div class='c12'></div> </div> <div> <div class='c21'></div> <div class='c22'></div> </div>
  34. 34. Комбинируем все вместе
  35. 35. XPath. Таблицы Получить все Last Name из таблицы: //tr/td[2] <table> <thead> <tr> <th>First Name</th> <th>Last Name</th> </tr> </thead> <tbody> <tr> <td>NAME-1</td> <td>LASTNAME-1</td> </tr> <tr> <td>NAME-2</td> <td>LASTNAME-2</td> </tr> </tbody> </table>
  36. 36. XPath. Таблицы Получить все Last Name из таблицы: //tr/td[2] <table> <thead> <tr> <th>First Name</th> <th>Middle Name</th> <th>Last Name</th> </tr> </thead> <tbody> <tr> <td>NAME-1</td> <td>M-NAME-1</td> <td>LASTNAME-1</td> </tr> <tr> <td>NAME-2</td> <td>M-NAME-2</td> <td>LASTNAME-2</td> </tr> </tbody> </table>
  37. 37. XPath. Таблицы. //tr/td[ index_of (//th(.=’Last Name’)) ] К сожалению, index_of не существует, но : index_of == count() <table> <thead> <tr> <th>First Name</th> <th>Middle Name</th> <th>Last Name</th> </tr> </thead> <tbody> <tr> <td>NAME-1</td> <td>M-NAME-1</td> <td>LASTNAME-1</td> </tr> <tr> <td>NAME-2</td> <td>M-NAME-2</td> <td>LASTNAME-2</td> </tr> </tbody> </table>
  38. 38. XPath. Таблицы. a = //thead/tr/th[.='Last Name'] / preceding-sibling::th //tr/td[count(a) + 1] но, +1 не учитывает сам елемент <th>Last Name</th> <table> <thead> <tr> <th>First Name</th> <th>Middle Name</th> <th>Last Name</th> </tr> </thead> <tbody> <tr> <td>NAME-1</td> <td>M-NAME-1</td> <td>LASTNAME-1</td> </tr> <tr> <td>NAME-2</td> <td>M-NAME-2</td> <td>LASTNAME-2</td> </tr> </tbody> </table>
  39. 39. XPath. Таблицы. a = //thead/tr/th[.='Last Name'] / preceding-sibling::th + b = //thead/tr/th[.='Last Name'] count(a) + count(b) <table> <thead> <tr> <th>First Name</th> <th>Middle Name</th> <th>Last Name</th> </tr> </thead> <tbody> <tr> <td>NAME-1</td> <td>M-NAME-1</td> <td>LASTNAME-1</td> </tr> <tr> <td>NAME-2</td> <td>M-NAME-2</td> <td>LASTNAME-2</td> </tr> </tbody> </table>
  40. 40. XPath. Таблицы. tr/th[ count( //thead/tr/th[.='Last Name']/ preceding-sibling::th ) + count( //thead/tr/th[.='Last Name'] ) <table> <thead> <tr> <th>First Name</th> <th>Middle Name</th> <th>Last Name</th> </tr> </thead> <tbody> <tr> <td>NAME-1</td> <td>M-NAME-1</td> <td>LASTNAME-1</td> </tr> <tr> <td>NAME-2</td> <td>M-NAME-2</td> <td>LASTNAME-2</td> </tr> </tbody> </table>
  41. 41. XPath. Таблицы. tr/th[ count( //thead/tr/th[.='Last Name']/ preceding-sibling::th ) + count( //thead/tr/th[.='Last Name'] ) <table> <thead> <tr> <th>First Name</th> <th>Last Name</th> </tr> </thead> <tbody> <tr> <td>NAME-1</td> <td>LASTNAME-1</td> </tr> <tr> <td>NAME-2</td> <td>LASTNAME-2</td> </tr> </tbody> </table>
  42. 42. Спасибо за внимание!
  43. 43. Q & A ◦ Xpath basics (W3C) - http://www.w3schools.com/xpath /default.asp ◦ Xpath basics(Microsoft) - https://msdn.microsoft.com/en- us/library/ms256115(v=vs.110).as px ◦ Xpath functions - http://www.w3schools.com/xpath /xpath_functions.asp ◦ Examples - http://www.xmlplease.com/axis http://www.imagesbuddy.com/images/109/2013/12/bored-people-graphic.jpg
  44. 44. Thank you!

×