@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,648 @@
1
+ # Field state steps
2
+
3
+ 27 steps, defined in `tests/step-definitions/field.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 | `Then the field "username" should be empty` |
10
+ | 2 | `Then the field "username" should not be empty` |
11
+ | 3 | `Then the field "username" should exist` |
12
+ | 4 | `Then the field "missing-field" should not exist` |
13
+ | 5 | `Then the field "username" should have "enabled" state` |
14
+ | 6 | `Then the field "username" should be required` |
15
+ | 7 | `Then the field "bio" should not be required` |
16
+ | 8 | `When I fill in the multi-value field "tags" with the following values:` |
17
+ | 9 | `When I fill in the color field "favorite" with the value "#ff0000"` |
18
+ | 10 | `Then the color field "favorite" should have the value "#ff0000"` |
19
+ | 11 | `When I fill in the WYSIWYG field "body" with the "Hello world"` |
20
+ | 12 | `Then the option "Mercedes" should exist within the select element "#cars"` |
21
+ | 13 | `Then the option "Manager" should not exist within the select element "#role"` |
22
+ | 14 | `Then the option "Mercedes" should be selected within the select element "#cars"` |
23
+ | 15 | `Then the option "Admin" should not be selected within the select element "#role"` |
24
+ | 16 | `When I unselect "Red" from "#colors"` |
25
+ | 17 | `When I clear the select "#colors"` |
26
+ | 18 | `When I check the checkbox "#agree"` |
27
+ | 19 | `When I uncheck the checkbox "#newsletter"` |
28
+ | 20 | `When I choose the radio button "#gender-male"` |
29
+ | 21 | `When I fill in the field "#username" with "alice"` |
30
+ | 22 | `Given browser validation for the form "#signup" is disabled` |
31
+ | 23 | `When I fill in the datetime field "Start" with date "2026-05-08" and time "10:00"` |
32
+ | 24 | `When I fill in the date part of the datetime field "Start" with "2026-05-08"` |
33
+ | 25 | `When I fill in the time part of the datetime field "Start" with "10:00"` |
34
+ | 26 | `When I fill in the start datetime field "Event" with date "2026-05-08" and time "10:00"` |
35
+ | 27 | `When I fill in the end datetime field "Event" with date "2026-05-09" and time "18:00"` |
36
+
37
+ ---
38
+
39
+ ## 1. Then the field "username" should be empty
40
+
41
+ Assert a field's current value is the empty string.
42
+
43
+ **Keyword**: `Then`
44
+
45
+ **Pattern**
46
+
47
+ ```js
48
+ 'the field {string} should be empty'
49
+ ```
50
+
51
+ **Examples**
52
+
53
+ ```gherkin
54
+ Then the field "username" should be empty
55
+ Then the field "Email" should be empty
56
+ And the field "#search" should be empty
57
+ Then the field "[name=phone]" should be empty
58
+ When I fill in "" for "Username"
59
+ Then the field "username" should be empty
60
+ ```
61
+
62
+ ## 2. Then the field "username" should not be empty
63
+
64
+ Assert a field has a non-empty value.
65
+
66
+ **Keyword**: `Then`
67
+
68
+ **Pattern**
69
+
70
+ ```js
71
+ 'the field {string} should not be empty'
72
+ ```
73
+
74
+ **Examples**
75
+
76
+ ```gherkin
77
+ Then the field "username" should not be empty
78
+ Then the field "Email" should not be empty
79
+ And the field "#search" should not be empty
80
+ When I fill in "alice" for "Username"
81
+ Then the field "username" should not be empty
82
+ Then the field "[name=phone]" should not be empty
83
+ ```
84
+
85
+ ## 3. Then the field "username" should exist
86
+
87
+ Assert a field exists in the DOM (any state).
88
+
89
+ **Keyword**: `Then`
90
+
91
+ **Pattern**
92
+
93
+ ```js
94
+ 'the field {string} should exist'
95
+ ```
96
+
97
+ **Examples**
98
+
99
+ ```gherkin
100
+ Then the field "username" should exist
101
+ Then the field "Email" should exist
102
+ And the field "#search" should exist
103
+ Then the field "Password" should exist
104
+ Then the field "[name=phone]" should exist
105
+ ```
106
+
107
+ ## 4. Then the field "missing-field" should not exist
108
+
109
+ Assert a field does NOT exist in the DOM.
110
+
111
+ **Keyword**: `Then`
112
+
113
+ **Pattern**
114
+
115
+ ```js
116
+ 'the field {string} should not exist'
117
+ ```
118
+
119
+ **Examples**
120
+
121
+ ```gherkin
122
+ Then the field "missing-field" should not exist
123
+ Then the field "Legacy field" should not exist
124
+ And the field "#deprecated" should not exist
125
+ Then the field "Old name" should not exist
126
+ Then the field "[name=internal_only]" should not exist
127
+ ```
128
+
129
+ ## 5. Then the field "username" should have "enabled" state
130
+
131
+ Assert a field's enabled / disabled state.
132
+
133
+ **Keyword**: `Then`
134
+
135
+ **Pattern**
136
+
137
+ ```js
138
+ 'the field {string} should have {string} state'
139
+ ```
140
+
141
+ **Examples**
142
+
143
+ ```gherkin
144
+ Then the field "username" should have "enabled" state
145
+ Then the field "Email" should have "disabled" state
146
+ And the field "#search" should have "enabled" state
147
+ Then the field "Password" should have "disabled" state
148
+ Then the field "Country" should have "enabled" state
149
+ ```
150
+
151
+ ## 6. Then the field "username" should be required
152
+
153
+ Assert a field has the `required` or `aria-required="true"` attribute.
154
+
155
+ **Keyword**: `Then`
156
+
157
+ **Pattern**
158
+
159
+ ```js
160
+ 'the field {string} should be required'
161
+ ```
162
+
163
+ **Examples**
164
+
165
+ ```gherkin
166
+ Then the field "username" should be required
167
+ Then the field "Email" should be required
168
+ And the field "Password" should be required
169
+ Then the field "Country" should be required
170
+ Then the field "Card number" should be required
171
+ ```
172
+
173
+ ## 7. Then the field "bio" should not be required
174
+
175
+ Assert a field is NOT required.
176
+
177
+ **Keyword**: `Then`
178
+
179
+ **Pattern**
180
+
181
+ ```js
182
+ 'the field {string} should not be required'
183
+ ```
184
+
185
+ **Examples**
186
+
187
+ ```gherkin
188
+ Then the field "bio" should not be required
189
+ Then the field "Nickname" should not be required
190
+ And the field "Phone" should not be required
191
+ Then the field "Comments" should not be required
192
+ Then the field "Twitter handle" should not be required
193
+ ```
194
+
195
+ ## 8. When I fill in the multi-value field "tags" with the following values:
196
+
197
+ Fill a multi-value form field (e.g. `name[]` array inputs) from a table.
198
+
199
+ **Keyword**: `When`
200
+
201
+ **Pattern**
202
+
203
+ ```js
204
+ /^(I |we )*fill in the multi-value field "([^"]*)" with the following values:$/
205
+ ```
206
+
207
+ **Examples**
208
+
209
+ ```gherkin
210
+ When I fill in the multi-value field "tags" with the following values:
211
+ | bdd |
212
+ | testing |
213
+ When I fill in the multi-value field "skills" with the following values:
214
+ | js |
215
+ | css |
216
+ | sql |
217
+ And we fill in the multi-value field "phones" with the following values:
218
+ | 0790000000 |
219
+ | 0791111111 |
220
+ When I fill in the multi-value field "ids" with the following values:
221
+ | 1 |
222
+ | 2 |
223
+ When I fill in the multi-value field "categories" with the following values:
224
+ | tech |
225
+ | devops |
226
+ | testing |
227
+ ```
228
+
229
+ ## 9. When I fill in the color field "favorite" with the value "#ff0000"
230
+
231
+ Fill an `<input type="color">` field with a hex value.
232
+
233
+ **Keyword**: `When`
234
+
235
+ **Pattern**
236
+
237
+ ```js
238
+ /^(I |we )*fill in the color field "([^"]*)" with the value "([^"]*)"$/
239
+ ```
240
+
241
+ **Examples**
242
+
243
+ ```gherkin
244
+ When I fill in the color field "favorite" with the value "#ff0000"
245
+ When I fill in the color field "primary" with the value "#0066cc"
246
+ And we fill in the color field "Accent" with the value "#00aa66"
247
+ When I fill in the color field "#bg-color" with the value "#000000"
248
+ When I fill in the color field "Theme" with the value "#ffaa00"
249
+ ```
250
+
251
+ ## 10. Then the color field "favorite" should have the value "#ff0000"
252
+
253
+ Assert an `<input type="color">` field's current value (case-insensitive).
254
+
255
+ **Keyword**: `Then`
256
+
257
+ **Pattern**
258
+
259
+ ```js
260
+ 'the color field {string} should have the value {string}'
261
+ ```
262
+
263
+ **Examples**
264
+
265
+ ```gherkin
266
+ Then the color field "favorite" should have the value "#ff0000"
267
+ Then the color field "primary" should have the value "#0066cc"
268
+ And the color field "Accent" should have the value "#00aa66"
269
+ Then the color field "#bg-color" should have the value "#000000"
270
+ Then the color field "Theme" should have the value "#ffaa00"
271
+ ```
272
+
273
+ ## 11. When I fill in the WYSIWYG field "body" with the "Hello world"
274
+
275
+ Fill a CKEditor / contenteditable rich-text field with HTML.
276
+
277
+ **Keyword**: `When`
278
+
279
+ **Pattern**
280
+
281
+ ```js
282
+ /^(I |we )*fill in the WYSIWYG field "([^"]*)" with the "([^"]*)"$/
283
+ ```
284
+
285
+ **Examples**
286
+
287
+ ```gherkin
288
+ When I fill in the WYSIWYG field "body" with the "Hello world"
289
+ When I fill in the WYSIWYG field "Description" with the "<strong>Bold</strong>"
290
+ And we fill in the WYSIWYG field "content" with the "Plain paragraph"
291
+ When I fill in the WYSIWYG field "post" with the "Multi line\ntext"
292
+ When I fill in the WYSIWYG field "Notes" with the "Final notes here"
293
+ ```
294
+
295
+ ## 12. Then the option "Mercedes" should exist within the select element "#cars"
296
+
297
+ Assert a `<select>` contains an option with the given visible text.
298
+
299
+ **Keyword**: `Then`
300
+
301
+ **Pattern**
302
+
303
+ ```js
304
+ 'the option {string} should exist within the select element {string}'
305
+ ```
306
+
307
+ **Examples**
308
+
309
+ ```gherkin
310
+ Then the option "Mercedes" should exist within the select element "#cars"
311
+ Then the option "Editor" should exist within the select element "select[name=role]"
312
+ And the option "English" should exist within the select element "#language"
313
+ Then the option "Premium" should exist within the select element "#plan"
314
+ Then the option "Jordan" should exist within the select element "#country"
315
+ ```
316
+
317
+ ## 13. Then the option "Manager" should not exist within the select element "#role"
318
+
319
+ Assert a `<select>` does NOT contain an option with the given text.
320
+
321
+ **Keyword**: `Then`
322
+
323
+ **Pattern**
324
+
325
+ ```js
326
+ 'the option {string} should not exist within the select element {string}'
327
+ ```
328
+
329
+ **Examples**
330
+
331
+ ```gherkin
332
+ Then the option "Manager" should not exist within the select element "#role"
333
+ Then the option "Trial" should not exist within the select element "#plan"
334
+ And the option "Old country" should not exist within the select element "#country"
335
+ Then the option "Hidden" should not exist within the select element "#status"
336
+ Then the option "Legacy" should not exist within the select element "#mode"
337
+ ```
338
+
339
+ ## 14. Then the option "Mercedes" should be selected within the select element "#cars"
340
+
341
+ Assert an option is currently selected in a `<select>`.
342
+
343
+ **Keyword**: `Then`
344
+
345
+ **Pattern**
346
+
347
+ ```js
348
+ 'the option {string} should be selected within the select element {string}'
349
+ ```
350
+
351
+ **Examples**
352
+
353
+ ```gherkin
354
+ Then the option "Mercedes" should be selected within the select element "#cars"
355
+ Then the option "Editor" should be selected within the select element "#role"
356
+ And the option "English" should be selected within the select element "#language"
357
+ Then the option "Premium" should be selected within the select element "#plan"
358
+ Then the option "Jordan" should be selected within the select element "#country"
359
+ ```
360
+
361
+ ## 15. Then the option "Admin" should not be selected within the select element "#role"
362
+
363
+ Assert an option is NOT currently selected in a `<select>`.
364
+
365
+ **Keyword**: `Then`
366
+
367
+ **Pattern**
368
+
369
+ ```js
370
+ 'the option {string} should not be selected within the select element {string}'
371
+ ```
372
+
373
+ **Examples**
374
+
375
+ ```gherkin
376
+ Then the option "Admin" should not be selected within the select element "#role"
377
+ Then the option "Pro" should not be selected within the select element "#plan"
378
+ And the option "Other" should not be selected within the select element "#country"
379
+ Then the option "Inactive" should not be selected within the select element "#status"
380
+ Then the option "Trial" should not be selected within the select element "#mode"
381
+ ```
382
+
383
+ ## 16. When I unselect "Red" from "#colors"
384
+
385
+ Unselect a single option from a `<select multiple>`.
386
+
387
+ **Keyword**: `When`
388
+
389
+ **Pattern**
390
+
391
+ ```js
392
+ /^(I |we )*unselect "([^"]*)" from "([^"]*)"$/
393
+ ```
394
+
395
+ **Examples**
396
+
397
+ ```gherkin
398
+ When I unselect "Red" from "#colors"
399
+ When I unselect "Editor" from "#role"
400
+ And we unselect "tag-a" from "select[name=tags]"
401
+ When I unselect "EN" from "#languages"
402
+ When I unselect "Beta" from "#features"
403
+ ```
404
+
405
+ ## 17. When I clear the select "#colors"
406
+
407
+ Clear all selections in a `<select multiple>`.
408
+
409
+ **Keyword**: `When`
410
+
411
+ **Pattern**
412
+
413
+ ```js
414
+ /^(I |we )*clear the select "([^"]*)"$/
415
+ ```
416
+
417
+ **Examples**
418
+
419
+ ```gherkin
420
+ When I clear the select "#colors"
421
+ When I clear the select "#tags"
422
+ And I clear the select "select[name=roles]"
423
+ When I clear the select "#languages"
424
+ When I clear the select "#features"
425
+ ```
426
+
427
+ ## 18. When I check the checkbox "#agree"
428
+
429
+ Check a CSS-addressed checkbox.
430
+
431
+ **Keyword**: `When`
432
+
433
+ **Pattern**
434
+
435
+ ```js
436
+ /^(I |we )*check the checkbox "([^"]*)"$/
437
+ ```
438
+
439
+ **Examples**
440
+
441
+ ```gherkin
442
+ When I check the checkbox "#agree"
443
+ When I check the checkbox "input[name=newsletter]"
444
+ And we check the checkbox ".terms"
445
+ When I check the checkbox "#remember-me"
446
+ When I check the checkbox "[data-testid=privacy-checkbox]"
447
+ ```
448
+
449
+ ## 19. When I uncheck the checkbox "#newsletter"
450
+
451
+ Uncheck a CSS-addressed checkbox.
452
+
453
+ **Keyword**: `When`
454
+
455
+ **Pattern**
456
+
457
+ ```js
458
+ /^(I |we )*uncheck the checkbox "([^"]*)"$/
459
+ ```
460
+
461
+ **Examples**
462
+
463
+ ```gherkin
464
+ When I uncheck the checkbox "#newsletter"
465
+ When I uncheck the checkbox "input[name=marketing]"
466
+ And we uncheck the checkbox ".analytics-opt-in"
467
+ When I uncheck the checkbox "#remember-me"
468
+ When I uncheck the checkbox "[data-testid=privacy-checkbox]"
469
+ ```
470
+
471
+ ## 20. When I choose the radio button "#gender-male"
472
+
473
+ Select a CSS-addressed radio button.
474
+
475
+ **Keyword**: `When`
476
+
477
+ **Pattern**
478
+
479
+ ```js
480
+ /^(I |we )*choose the radio button "([^"]*)"$/
481
+ ```
482
+
483
+ **Examples**
484
+
485
+ ```gherkin
486
+ When I choose the radio button "#gender-male"
487
+ When I choose the radio button "input[value=premium]"
488
+ And we choose the radio button ".plan-monthly"
489
+ When I choose the radio button "#yes"
490
+ When I choose the radio button "[data-testid=annual]"
491
+ ```
492
+
493
+ ## 21. When I fill in the field "#username" with "alice"
494
+
495
+ Fill a CSS-addressed input/textarea with a value.
496
+
497
+ **Keyword**: `When`
498
+
499
+ **Pattern**
500
+
501
+ ```js
502
+ /^(I |we )*fill in the field "([^"]*)" with "([^"]*)"$/
503
+ ```
504
+
505
+ **Examples**
506
+
507
+ ```gherkin
508
+ When I fill in the field "#username" with "alice"
509
+ When I fill in the field "input[name=email]" with "alice@example.com"
510
+ And we fill in the field "#search" with "laptops"
511
+ When I fill in the field "[data-testid=phone]" with "0790000000"
512
+ When I fill in the field "textarea#message" with "Hello"
513
+ ```
514
+
515
+ ## 22. Given browser validation for the form "#signup" is disabled
516
+
517
+ Disable native browser validation on a form (sets `novalidate`).
518
+
519
+ Useful when a test needs to submit an intentionally invalid form to
520
+ exercise server-side error rendering.
521
+
522
+ **Keyword**: `Given`
523
+
524
+ **Pattern**
525
+
526
+ ```js
527
+ 'browser validation for the form {string} is disabled'
528
+ ```
529
+
530
+ **Examples**
531
+
532
+ ```gherkin
533
+ Given browser validation for the form "#signup" is disabled
534
+ Given browser validation for the form "form[name=login]" is disabled
535
+ And browser validation for the form ".checkout-form" is disabled
536
+ Given browser validation for the form "#contact" is disabled
537
+ Given browser validation for the form "[data-testid=newsletter]" is disabled
538
+ ```
539
+
540
+ ## 23. When I fill in the datetime field "Start" with date "2026-05-08" and time "10:00"
541
+
542
+ Fill paired `<input type=date>` + `<input type=time>` controls for a label.
543
+
544
+ **Keyword**: `When`
545
+
546
+ **Pattern**
547
+
548
+ ```js
549
+ /^(I |we )*fill in the datetime field "([^"]*)" with date "([^"]*)" and time "([^"]*)"$/
550
+ ```
551
+
552
+ **Examples**
553
+
554
+ ```gherkin
555
+ When I fill in the datetime field "Start" with date "2026-05-08" and time "10:00"
556
+ When I fill in the datetime field "Departure" with date "2026-12-31" and time "23:59"
557
+ And we fill in the datetime field "Pickup" with date "2026-07-04" and time "08:30"
558
+ When I fill in the datetime field "Booking" with date "2026-01-01" and time "00:00"
559
+ When I fill in the datetime field "Reminder" with date "2026-09-15" and time "14:00"
560
+ ```
561
+
562
+ ## 24. When I fill in the date part of the datetime field "Start" with "2026-05-08"
563
+
564
+ Fill only the date component of a paired datetime field.
565
+
566
+ **Keyword**: `When`
567
+
568
+ **Pattern**
569
+
570
+ ```js
571
+ /^(I |we )*fill in the date part of the datetime field "([^"]*)" with "([^"]*)"$/
572
+ ```
573
+
574
+ **Examples**
575
+
576
+ ```gherkin
577
+ When I fill in the date part of the datetime field "Start" with "2026-05-08"
578
+ When I fill in the date part of the datetime field "Birth date" with "1990-01-15"
579
+ And we fill in the date part of the datetime field "Booking" with "2026-12-31"
580
+ When I fill in the date part of the datetime field "Pickup" with "2026-07-04"
581
+ When I fill in the date part of the datetime field "Reminder" with "2026-09-15"
582
+ ```
583
+
584
+ ## 25. When I fill in the time part of the datetime field "Start" with "10:00"
585
+
586
+ Fill only the time component of a paired datetime field.
587
+
588
+ **Keyword**: `When`
589
+
590
+ **Pattern**
591
+
592
+ ```js
593
+ /^(I |we )*fill in the time part of the datetime field "([^"]*)" with "([^"]*)"$/
594
+ ```
595
+
596
+ **Examples**
597
+
598
+ ```gherkin
599
+ When I fill in the time part of the datetime field "Start" with "10:00"
600
+ When I fill in the time part of the datetime field "Pickup" with "08:30"
601
+ And we fill in the time part of the datetime field "Booking" with "23:59"
602
+ When I fill in the time part of the datetime field "Reminder" with "14:00"
603
+ When I fill in the time part of the datetime field "Departure" with "06:15"
604
+ ```
605
+
606
+ ## 26. When I fill in the start datetime field "Event" with date "2026-05-08" and time "10:00"
607
+
608
+ Fill the `start` half of a date-range pair.
609
+
610
+ **Keyword**: `When`
611
+
612
+ **Pattern**
613
+
614
+ ```js
615
+ /^(I |we )*fill in the start datetime field "([^"]*)" with date "([^"]*)" and time "([^"]*)"$/
616
+ ```
617
+
618
+ **Examples**
619
+
620
+ ```gherkin
621
+ When I fill in the start datetime field "Event" with date "2026-05-08" and time "10:00"
622
+ When I fill in the start datetime field "Trip" with date "2026-12-31" and time "08:00"
623
+ And we fill in the start datetime field "Window" with date "2026-07-04" and time "12:00"
624
+ When I fill in the start datetime field "Promo" with date "2026-01-01" and time "00:00"
625
+ When I fill in the start datetime field "Booking" with date "2026-09-15" and time "14:00"
626
+ ```
627
+
628
+ ## 27. When I fill in the end datetime field "Event" with date "2026-05-09" and time "18:00"
629
+
630
+ Fill the `end` half of a date-range pair.
631
+
632
+ **Keyword**: `When`
633
+
634
+ **Pattern**
635
+
636
+ ```js
637
+ /^(I |we )*fill in the end datetime field "([^"]*)" with date "([^"]*)" and time "([^"]*)"$/
638
+ ```
639
+
640
+ **Examples**
641
+
642
+ ```gherkin
643
+ When I fill in the end datetime field "Event" with date "2026-05-09" and time "18:00"
644
+ When I fill in the end datetime field "Trip" with date "2027-01-07" and time "20:00"
645
+ And we fill in the end datetime field "Window" with date "2026-07-04" and time "18:00"
646
+ When I fill in the end datetime field "Promo" with date "2026-01-31" and time "23:59"
647
+ When I fill in the end datetime field "Booking" with date "2026-09-15" and time "16:00"
648
+ ```