Successfully reported this slideshow.

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

3

Share

Loading in …3
×
1 of 44
1 of 44

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

3

Share

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

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

More Related Content

More from QAFest

Related Books

Free with a 14 day trial from Scribd

See all

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!

×