@vardot/varbase-e2e 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/AGENTS.md +148 -0
  2. package/CLAUDE.md +544 -0
  3. package/README.md +22 -0
  4. package/bin/generate-reports.js +363 -0
  5. package/bin/init-varbase-e2e.js +330 -0
  6. package/bin/postinstall.js +26 -0
  7. package/cucumber.js +125 -0
  8. package/docs/00-quick-start.md +102 -0
  9. package/docs/01-getting-started.md +102 -0
  10. package/docs/02-bbr-smart-waits.md +77 -0
  11. package/docs/03-selector-registry.md +95 -0
  12. package/docs/04-step-reference.md +801 -0
  13. package/docs/05-web-first-assertions.md +91 -0
  14. package/docs/06-network-and-dialogs.md +83 -0
  15. package/docs/07-auth-state.md +75 -0
  16. package/docs/08-clock-mocking.md +59 -0
  17. package/docs/09-api-testing.md +114 -0
  18. package/docs/10-accessibility.md +167 -0
  19. package/docs/11-debugging.md +129 -0
  20. package/docs/12-ai-agent-guide.md +338 -0
  21. package/docs/13-faq.md +236 -0
  22. package/docs/14-recipes-cookbook.md +255 -0
  23. package/docs/15-tag-conventions.md +76 -0
  24. package/docs/16-ci-cd.md +90 -0
  25. package/docs/README.md +125 -0
  26. package/docs/advanced-screenshots/then-i-save-fullscreen-screenshot.md +36 -0
  27. package/docs/advanced-screenshots/then-i-save-width-x-height-screenshot.md +34 -0
  28. package/docs/advanced-screenshots/when-i-save-screenshot-name-filename.md +45 -0
  29. package/docs/advanced-screenshots.md +52 -0
  30. package/docs/advanced-selectors.md +18 -0
  31. package/docs/api-step-definitions.md +45 -0
  32. package/docs/global-settings.md +267 -0
  33. package/docs/install-varbase-e2e/ddev-varbase-e2e.md +52 -0
  34. package/docs/install-varbase-e2e.md +34 -0
  35. package/docs/overview.md +40 -0
  36. package/docs/step-definitions/given-i-am-anonymous-user.md +67 -0
  37. package/docs/step-definitions/given-i-am-homepage.md +68 -0
  38. package/docs/step-definitions/given-i-am-specific-page.md +72 -0
  39. package/docs/step-definitions/then-i-should-be.md +56 -0
  40. package/docs/step-definitions/then-i-should-see.md +62 -0
  41. package/docs/step-definitions/then-item-checkbox.md +54 -0
  42. package/docs/step-definitions/then-item-link-should-contain-url.md +84 -0
  43. package/docs/step-definitions/then-item-should-contain.md +67 -0
  44. package/docs/step-definitions/then-radio-button-value-should-be-selected.md +68 -0
  45. package/docs/step-definitions/then-response-status-code-should-be-number.md +69 -0
  46. package/docs/step-definitions/then-value-radio-button-selected.md +62 -0
  47. package/docs/step-definitions/when-i-attach-file-file-name-element.md +71 -0
  48. package/docs/step-definitions/when-i-check-checkbox.md +60 -0
  49. package/docs/step-definitions/when-i-click-link.md +51 -0
  50. package/docs/step-definitions/when-i-click-operation-text-row.md +71 -0
  51. package/docs/step-definitions/when-i-fill.md +59 -0
  52. package/docs/step-definitions/when-i-go-homepage.md +60 -0
  53. package/docs/step-definitions/when-i-go-specific-page.md +67 -0
  54. package/docs/step-definitions/when-i-move-backward-one-page.md +49 -0
  55. package/docs/step-definitions/when-i-move-forward-one-page.md +58 -0
  56. package/docs/step-definitions/when-i-press-button.md +58 -0
  57. package/docs/step-definitions/when-i-reload-page.md +51 -0
  58. package/docs/step-definitions/when-i-scroll.md +73 -0
  59. package/docs/step-definitions/when-i-select-option-select-list.md +53 -0
  60. package/docs/step-definitions/when-i-select-radio-button-value.md +62 -0
  61. package/docs/step-definitions/when-i-uncheck-checkbox.md +57 -0
  62. package/docs/step-definitions/when-i-wait-ajax-finish.md +64 -0
  63. package/docs/step-definitions/when-i-wait.md +62 -0
  64. package/docs/step-definitions.md +82 -0
  65. package/docs/steps/README.md +137 -0
  66. package/docs/steps/a11y.md +731 -0
  67. package/docs/steps/action.md +181 -0
  68. package/docs/steps/api.md +679 -0
  69. package/docs/steps/assertion.md +328 -0
  70. package/docs/steps/auth.md +108 -0
  71. package/docs/steps/clock.md +171 -0
  72. package/docs/steps/cookie.md +293 -0
  73. package/docs/steps/debug.md +52 -0
  74. package/docs/steps/dialog.md +226 -0
  75. package/docs/steps/drupal-canvas.md +414 -0
  76. package/docs/steps/drupal-ckeditor.md +118 -0
  77. package/docs/steps/drupal-core.md +688 -0
  78. package/docs/steps/drupal-layout-builder.md +437 -0
  79. package/docs/steps/drupal-media.md +107 -0
  80. package/docs/steps/drupal-moderation.md +81 -0
  81. package/docs/steps/drupal-paragraphs.md +36 -0
  82. package/docs/steps/element.md +455 -0
  83. package/docs/steps/field.md +648 -0
  84. package/docs/steps/file-download.md +235 -0
  85. package/docs/steps/form.md +344 -0
  86. package/docs/steps/iframe.md +248 -0
  87. package/docs/steps/input.md +220 -0
  88. package/docs/steps/javascript.md +111 -0
  89. package/docs/steps/keyboard.md +107 -0
  90. package/docs/steps/link.md +217 -0
  91. package/docs/steps/metatag.md +99 -0
  92. package/docs/steps/modal.md +232 -0
  93. package/docs/steps/navigation.md +275 -0
  94. package/docs/steps/network.md +284 -0
  95. package/docs/steps/path.md +203 -0
  96. package/docs/steps/response.md +102 -0
  97. package/docs/steps/responsive.md +139 -0
  98. package/docs/steps/rest.md +140 -0
  99. package/docs/steps/screenshot.md +211 -0
  100. package/docs/steps/scroll.md +266 -0
  101. package/docs/steps/selectors.md +848 -0
  102. package/docs/steps/storage.md +254 -0
  103. package/docs/steps/table.md +216 -0
  104. package/docs/steps/varbase.md +391 -0
  105. package/docs/steps/video.md +111 -0
  106. package/docs/steps/wait.md +553 -0
  107. package/docs/steps/web-first.md +289 -0
  108. package/docs/steps/xml.md +505 -0
  109. package/docs/steps/yaml.md +951 -0
  110. package/examples/a11y.html +31 -0
  111. package/examples/about-us.html +11 -0
  112. package/examples/account.html +32 -0
  113. package/examples/ajax-wait-examples.html +147 -0
  114. package/examples/contact-us.html +10 -0
  115. package/examples/cookies.html +10 -0
  116. package/examples/date.html +12 -0
  117. package/examples/dynamic-examples.html +498 -0
  118. package/examples/element.html +11 -0
  119. package/examples/example-api.json +28 -0
  120. package/examples/existing-page.html +11 -0
  121. package/examples/field.html +24 -0
  122. package/examples/index.html +37 -0
  123. package/examples/keyboard.html +11 -0
  124. package/examples/links.html +9 -0
  125. package/examples/modal.html +14 -0
  126. package/examples/path.html +3 -0
  127. package/examples/table.html +13 -0
  128. package/examples/test--modal-dialogs.html +252 -0
  129. package/examples/test--then--i-should--not--see-text-in-element.html +48 -0
  130. package/examples/test--then--i-should--see-text-in-element.html +48 -0
  131. package/examples/test--then--i-should--see-text-matching-pattern.html +31 -0
  132. package/examples/test--then--i-should-see-text-in-table-row.html +232 -0
  133. package/examples/test--then--the-checkbox-checked.html +68 -0
  134. package/examples/test--then--the-element-should_not-contain-cssproperty.html +47 -0
  135. package/examples/test--then--the-link-should-contain.html +21 -0
  136. package/examples/test--when--i-additionally-select.html +27 -0
  137. package/examples/test--when--i-attach-file-to-feild.html +50 -0
  138. package/examples/test--when--i-check-uncheck-checkbox.html +47 -0
  139. package/examples/test--when--i-click-link.html +18 -0
  140. package/examples/test--when--i-click-text-in-table-row.html +178 -0
  141. package/examples/test--when--i-fill-in.html +48 -0
  142. package/examples/test--when--i-press-button.html +31 -0
  143. package/examples/test--when--i-reload-page.html +27 -0
  144. package/examples/test--when--i-scroll-functionality.html +177 -0
  145. package/examples/test--when--i-scroll-left-right-functionality.html +149 -0
  146. package/examples/test--when--i-select-option-from-dropdownlist.html +35 -0
  147. package/examples/test--when--i-select-radio-button.html +95 -0
  148. package/examples/test--when-i-wait-max-of-time.html +39 -0
  149. package/examples/test--when-i-wait-page-until-is-loaded.html +47 -0
  150. package/examples/test--when-i-wait-specific-time.html +39 -0
  151. package/examples/test-acceptable-url-path.html +11 -0
  152. package/examples/video-demo.html +43 -0
  153. package/package.json +56 -0
  154. package/playwright.config.ts +39 -0
  155. package/tests/assets/test-document.pdf +14 -0
  156. package/tests/assets/vardot.png +0 -0
  157. package/tests/features/a11y.feature +39 -0
  158. package/tests/features/ajax-wait-examples.feature +24 -0
  159. package/tests/features/api-step-definitions-individual.feature +185 -0
  160. package/tests/features/complete-api-testing-examples.feature +205 -0
  161. package/tests/features/cookie.feature +13 -0
  162. package/tests/features/date.feature +11 -0
  163. package/tests/features/dynamic-content-examples.feature +156 -0
  164. package/tests/features/element.feature +16 -0
  165. package/tests/features/field.feature +25 -0
  166. package/tests/features/keyboard.feature +10 -0
  167. package/tests/features/link.feature +11 -0
  168. package/tests/features/modal-advanced-example.feature +54 -0
  169. package/tests/features/modal-basic-example.feature +42 -0
  170. package/tests/features/modal-error-handling-example.feature +37 -0
  171. package/tests/features/modal.feature +11 -0
  172. package/tests/features/path.feature +16 -0
  173. package/tests/features/response.feature +8 -0
  174. package/tests/features/responsive.feature +10 -0
  175. package/tests/features/table.feature +18 -0
  176. package/tests/features/test--given--i-am-an-anonymous-user.feature +10 -0
  177. package/tests/features/test--given--i-am-on-homepage.feature +16 -0
  178. package/tests/features/test--then--i-save-screenshot.feature +33 -0
  179. package/tests/features/test--then--i-see-locator.feature +320 -0
  180. package/tests/features/test--then--i-should--not--see-text-in-element.feature +13 -0
  181. package/tests/features/test--then--i-should--see-text-in-element-by-attr.feature +10 -0
  182. package/tests/features/test--then--i-should--see-text-in-element.feature +10 -0
  183. package/tests/features/test--then--i-should--see-text-matching-pattern-in-element.feature +13 -0
  184. package/tests/features/test--then--i-should--see-text-matching-pattern.feature +18 -0
  185. package/tests/features/test--then--i-should-be-on-page.feature +10 -0
  186. package/tests/features/test--then--i-should-be-on-the-homepage.feature +10 -0
  187. package/tests/features/test--then--i-should-not-see-an-element-by-attr.feature +8 -0
  188. package/tests/features/test--then--i-should-not-see-an-element.feature +8 -0
  189. package/tests/features/test--then--i-should-see-an-element-by-attr.feature +8 -0
  190. package/tests/features/test--then--i-should-see-an-element.feature +8 -0
  191. package/tests/features/test--then--i-should-see-n-elements.feature +24 -0
  192. package/tests/features/test--then--i-should-see-text-in-table-row.feature +96 -0
  193. package/tests/features/test--then--print-current-url-and-response.feature +21 -0
  194. package/tests/features/test--then--the-checkbox-is-checked.feature +18 -0
  195. package/tests/features/test--then--the-checkbox-should-be-checked.feature +16 -0
  196. package/tests/features/test--then--the-element-should-contain-cssproperty.feature +9 -0
  197. package/tests/features/test--then--the-element-should-not-contain-cssproperty.feature +10 -0
  198. package/tests/features/test--then--the-field-should-contain-value.feature +11 -0
  199. package/tests/features/test--then--the-response-should-contain.feature +11 -0
  200. package/tests/features/test--then--the-response-status-code-should-be.feature +31 -0
  201. package/tests/features/test--then--the-url-should-match.feature +7 -0
  202. package/tests/features/test--then-the-link-should-contain-by-attribute.feature +18 -0
  203. package/tests/features/test--then-the-link-should-contain.feature +7 -0
  204. package/tests/features/test--when--i-additionally-select.feature +30 -0
  205. package/tests/features/test--when--i-attach-file-to-feild.feature +9 -0
  206. package/tests/features/test--when--i-check-checkbox.feature +21 -0
  207. package/tests/features/test--when--i-click-link-by-attribute.feature +21 -0
  208. package/tests/features/test--when--i-click-link.feature +9 -0
  209. package/tests/features/test--when--i-click-text-in-table-row.feature +37 -0
  210. package/tests/features/test--when--i-fill-in-by-attr.feature +31 -0
  211. package/tests/features/test--when--i-fill-in-table-by-attr.feature +19 -0
  212. package/tests/features/test--when--i-fill-in.feature +32 -0
  213. package/tests/features/test--when--i-follow.feature +22 -0
  214. package/tests/features/test--when--i-go-to-homepage.feature +9 -0
  215. package/tests/features/test--when--i-move-forward-backward-one-page.feature +14 -0
  216. package/tests/features/test--when--i-press-button-by-attribute.feature +18 -0
  217. package/tests/features/test--when--i-press-button.feature +13 -0
  218. package/tests/features/test--when--i-reload-page.feature +11 -0
  219. package/tests/features/test--when--i-scroll-left-right.feature +48 -0
  220. package/tests/features/test--when--i-scroll.feature +48 -0
  221. package/tests/features/test--when--i-select-option-from-dropdownlist.feature +21 -0
  222. package/tests/features/test--when--i-select-radio-button.feature +37 -0
  223. package/tests/features/test--when--i-wait-page-is-loaded.feature +8 -0
  224. package/tests/features/test--when--i-wait-time.feature +21 -0
  225. package/tests/features/video.feature +18 -0
  226. package/tests/features/wait.feature +7 -0
  227. package/tests/features/yaml.feature +102 -0
  228. package/tests/selectors/_canonical-keys.json +113 -0
  229. package/tests/selectors/back-end-selectors.json +19 -0
  230. package/tests/selectors/cms-contentful-admin.json +35 -0
  231. package/tests/selectors/cms-craft-admin.json +39 -0
  232. package/tests/selectors/cms-drupal-cms-gin.json +56 -0
  233. package/tests/selectors/cms-drupal-core-claro.json +50 -0
  234. package/tests/selectors/cms-generic-admin.json +34 -0
  235. package/tests/selectors/cms-ghost-admin.json +34 -0
  236. package/tests/selectors/cms-joomla-admin.json +41 -0
  237. package/tests/selectors/cms-magento2-admin.json +32 -0
  238. package/tests/selectors/cms-prestashop-admin.json +38 -0
  239. package/tests/selectors/cms-shopify-admin.json +25 -0
  240. package/tests/selectors/cms-strapi-admin.json +42 -0
  241. package/tests/selectors/cms-typo3-admin.json +41 -0
  242. package/tests/selectors/cms-woocommerce-front.json +50 -0
  243. package/tests/selectors/cms-wordpress-admin.json +31 -0
  244. package/tests/selectors/framework-ant-design.json +80 -0
  245. package/tests/selectors/framework-bootstrap.json +86 -0
  246. package/tests/selectors/framework-bulma.json +74 -0
  247. package/tests/selectors/framework-chakra.json +58 -0
  248. package/tests/selectors/framework-foundation.json +51 -0
  249. package/tests/selectors/framework-material-ui.json +72 -0
  250. package/tests/selectors/framework-shadcn.json +51 -0
  251. package/tests/selectors/framework-tailwind.json +40 -0
  252. package/tests/selectors/framework-vuetify.json +61 -0
  253. package/tests/selectors/front-end-selectors.json +16 -0
  254. package/tests/selectors/homepage-selectors.json +13 -0
  255. package/tests/step-definitions/a11y.steps.js +800 -0
  256. package/tests/step-definitions/action.steps.js +167 -0
  257. package/tests/step-definitions/api.steps.js +732 -0
  258. package/tests/step-definitions/assertion.steps.js +352 -0
  259. package/tests/step-definitions/auth.steps.js +126 -0
  260. package/tests/step-definitions/clock.steps.js +128 -0
  261. package/tests/step-definitions/cookie.steps.js +216 -0
  262. package/tests/step-definitions/debug.steps.js +39 -0
  263. package/tests/step-definitions/dialog.steps.js +193 -0
  264. package/tests/step-definitions/drupal-canvas.steps.js +764 -0
  265. package/tests/step-definitions/drupal-ckeditor.steps.js +108 -0
  266. package/tests/step-definitions/drupal-core.steps.js +665 -0
  267. package/tests/step-definitions/drupal-helpers.js +371 -0
  268. package/tests/step-definitions/drupal-layout-builder.steps.js +466 -0
  269. package/tests/step-definitions/drupal-media.steps.js +99 -0
  270. package/tests/step-definitions/drupal-moderation.steps.js +71 -0
  271. package/tests/step-definitions/drupal-paragraphs.steps.js +50 -0
  272. package/tests/step-definitions/element.steps.js +356 -0
  273. package/tests/step-definitions/field.steps.js +653 -0
  274. package/tests/step-definitions/file-download.steps.js +211 -0
  275. package/tests/step-definitions/form.steps.js +333 -0
  276. package/tests/step-definitions/iframe.steps.js +228 -0
  277. package/tests/step-definitions/input.steps.js +202 -0
  278. package/tests/step-definitions/javascript.steps.js +232 -0
  279. package/tests/step-definitions/keyboard.steps.js +112 -0
  280. package/tests/step-definitions/link.steps.js +142 -0
  281. package/tests/step-definitions/metatag.steps.js +91 -0
  282. package/tests/step-definitions/modal.steps.js +244 -0
  283. package/tests/step-definitions/navigation.steps.js +218 -0
  284. package/tests/step-definitions/network.steps.js +280 -0
  285. package/tests/step-definitions/path.steps.js +141 -0
  286. package/tests/step-definitions/response.steps.js +98 -0
  287. package/tests/step-definitions/responsive.steps.js +125 -0
  288. package/tests/step-definitions/rest.steps.js +111 -0
  289. package/tests/step-definitions/screenshot.steps.js +423 -0
  290. package/tests/step-definitions/scroll.steps.js +189 -0
  291. package/tests/step-definitions/selectors.steps.js +1003 -0
  292. package/tests/step-definitions/storage.steps.js +194 -0
  293. package/tests/step-definitions/table.steps.js +181 -0
  294. package/tests/step-definitions/varbase-e2e.js +897 -0
  295. package/tests/step-definitions/varbase.steps.js +458 -0
  296. package/tests/step-definitions/video.steps.js +178 -0
  297. package/tests/step-definitions/wait.steps.js +400 -0
  298. package/tests/step-definitions/web-first.steps.js +298 -0
  299. package/tests/step-definitions/xml.steps.js +411 -0
  300. package/tests/step-definitions/yaml.steps.js +913 -0
  301. package/tsconfig.json +26 -0
