@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.
- package/AGENTS.md +148 -0
- package/CLAUDE.md +544 -0
- package/README.md +22 -0
- package/bin/generate-reports.js +363 -0
- package/bin/init-varbase-e2e.js +330 -0
- package/bin/postinstall.js +26 -0
- package/cucumber.js +125 -0
- package/docs/00-quick-start.md +102 -0
- package/docs/01-getting-started.md +102 -0
- package/docs/02-bbr-smart-waits.md +77 -0
- package/docs/03-selector-registry.md +95 -0
- package/docs/04-step-reference.md +801 -0
- package/docs/05-web-first-assertions.md +91 -0
- package/docs/06-network-and-dialogs.md +83 -0
- package/docs/07-auth-state.md +75 -0
- package/docs/08-clock-mocking.md +59 -0
- package/docs/09-api-testing.md +114 -0
- package/docs/10-accessibility.md +167 -0
- package/docs/11-debugging.md +129 -0
- package/docs/12-ai-agent-guide.md +338 -0
- package/docs/13-faq.md +236 -0
- package/docs/14-recipes-cookbook.md +255 -0
- package/docs/15-tag-conventions.md +76 -0
- package/docs/16-ci-cd.md +90 -0
- package/docs/README.md +125 -0
- package/docs/advanced-screenshots/then-i-save-fullscreen-screenshot.md +36 -0
- package/docs/advanced-screenshots/then-i-save-width-x-height-screenshot.md +34 -0
- package/docs/advanced-screenshots/when-i-save-screenshot-name-filename.md +45 -0
- package/docs/advanced-screenshots.md +52 -0
- package/docs/advanced-selectors.md +18 -0
- package/docs/api-step-definitions.md +45 -0
- package/docs/global-settings.md +267 -0
- package/docs/install-varbase-e2e/ddev-varbase-e2e.md +52 -0
- package/docs/install-varbase-e2e.md +34 -0
- package/docs/overview.md +40 -0
- package/docs/step-definitions/given-i-am-anonymous-user.md +67 -0
- package/docs/step-definitions/given-i-am-homepage.md +68 -0
- package/docs/step-definitions/given-i-am-specific-page.md +72 -0
- package/docs/step-definitions/then-i-should-be.md +56 -0
- package/docs/step-definitions/then-i-should-see.md +62 -0
- package/docs/step-definitions/then-item-checkbox.md +54 -0
- package/docs/step-definitions/then-item-link-should-contain-url.md +84 -0
- package/docs/step-definitions/then-item-should-contain.md +67 -0
- package/docs/step-definitions/then-radio-button-value-should-be-selected.md +68 -0
- package/docs/step-definitions/then-response-status-code-should-be-number.md +69 -0
- package/docs/step-definitions/then-value-radio-button-selected.md +62 -0
- package/docs/step-definitions/when-i-attach-file-file-name-element.md +71 -0
- package/docs/step-definitions/when-i-check-checkbox.md +60 -0
- package/docs/step-definitions/when-i-click-link.md +51 -0
- package/docs/step-definitions/when-i-click-operation-text-row.md +71 -0
- package/docs/step-definitions/when-i-fill.md +59 -0
- package/docs/step-definitions/when-i-go-homepage.md +60 -0
- package/docs/step-definitions/when-i-go-specific-page.md +67 -0
- package/docs/step-definitions/when-i-move-backward-one-page.md +49 -0
- package/docs/step-definitions/when-i-move-forward-one-page.md +58 -0
- package/docs/step-definitions/when-i-press-button.md +58 -0
- package/docs/step-definitions/when-i-reload-page.md +51 -0
- package/docs/step-definitions/when-i-scroll.md +73 -0
- package/docs/step-definitions/when-i-select-option-select-list.md +53 -0
- package/docs/step-definitions/when-i-select-radio-button-value.md +62 -0
- package/docs/step-definitions/when-i-uncheck-checkbox.md +57 -0
- package/docs/step-definitions/when-i-wait-ajax-finish.md +64 -0
- package/docs/step-definitions/when-i-wait.md +62 -0
- package/docs/step-definitions.md +82 -0
- package/docs/steps/README.md +137 -0
- package/docs/steps/a11y.md +731 -0
- package/docs/steps/action.md +181 -0
- package/docs/steps/api.md +679 -0
- package/docs/steps/assertion.md +328 -0
- package/docs/steps/auth.md +108 -0
- package/docs/steps/clock.md +171 -0
- package/docs/steps/cookie.md +293 -0
- package/docs/steps/debug.md +52 -0
- package/docs/steps/dialog.md +226 -0
- package/docs/steps/drupal-canvas.md +414 -0
- package/docs/steps/drupal-ckeditor.md +118 -0
- package/docs/steps/drupal-core.md +688 -0
- package/docs/steps/drupal-layout-builder.md +437 -0
- package/docs/steps/drupal-media.md +107 -0
- package/docs/steps/drupal-moderation.md +81 -0
- package/docs/steps/drupal-paragraphs.md +36 -0
- package/docs/steps/element.md +455 -0
- package/docs/steps/field.md +648 -0
- package/docs/steps/file-download.md +235 -0
- package/docs/steps/form.md +344 -0
- package/docs/steps/iframe.md +248 -0
- package/docs/steps/input.md +220 -0
- package/docs/steps/javascript.md +111 -0
- package/docs/steps/keyboard.md +107 -0
- package/docs/steps/link.md +217 -0
- package/docs/steps/metatag.md +99 -0
- package/docs/steps/modal.md +232 -0
- package/docs/steps/navigation.md +275 -0
- package/docs/steps/network.md +284 -0
- package/docs/steps/path.md +203 -0
- package/docs/steps/response.md +102 -0
- package/docs/steps/responsive.md +139 -0
- package/docs/steps/rest.md +140 -0
- package/docs/steps/screenshot.md +211 -0
- package/docs/steps/scroll.md +266 -0
- package/docs/steps/selectors.md +848 -0
- package/docs/steps/storage.md +254 -0
- package/docs/steps/table.md +216 -0
- package/docs/steps/varbase.md +391 -0
- package/docs/steps/video.md +111 -0
- package/docs/steps/wait.md +553 -0
- package/docs/steps/web-first.md +289 -0
- package/docs/steps/xml.md +505 -0
- package/docs/steps/yaml.md +951 -0
- package/examples/a11y.html +31 -0
- package/examples/about-us.html +11 -0
- package/examples/account.html +32 -0
- package/examples/ajax-wait-examples.html +147 -0
- package/examples/contact-us.html +10 -0
- package/examples/cookies.html +10 -0
- package/examples/date.html +12 -0
- package/examples/dynamic-examples.html +498 -0
- package/examples/element.html +11 -0
- package/examples/example-api.json +28 -0
- package/examples/existing-page.html +11 -0
- package/examples/field.html +24 -0
- package/examples/index.html +37 -0
- package/examples/keyboard.html +11 -0
- package/examples/links.html +9 -0
- package/examples/modal.html +14 -0
- package/examples/path.html +3 -0
- package/examples/table.html +13 -0
- package/examples/test--modal-dialogs.html +252 -0
- package/examples/test--then--i-should--not--see-text-in-element.html +48 -0
- package/examples/test--then--i-should--see-text-in-element.html +48 -0
- package/examples/test--then--i-should--see-text-matching-pattern.html +31 -0
- package/examples/test--then--i-should-see-text-in-table-row.html +232 -0
- package/examples/test--then--the-checkbox-checked.html +68 -0
- package/examples/test--then--the-element-should_not-contain-cssproperty.html +47 -0
- package/examples/test--then--the-link-should-contain.html +21 -0
- package/examples/test--when--i-additionally-select.html +27 -0
- package/examples/test--when--i-attach-file-to-feild.html +50 -0
- package/examples/test--when--i-check-uncheck-checkbox.html +47 -0
- package/examples/test--when--i-click-link.html +18 -0
- package/examples/test--when--i-click-text-in-table-row.html +178 -0
- package/examples/test--when--i-fill-in.html +48 -0
- package/examples/test--when--i-press-button.html +31 -0
- package/examples/test--when--i-reload-page.html +27 -0
- package/examples/test--when--i-scroll-functionality.html +177 -0
- package/examples/test--when--i-scroll-left-right-functionality.html +149 -0
- package/examples/test--when--i-select-option-from-dropdownlist.html +35 -0
- package/examples/test--when--i-select-radio-button.html +95 -0
- package/examples/test--when-i-wait-max-of-time.html +39 -0
- package/examples/test--when-i-wait-page-until-is-loaded.html +47 -0
- package/examples/test--when-i-wait-specific-time.html +39 -0
- package/examples/test-acceptable-url-path.html +11 -0
- package/examples/video-demo.html +43 -0
- package/package.json +56 -0
- package/playwright.config.ts +39 -0
- package/tests/assets/test-document.pdf +14 -0
- package/tests/assets/vardot.png +0 -0
- package/tests/features/a11y.feature +39 -0
- package/tests/features/ajax-wait-examples.feature +24 -0
- package/tests/features/api-step-definitions-individual.feature +185 -0
- package/tests/features/complete-api-testing-examples.feature +205 -0
- package/tests/features/cookie.feature +13 -0
- package/tests/features/date.feature +11 -0
- package/tests/features/dynamic-content-examples.feature +156 -0
- package/tests/features/element.feature +16 -0
- package/tests/features/field.feature +25 -0
- package/tests/features/keyboard.feature +10 -0
- package/tests/features/link.feature +11 -0
- package/tests/features/modal-advanced-example.feature +54 -0
- package/tests/features/modal-basic-example.feature +42 -0
- package/tests/features/modal-error-handling-example.feature +37 -0
- package/tests/features/modal.feature +11 -0
- package/tests/features/path.feature +16 -0
- package/tests/features/response.feature +8 -0
- package/tests/features/responsive.feature +10 -0
- package/tests/features/table.feature +18 -0
- package/tests/features/test--given--i-am-an-anonymous-user.feature +10 -0
- package/tests/features/test--given--i-am-on-homepage.feature +16 -0
- package/tests/features/test--then--i-save-screenshot.feature +33 -0
- package/tests/features/test--then--i-see-locator.feature +320 -0
- package/tests/features/test--then--i-should--not--see-text-in-element.feature +13 -0
- package/tests/features/test--then--i-should--see-text-in-element-by-attr.feature +10 -0
- package/tests/features/test--then--i-should--see-text-in-element.feature +10 -0
- package/tests/features/test--then--i-should--see-text-matching-pattern-in-element.feature +13 -0
- package/tests/features/test--then--i-should--see-text-matching-pattern.feature +18 -0
- package/tests/features/test--then--i-should-be-on-page.feature +10 -0
- package/tests/features/test--then--i-should-be-on-the-homepage.feature +10 -0
- package/tests/features/test--then--i-should-not-see-an-element-by-attr.feature +8 -0
- package/tests/features/test--then--i-should-not-see-an-element.feature +8 -0
- package/tests/features/test--then--i-should-see-an-element-by-attr.feature +8 -0
- package/tests/features/test--then--i-should-see-an-element.feature +8 -0
- package/tests/features/test--then--i-should-see-n-elements.feature +24 -0
- package/tests/features/test--then--i-should-see-text-in-table-row.feature +96 -0
- package/tests/features/test--then--print-current-url-and-response.feature +21 -0
- package/tests/features/test--then--the-checkbox-is-checked.feature +18 -0
- package/tests/features/test--then--the-checkbox-should-be-checked.feature +16 -0
- package/tests/features/test--then--the-element-should-contain-cssproperty.feature +9 -0
- package/tests/features/test--then--the-element-should-not-contain-cssproperty.feature +10 -0
- package/tests/features/test--then--the-field-should-contain-value.feature +11 -0
- package/tests/features/test--then--the-response-should-contain.feature +11 -0
- package/tests/features/test--then--the-response-status-code-should-be.feature +31 -0
- package/tests/features/test--then--the-url-should-match.feature +7 -0
- package/tests/features/test--then-the-link-should-contain-by-attribute.feature +18 -0
- package/tests/features/test--then-the-link-should-contain.feature +7 -0
- package/tests/features/test--when--i-additionally-select.feature +30 -0
- package/tests/features/test--when--i-attach-file-to-feild.feature +9 -0
- package/tests/features/test--when--i-check-checkbox.feature +21 -0
- package/tests/features/test--when--i-click-link-by-attribute.feature +21 -0
- package/tests/features/test--when--i-click-link.feature +9 -0
- package/tests/features/test--when--i-click-text-in-table-row.feature +37 -0
- package/tests/features/test--when--i-fill-in-by-attr.feature +31 -0
- package/tests/features/test--when--i-fill-in-table-by-attr.feature +19 -0
- package/tests/features/test--when--i-fill-in.feature +32 -0
- package/tests/features/test--when--i-follow.feature +22 -0
- package/tests/features/test--when--i-go-to-homepage.feature +9 -0
- package/tests/features/test--when--i-move-forward-backward-one-page.feature +14 -0
- package/tests/features/test--when--i-press-button-by-attribute.feature +18 -0
- package/tests/features/test--when--i-press-button.feature +13 -0
- package/tests/features/test--when--i-reload-page.feature +11 -0
- package/tests/features/test--when--i-scroll-left-right.feature +48 -0
- package/tests/features/test--when--i-scroll.feature +48 -0
- package/tests/features/test--when--i-select-option-from-dropdownlist.feature +21 -0
- package/tests/features/test--when--i-select-radio-button.feature +37 -0
- package/tests/features/test--when--i-wait-page-is-loaded.feature +8 -0
- package/tests/features/test--when--i-wait-time.feature +21 -0
- package/tests/features/video.feature +18 -0
- package/tests/features/wait.feature +7 -0
- package/tests/features/yaml.feature +102 -0
- package/tests/selectors/_canonical-keys.json +113 -0
- package/tests/selectors/back-end-selectors.json +19 -0
- package/tests/selectors/cms-contentful-admin.json +35 -0
- package/tests/selectors/cms-craft-admin.json +39 -0
- package/tests/selectors/cms-drupal-cms-gin.json +56 -0
- package/tests/selectors/cms-drupal-core-claro.json +50 -0
- package/tests/selectors/cms-generic-admin.json +34 -0
- package/tests/selectors/cms-ghost-admin.json +34 -0
- package/tests/selectors/cms-joomla-admin.json +41 -0
- package/tests/selectors/cms-magento2-admin.json +32 -0
- package/tests/selectors/cms-prestashop-admin.json +38 -0
- package/tests/selectors/cms-shopify-admin.json +25 -0
- package/tests/selectors/cms-strapi-admin.json +42 -0
- package/tests/selectors/cms-typo3-admin.json +41 -0
- package/tests/selectors/cms-woocommerce-front.json +50 -0
- package/tests/selectors/cms-wordpress-admin.json +31 -0
- package/tests/selectors/framework-ant-design.json +80 -0
- package/tests/selectors/framework-bootstrap.json +86 -0
- package/tests/selectors/framework-bulma.json +74 -0
- package/tests/selectors/framework-chakra.json +58 -0
- package/tests/selectors/framework-foundation.json +51 -0
- package/tests/selectors/framework-material-ui.json +72 -0
- package/tests/selectors/framework-shadcn.json +51 -0
- package/tests/selectors/framework-tailwind.json +40 -0
- package/tests/selectors/framework-vuetify.json +61 -0
- package/tests/selectors/front-end-selectors.json +16 -0
- package/tests/selectors/homepage-selectors.json +13 -0
- package/tests/step-definitions/a11y.steps.js +800 -0
- package/tests/step-definitions/action.steps.js +167 -0
- package/tests/step-definitions/api.steps.js +732 -0
- package/tests/step-definitions/assertion.steps.js +352 -0
- package/tests/step-definitions/auth.steps.js +126 -0
- package/tests/step-definitions/clock.steps.js +128 -0
- package/tests/step-definitions/cookie.steps.js +216 -0
- package/tests/step-definitions/debug.steps.js +39 -0
- package/tests/step-definitions/dialog.steps.js +193 -0
- package/tests/step-definitions/drupal-canvas.steps.js +764 -0
- package/tests/step-definitions/drupal-ckeditor.steps.js +108 -0
- package/tests/step-definitions/drupal-core.steps.js +665 -0
- package/tests/step-definitions/drupal-helpers.js +371 -0
- package/tests/step-definitions/drupal-layout-builder.steps.js +466 -0
- package/tests/step-definitions/drupal-media.steps.js +99 -0
- package/tests/step-definitions/drupal-moderation.steps.js +71 -0
- package/tests/step-definitions/drupal-paragraphs.steps.js +50 -0
- package/tests/step-definitions/element.steps.js +356 -0
- package/tests/step-definitions/field.steps.js +653 -0
- package/tests/step-definitions/file-download.steps.js +211 -0
- package/tests/step-definitions/form.steps.js +333 -0
- package/tests/step-definitions/iframe.steps.js +228 -0
- package/tests/step-definitions/input.steps.js +202 -0
- package/tests/step-definitions/javascript.steps.js +232 -0
- package/tests/step-definitions/keyboard.steps.js +112 -0
- package/tests/step-definitions/link.steps.js +142 -0
- package/tests/step-definitions/metatag.steps.js +91 -0
- package/tests/step-definitions/modal.steps.js +244 -0
- package/tests/step-definitions/navigation.steps.js +218 -0
- package/tests/step-definitions/network.steps.js +280 -0
- package/tests/step-definitions/path.steps.js +141 -0
- package/tests/step-definitions/response.steps.js +98 -0
- package/tests/step-definitions/responsive.steps.js +125 -0
- package/tests/step-definitions/rest.steps.js +111 -0
- package/tests/step-definitions/screenshot.steps.js +423 -0
- package/tests/step-definitions/scroll.steps.js +189 -0
- package/tests/step-definitions/selectors.steps.js +1003 -0
- package/tests/step-definitions/storage.steps.js +194 -0
- package/tests/step-definitions/table.steps.js +181 -0
- package/tests/step-definitions/varbase-e2e.js +897 -0
- package/tests/step-definitions/varbase.steps.js +458 -0
- package/tests/step-definitions/video.steps.js +178 -0
- package/tests/step-definitions/wait.steps.js +400 -0
- package/tests/step-definitions/web-first.steps.js +298 -0
- package/tests/step-definitions/xml.steps.js +411 -0
- package/tests/step-definitions/yaml.steps.js +913 -0
- 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
|
+
```
|