@@ -0,0 +1,505 @@
1
+ # XML responses steps
2
+
3
+ 20 steps, defined in `tests/step-definitions/xml.steps.js`.
4
+
5
+ Cucumber-js loads every `*.steps.js` in that directory automatically — you never `require()` a step file from a feature.
6
+
7
+ | # | Step |
8
+ | --- | --- |
9
+ | 1 | `Given the response content from the file "feed.xml"` |
10
+ | 2 | `Given the response content is the following:` |
11
+ | 3 | `Then the response should be in XML format` |
12
+ | 4 | `Then the response should not be in XML format` |
13
+ | 5 | `Then the XML element "/root/item" should exist` |
14
+ | 6 | `Then the XML element "/root/missing" should not exist` |
15
+ | 7 | `Then the XML element "/root/item" should be equal to "Hello"` |
16
+ | 8 | `Then the XML element "/root/item" should not be equal to "Bye"` |
17
+ | 9 | `Then the XML element "/root/item" should contain "Hello"` |
18
+ | 10 | `Then the XML element "/root/item" should not contain "Error"` |
19
+ | 11 | `Then the XML attribute "id" on element "/root/item" should exist` |
20
+ | 12 | `Then the XML attribute "deprecated" on element "/root/item" should not exist` |
21
+ | 13 | `Then the XML attribute "id" on element "/root/item" should be equal to "1"` |
22
+ | 14 | `Then the XML attribute "id" on element "/root/item" should not be equal to "0"` |
23
+ | 15 | `Then the XML attribute "id" on element "/root/item" should contain "abc"` |
24
+ | 16 | `Then the XML attribute "id" on element "/root/item" should not contain "old"` |
25
+ | 17 | `Then the XML element "//entry" should have 5 elements` |
26
+ | 18 | `Then the XML should use the namespace "http://www.w3.org/2005/Atom"` |
27
+ | 19 | `Then the XML should not use the namespace "http://example.com/legacy"` |
28
+ | 20 | `When I print last XML response` |
29
+
30
+ ---
31
+
32
+ ## 1. Given the response content from the file "feed.xml"
33
+
34
+ Load XML response content from a file under `tests/assets/`.
35
+
36
+ **Keyword**: `Given`
37
+
38
+ **Pattern**
39
+
40
+ ```js
41
+ 'the response content from the file {string}'
42
+ ```
43
+
44
+ **Examples**
45
+
46
+ ```gherkin
47
+ Given the response content from the file "feed.xml"
48
+ Given the response content from the file "rss.xml"
49
+ And the response content from the file "sitemap.xml"
50
+ Given the response content from the file "soap-response.xml"
51
+ Given the response content from the file "/tmp/sample.xml"
52
+ ```
53
+
54
+ ## 2. Given the response content is the following:
55
+
56
+ Set XML response content inline from a Gherkin doc string.
57
+
58
+ **Keyword**: `Given`
59
+
60
+ **Pattern**
61
+
62
+ ```js
63
+ 'the response content is the following:'
64
+ ```
65
+
66
+ **Examples**
67
+
68
+ ```gherkin
69
+ Given the response content is the following:
70
+ """
71
+ <root><item id="1">Hello</item></root>
72
+ """
73
+ Given the response content is the following:
74
+ """
75
+ <feed><entry><title>Sample feed</title></entry></feed>
76
+ """
77
+ And the response content is the following:
78
+ """
79
+ <orders><order id="1"><status>shipped</status></order></orders>
80
+ """
81
+ Given the response content is the following:
82
+ """
83
+ <products><product><name>Laptop</name></product></products>
84
+ """
85
+ Given the response content is the following:
86
+ """
87
+ <error code="404">Not found</error>
88
+ """
89
+ ```
90
+
91
+ ## 3. Then the response should be in XML format
92
+
93
+ Assert the loaded response parses as XML.
94
+
95
+ **Keyword**: `Then`
96
+
97
+ **Pattern**
98
+
99
+ ```js
100
+ 'the response should be in XML format'
101
+ ```
102
+
103
+ **Examples**
104
+
105
+ ```gherkin
106
+ Then the response should be in XML format
107
+ Given the response content from the file "rss.xml"
108
+ Then the response should be in XML format
109
+ And the response should be in XML format
110
+ Given the response content is the following:
111
+ """
112
+ <root/>
113
+ """
114
+ Then the response should be in XML format
115
+ Then the response should be in XML format
116
+ And the XML element "/root" should exist
117
+ ```
118
+
119
+ ## 4. Then the response should not be in XML format
120
+
121
+ Assert the loaded response is NOT XML.
122
+
123
+ **Keyword**: `Then`
124
+
125
+ **Pattern**
126
+
127
+ ```js
128
+ 'the response should not be in XML format'
129
+ ```
130
+
131
+ **Examples**
132
+
133
+ ```gherkin
134
+ Then the response should not be in XML format
135
+ Given the response content is the following:
136
+ """
137
+ {"hello": "world"}
138
+ """
139
+ Then the response should not be in XML format
140
+ And the response should not be in XML format
141
+ Given the response content is the following:
142
+ """
143
+ plain text
144
+ """
145
+ Then the response should not be in XML format
146
+ Then the response should not be in XML format
147
+ And I print last XML response
148
+ ```
149
+
150
+ ## 5. Then the XML element "/root/item" should exist
151
+
152
+ Assert at least one XML element matches an XPath.
153
+
154
+ **Keyword**: `Then`
155
+
156
+ **Pattern**
157
+
158
+ ```js
159
+ 'the XML element {string} should exist'
160
+ ```
161
+
162
+ **Examples**
163
+
164
+ ```gherkin
165
+ Then the XML element "/root/item" should exist
166
+ Then the XML element "//book/title" should exist
167
+ And the XML element "/order/customer" should exist
168
+ Then the XML element "//status" should exist
169
+ Then the XML element "/feed/entry[2]" should exist
170
+ ```
171
+
172
+ ## 6. Then the XML element "/root/missing" should not exist
173
+
174
+ Assert NO XML element matches an XPath.
175
+
176
+ **Keyword**: `Then`
177
+
178
+ **Pattern**
179
+
180
+ ```js
181
+ 'the XML element {string} should not exist'
182
+ ```
183
+
184
+ **Examples**
185
+
186
+ ```gherkin
187
+ Then the XML element "/root/missing" should not exist
188
+ Then the XML element "//error" should not exist
189
+ And the XML element "/feed/legacy" should not exist
190
+ Then the XML element "//deprecated" should not exist
191
+ Then the XML element "/order/refund" should not exist
192
+ ```
193
+
194
+ ## 7. Then the XML element "/root/item" should be equal to "Hello"
195
+
196
+ Assert an XML element's text content equals an expected value (trimmed).
197
+
198
+ **Keyword**: `Then`
199
+
200
+ **Pattern**
201
+
202
+ ```js
203
+ 'the XML element {string} should be equal to {string}'
204
+ ```
205
+
206
+ **Examples**
207
+
208
+ ```gherkin
209
+ Then the XML element "/root/item" should be equal to "Hello"
210
+ Then the XML element "//status" should be equal to "shipped"
211
+ And the XML element "/order/customer/name" should be equal to "Alice"
212
+ Then the XML element "/book/title" should be equal to "Sample title"
213
+ Then the XML element "//count" should be equal to "5"
214
+ ```
215
+
216
+ ## 8. Then the XML element "/root/item" should not be equal to "Bye"
217
+
218
+ Assert an XML element's text content is NOT equal to an expected value.
219
+
220
+ **Keyword**: `Then`
221
+
222
+ **Pattern**
223
+
224
+ ```js
225
+ 'the XML element {string} should not be equal to {string}'
226
+ ```
227
+
228
+ **Examples**
229
+
230
+ ```gherkin
231
+ Then the XML element "/root/item" should not be equal to "Bye"
232
+ Then the XML element "//status" should not be equal to "cancelled"
233
+ And the XML element "/order/customer/name" should not be equal to "Anonymous"
234
+ Then the XML element "/book/title" should not be equal to "Untitled"
235
+ Then the XML element "//count" should not be equal to "0"
236
+ ```
237
+
238
+ ## 9. Then the XML element "/root/item" should contain "Hello"
239
+
240
+ Assert an XML element's text content contains a substring.
241
+
242
+ **Keyword**: `Then`
243
+
244
+ **Pattern**
245
+
246
+ ```js
247
+ 'the XML element {string} should contain {string}'
248
+ ```
249
+
250
+ **Examples**
251
+
252
+ ```gherkin
253
+ Then the XML element "/root/item" should contain "Hello"
254
+ Then the XML element "//status" should contain "ship"
255
+ And the XML element "/order/customer/name" should contain "Alice"
256
+ Then the XML element "/book/title" should contain "Varbase E2E"
257
+ Then the XML element "/feed/entry/summary" should contain "release"
258
+ ```
259
+
260
+ ## 10. Then the XML element "/root/item" should not contain "Error"
261
+
262
+ Assert an XML element's text content does NOT contain a substring.
263
+
264
+ **Keyword**: `Then`
265
+
266
+ **Pattern**
267
+
268
+ ```js
269
+ 'the XML element {string} should not contain {string}'
270
+ ```
271
+
272
+ **Examples**
273
+
274
+ ```gherkin
275
+ Then the XML element "/root/item" should not contain "Error"
276
+ Then the XML element "//status" should not contain "fail"
277
+ And the XML element "/order/customer/name" should not contain "Anonymous"
278
+ Then the XML element "/book/title" should not contain "Untitled"
279
+ Then the XML element "/feed/entry/summary" should not contain "TODO"
280
+ ```
281
+
282
+ ## 11. Then the XML attribute "id" on element "/root/item" should exist
283
+
284
+ Assert an XML element has the named attribute.
285
+
286
+ **Keyword**: `Then`
287
+
288
+ **Pattern**
289
+
290
+ ```js
291
+ 'the XML attribute {string} on element {string} should exist'
292
+ ```
293
+
294
+ **Examples**
295
+
296
+ ```gherkin
297
+ Then the XML attribute "id" on element "/root/item" should exist
298
+ Then the XML attribute "lang" on element "/feed" should exist
299
+ And the XML attribute "type" on element "//entry" should exist
300
+ Then the XML attribute "version" on element "/rss" should exist
301
+ Then the XML attribute "code" on element "/error" should exist
302
+ ```
303
+
304
+ ## 12. Then the XML attribute "deprecated" on element "/root/item" should not exist
305
+
306
+ Assert an XML element does NOT have the named attribute.
307
+
308
+ **Keyword**: `Then`
309
+
310
+ **Pattern**
311
+
312
+ ```js
313
+ 'the XML attribute {string} on element {string} should not exist'
314
+ ```
315
+
316
+ **Examples**
317
+
318
+ ```gherkin
319
+ Then the XML attribute "deprecated" on element "/root/item" should not exist
320
+ Then the XML attribute "internal" on element "/feed" should not exist
321
+ And the XML attribute "secret" on element "//entry" should not exist
322
+ Then the XML attribute "private" on element "/rss" should not exist
323
+ Then the XML attribute "debug" on element "/error" should not exist
324
+ ```
325
+
326
+ ## 13. Then the XML attribute "id" on element "/root/item" should be equal to "1"
327
+
328
+ Assert an XML attribute equals an expected value.
329
+
330
+ **Keyword**: `Then`
331
+
332
+ **Pattern**
333
+
334
+ ```js
335
+ 'the XML attribute {string} on element {string} should be equal to {string}'
336
+ ```
337
+
338
+ **Examples**
339
+
340
+ ```gherkin
341
+ Then the XML attribute "id" on element "/root/item" should be equal to "1"
342
+ Then the XML attribute "lang" on element "/feed" should be equal to "en"
343
+ And the XML attribute "type" on element "//entry" should be equal to "html"
344
+ Then the XML attribute "version" on element "/rss" should be equal to "2.0"
345
+ Then the XML attribute "code" on element "/error" should be equal to "404"
346
+ ```
347
+
348
+ ## 14. Then the XML attribute "id" on element "/root/item" should not be equal to "0"
349
+
350
+ Assert an XML attribute is NOT equal to an expected value.
351
+
352
+ **Keyword**: `Then`
353
+
354
+ **Pattern**
355
+
356
+ ```js
357
+ 'the XML attribute {string} on element {string} should not be equal to {string}'
358
+ ```
359
+
360
+ **Examples**
361
+
362
+ ```gherkin
363
+ Then the XML attribute "id" on element "/root/item" should not be equal to "0"
364
+ Then the XML attribute "lang" on element "/feed" should not be equal to "xx"
365
+ And the XML attribute "type" on element "//entry" should not be equal to "binary"
366
+ Then the XML attribute "version" on element "/rss" should not be equal to "0.9"
367
+ Then the XML attribute "code" on element "/error" should not be equal to "200"
368
+ ```
369
+
370
+ ## 15. Then the XML attribute "id" on element "/root/item" should contain "abc"
371
+
372
+ Assert an XML attribute contains a substring.
373
+
374
+ **Keyword**: `Then`
375
+
376
+ **Pattern**
377
+
378
+ ```js
379
+ 'the XML attribute {string} on element {string} should contain {string}'
380
+ ```
381
+
382
+ **Examples**
383
+
384
+ ```gherkin
385
+ Then the XML attribute "id" on element "/root/item" should contain "abc"
386
+ Then the XML attribute "href" on element "//link" should contain "example.com"
387
+ And the XML attribute "type" on element "//entry" should contain "html"
388
+ Then the XML attribute "version" on element "/rss" should contain "2"
389
+ Then the XML attribute "code" on element "/error" should contain "4"
390
+ ```
391
+
392
+ ## 16. Then the XML attribute "id" on element "/root/item" should not contain "old"
393
+
394
+ Assert an XML attribute does NOT contain a substring.
395
+
396
+ **Keyword**: `Then`
397
+
398
+ **Pattern**
399
+
400
+ ```js
401
+ 'the XML attribute {string} on element {string} should not contain {string}'
402
+ ```
403
+
404
+ **Examples**
405
+
406
+ ```gherkin
407
+ Then the XML attribute "id" on element "/root/item" should not contain "old"
408
+ Then the XML attribute "href" on element "//link" should not contain "tracking"
409
+ And the XML attribute "type" on element "//entry" should not contain "binary"
410
+ Then the XML attribute "version" on element "/rss" should not contain "alpha"
411
+ Then the XML attribute "code" on element "/error" should not contain "5"
412
+ ```
413
+
414
+ ## 17. Then the XML element "//entry" should have 5 elements
415
+
416
+ Assert exactly N elements match an XPath.
417
+
418
+ **Keyword**: `Then`
419
+
420
+ **Pattern**
421
+
422
+ ```js
423
+ 'the XML element {string} should have {int} element(s)'
424
+ ```
425
+
426
+ **Examples**
427
+
428
+ ```gherkin
429
+ Then the XML element "//entry" should have 5 elements
430
+ Then the XML element "/root/item" should have 1 element
431
+ And the XML element "//error" should have 0 elements
432
+ Then the XML element "/feed/entry" should have 10 elements
433
+ Then the XML element "/orders/order" should have 3 elements
434
+ ```
435
+
436
+ ## 18. Then the XML should use the namespace "http://www.w3.org/2005/Atom"
437
+
438
+ Assert the XML root declares an `xmlns:*` namespace URI.
439
+
440
+ **Keyword**: `Then`
441
+
442
+ **Pattern**
443
+
444
+ ```js
445
+ 'the XML should use the namespace {string}'
446
+ ```
447
+
448
+ **Examples**
449
+
450
+ ```gherkin
451
+ Then the XML should use the namespace "http://www.w3.org/2005/Atom"
452
+ Then the XML should use the namespace "http://www.sitemaps.org/schemas/sitemap/0.9"
453
+ And the XML should use the namespace "http://schemas.xmlsoap.org/soap/envelope/"
454
+ Then the XML should use the namespace "http://www.w3.org/1999/xhtml"
455
+ Then the XML should use the namespace "http://www.opengis.net/gml"
456
+ ```
457
+
458
+ ## 19. Then the XML should not use the namespace "http://example.com/legacy"
459
+
460
+ Assert the XML root does NOT declare a namespace URI.
461
+
462
+ **Keyword**: `Then`
463
+
464
+ **Pattern**
465
+
466
+ ```js
467
+ 'the XML should not use the namespace {string}'
468
+ ```
469
+
470
+ **Examples**
471
+
472
+ ```gherkin
473
+ Then the XML should not use the namespace "http://example.com/legacy"
474
+ Then the XML should not use the namespace "http://example.com/internal"
475
+ And the XML should not use the namespace "http://example.com/v1"
476
+ Then the XML should not use the namespace "http://example.com/deprecated"
477
+ Then the XML should not use the namespace "http://example.com/private"
478
+ ```
479
+
480
+ ## 20. When I print last XML response
481
+
482
+ Print the most recently set raw XML response to stdout (debug aid).
483
+
484
+ **Keyword**: `When`
485
+
486
+ **Pattern**
487
+
488
+ ```js
489
+ /^(I |we )*print last XML response$/
490
+ ```
491
+
492
+ **Examples**
493
+
494
+ ```gherkin
495
+ When I print last XML response
496
+ When I send a REST "GET" request to "/api/feed"
497
+ And I print last XML response
498
+ And I print last XML response
499
+ Given the response content is the following:
500
+ """
501
+ <root/>
502
+ """
503
+ When I print last XML response
504
+ When I print last XML response
505
+ ```