agents-cli-automation 1.0.16 → 1.0.18
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/package.json +1 -1
- package/src/templates/playwright-agent-ts.md +131 -133
package/package.json
CHANGED
|
@@ -4,163 +4,163 @@ description: Snapshot and quick guide for the Playwright + TypeScript+BDD setup
|
|
|
4
4
|
argument-hint: "(no args)"
|
|
5
5
|
|
|
6
6
|
----
|
|
7
|
-
# Playwright + TypeScript — repo snapshot
|
|
8
|
-
**Current Setup**
|
|
9
|
-
- **@playwright/test**: pinned to a verified stable version
|
|
10
|
-
- **playwright-bdd**: used in this repo; the `test` script runs `bddgen` to convert Gherkin features into Playwright specs
|
|
11
|
-
- **TypeScript**: pinned to a verified stable version
|
|
7
|
+
# Playwright + TypeScript (BDD) — repo snapshot
|
|
12
8
|
|
|
13
|
-
|
|
9
|
+
## Current Setup
|
|
14
10
|
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
-
|
|
11
|
+
- **@playwright/test**: v1.36.0 (or later)
|
|
12
|
+
- **playwright-bdd**: v8.4.2 (latest) — generator that converts Gherkin `.feature` files into Playwright specs
|
|
13
|
+
- **TypeScript**: v5.1.0 (or later)
|
|
14
|
+
|
|
15
|
+
This repository uses a **generator-based BDD flow**: Gherkin feature files in `tests/features/` are converted to Playwright specs by `bddgen`, and those specs are executed with `@playwright/test`.
|
|
16
|
+
|
|
17
|
+
## Key Points
|
|
18
|
+
|
|
19
|
+
- **Generator flow**: the `test` script runs `npx bddgen` (generates specs from features) followed by `npx playwright test` (runs generated specs).
|
|
20
|
+
- **Features**: place Gherkin files in `tests/features/*.feature`.
|
|
21
|
+
- **Steps**: implement step definitions in `tests/steps/*.ts`.
|
|
22
|
+
- **Fixtures**: `tests/fixtures/base.fixture.ts` extends the `playwright-bdd` `test` with custom fixtures like `loginPage`, and is included in the `steps` pattern so `bddgen` can wire fixtures to step handlers.
|
|
23
|
+
- **Config**: `playwright.config.ts` defines BDD config with `defineBddConfig()`, specifying `features`, `steps` (including fixtures first), and `outputDir`.
|
|
24
|
+
|
|
25
|
+
## Quick Files to Review
|
|
20
26
|
|
|
21
|
-
Quick files to review
|
|
22
27
|
- Playwright config: [playwright.config.ts](playwright.config.ts)
|
|
23
28
|
- TypeScript config: [tsconfig.json](tsconfig.json)
|
|
24
29
|
- Page object example: [tests/pages/login.page.ts](tests/pages/login.page.ts)
|
|
25
|
-
- JSON data utility: [tests/utils/data.ts](tests/utils/data.ts)
|
|
26
30
|
- Fixtures: [tests/fixtures/base.fixture.ts](tests/fixtures/base.fixture.ts)
|
|
27
31
|
- Steps: [tests/steps/loginSteps.ts](tests/steps/loginSteps.ts)
|
|
28
32
|
- Features: [tests/features/login.feature](tests/features/login.feature)
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
----------------------------------
|
|
32
|
-
|
|
33
|
-
Use https://www.saucedemo.com/ with these demo credentials to get a working test quickly:
|
|
34
|
-
|
|
35
|
-
- username: `standard_user`
|
|
36
|
-
- password: `secret_sauce`
|
|
37
|
-
|
|
38
|
-
Here's a minimal Playwright test that performs a login and asserts the inventory page loads:
|
|
39
|
-
|
|
40
|
-
```ts
|
|
41
|
-
import { test, expect } from '@playwright/test';
|
|
42
|
-
|
|
43
|
-
test('saucedemo login works', async ({ page }) => {
|
|
44
|
-
await page.goto('https://www.saucedemo.com/');
|
|
45
|
-
await page.fill('[data-test="username"]', 'standard_user');
|
|
46
|
-
await page.fill('[data-test="password"]', 'secret_sauce');
|
|
47
|
-
await page.click('[data-test="login-button"]');
|
|
48
|
-
await expect(page).toHaveURL(/inventory.html/);
|
|
49
|
-
await expect(page.locator('.inventory_list')).toBeVisible();
|
|
50
|
-
});
|
|
51
|
-
```
|
|
34
|
+
## Setup & Run Tests
|
|
52
35
|
|
|
53
|
-
|
|
36
|
+
Install dependencies:
|
|
54
37
|
|
|
55
38
|
```bash
|
|
56
|
-
|
|
39
|
+
npm install
|
|
40
|
+
npx playwright install
|
|
57
41
|
```
|
|
58
42
|
|
|
59
|
-
If you want, I can update the existing `tests/example.spec.ts` and `tests/pages/login.page.ts` to use this Sauce Demo flow and run the tests here.
|
|
60
|
-
|
|
61
|
-
|
|
62
43
|
Run the tests (generator BDD flow):
|
|
63
44
|
|
|
64
45
|
```bash
|
|
65
|
-
npm
|
|
66
|
-
|
|
67
|
-
# Playwright + TypeScript — repo snapshot
|
|
46
|
+
npm test
|
|
47
|
+
```
|
|
68
48
|
|
|
69
|
-
|
|
49
|
+
This runs `npx bddgen` to generate Playwright specs from `.feature` files, then `npx playwright test` to execute them.
|
|
70
50
|
|
|
71
|
-
|
|
72
|
-
- **playwright-bdd** — optional generator used in this repo; the `test` script runs `bddgen` to convert Gherkin features into Playwright specs.
|
|
73
|
-
- **TypeScript** — pinned to a verified stable version.
|
|
51
|
+
## Example: Sauce Demo Login
|
|
74
52
|
|
|
75
|
-
|
|
53
|
+
A working example is included that tests login at https://www.saucedemo.com/ using demo credentials:
|
|
54
|
+
- username: `standard_user`
|
|
55
|
+
- password: `secret_sauce`
|
|
76
56
|
|
|
77
|
-
|
|
57
|
+
**Feature file** (`tests/features/login.feature`):
|
|
58
|
+
```gherkin
|
|
59
|
+
Feature: Login
|
|
60
|
+
Scenario: Successful login to SauceDemo
|
|
61
|
+
Given I open the login page
|
|
62
|
+
When I login with "standard_user" and "secret_sauce"
|
|
63
|
+
Then I should see the inventory page
|
|
64
|
+
```
|
|
78
65
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
66
|
+
**Step definitions** (`tests/steps/loginSteps.ts`):
|
|
67
|
+
```ts
|
|
68
|
+
import { createBdd } from 'playwright-bdd';
|
|
69
|
+
import { expect } from '@playwright/test';
|
|
70
|
+
import { test } from '../fixtures/base.fixture';
|
|
83
71
|
|
|
84
|
-
|
|
72
|
+
const { Given, When, Then } = createBdd(test);
|
|
85
73
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
- JSON data utility: [tests/utils/data.ts](tests/utils/data.ts)
|
|
90
|
-
- Fixtures: [tests/fixtures/base.fixture.ts](tests/fixtures/base.fixture.ts)
|
|
91
|
-
- Steps: [tests/steps/loginSteps.ts](tests/steps/loginSteps.ts)
|
|
92
|
-
- Features: [tests/features/login.feature](tests/features/login.feature)
|
|
74
|
+
Given('I open the login page', async ({ page }) => {
|
|
75
|
+
await page.goto('/');
|
|
76
|
+
});
|
|
93
77
|
|
|
94
|
-
|
|
78
|
+
When('I login with {string} and {string}', async ({ loginPage }, username: string, password: string) => {
|
|
79
|
+
await loginPage.login(username, password);
|
|
80
|
+
});
|
|
95
81
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
npx playwright install
|
|
100
|
-
npm test
|
|
82
|
+
Then('I should see the inventory page', async ({ page }) => {
|
|
83
|
+
await expect(page).toHaveURL(/inventory.html/);
|
|
84
|
+
});
|
|
101
85
|
```
|
|
102
86
|
|
|
103
|
-
|
|
104
|
-
|
|
87
|
+
**Fixtures** (`tests/fixtures/base.fixture.ts`):
|
|
88
|
+
```ts
|
|
89
|
+
import { test as base } from 'playwright-bdd';
|
|
90
|
+
import { LoginPage } from '../pages/login.page';
|
|
105
91
|
|
|
106
|
-
|
|
92
|
+
type Fixtures = {
|
|
93
|
+
loginPage: LoginPage;
|
|
94
|
+
};
|
|
107
95
|
|
|
108
|
-
|
|
96
|
+
export const test = base.extend<Fixtures>({
|
|
97
|
+
loginPage: async ({ page }, use) => {
|
|
98
|
+
await use(new LoginPage(page));
|
|
99
|
+
},
|
|
100
|
+
});
|
|
109
101
|
|
|
110
|
-
|
|
111
|
-
npm install -D playwright-bdd
|
|
112
|
-
npx playwright install
|
|
113
|
-
npm test
|
|
102
|
+
export { expect } from '@playwright/test';
|
|
114
103
|
```
|
|
115
104
|
|
|
116
|
-
|
|
105
|
+
## Playwright Config
|
|
117
106
|
|
|
118
|
-
|
|
107
|
+
**Key sections** (`playwright.config.ts`):
|
|
108
|
+
```ts
|
|
109
|
+
import { defineConfig } from '@playwright/test';
|
|
110
|
+
import { defineBddConfig } from 'playwright-bdd';
|
|
111
|
+
|
|
112
|
+
export default defineConfig({
|
|
113
|
+
testDir: 'tests',
|
|
114
|
+
timeout: 30_000,
|
|
115
|
+
use: {
|
|
116
|
+
headless: true,
|
|
117
|
+
viewport: { width: 1280, height: 720 },
|
|
118
|
+
baseURL: 'https://www.saucedemo.com'
|
|
119
|
+
}
|
|
120
|
+
});
|
|
119
121
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
122
|
+
export const bdd = defineBddConfig({
|
|
123
|
+
features: 'tests/features/**/*.feature',
|
|
124
|
+
steps: ['tests/fixtures/**/*.ts', 'tests/steps/**/*.ts'],
|
|
125
|
+
outputDir: 'tests',
|
|
126
|
+
});
|
|
123
127
|
|
|
124
|
-
|
|
128
|
+
## Notes on Reporters (update)
|
|
125
129
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
"playwright:install": "npx playwright install"
|
|
130
|
-
}
|
|
130
|
+
- The Playwright config uses the singular `reporter` property (not `reporters`).
|
|
131
|
+
- Example reporter config added in the repo: `['list']`, `['html', { open: 'never' }]`, and `['junit', { outputFile: 'results/junit.xml' }]`.
|
|
132
|
+
- A TypeScript check (`npx tsc --noEmit`) was run and passed after this fix.
|
|
131
133
|
```
|
|
132
134
|
|
|
135
|
+
**Important**: Include `tests/fixtures/**/*.ts` **before** `tests/steps/**/*.ts` in the `steps` pattern so fixtures are loaded first and available to step definitions.
|
|
133
136
|
|
|
134
|
-
##
|
|
137
|
+
## Common Patterns
|
|
135
138
|
|
|
136
|
-
|
|
137
|
-
- Generated specs are written to the configured output directory (commonly `.features-gen`) and then executed by Playwright.
|
|
139
|
+
### Using Fixtures in Steps
|
|
138
140
|
|
|
139
|
-
|
|
141
|
+
To use a custom fixture in step definitions, import the fixture-extended `test` from your fixture file and pass it to `createBdd()`:
|
|
140
142
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
## Ways I can help
|
|
145
|
-
|
|
146
|
-
- Add `playwright-bdd` to `devDependencies` and update `package.json` so `npm install` installs it automatically.
|
|
147
|
-
- Add a GitHub Actions workflow that runs `npm test` on push.
|
|
148
|
-
- Expand page objects, feature coverage, or step definitions.
|
|
143
|
+
```ts
|
|
144
|
+
import { createBdd } from 'playwright-bdd';
|
|
145
|
+
import { test } from '../fixtures/base.fixture';
|
|
149
146
|
|
|
150
|
-
|
|
147
|
+
const { Given, When, Then } = createBdd(test);
|
|
151
148
|
|
|
152
|
-
|
|
149
|
+
When('I do something', async ({ myCustomFixture }) => {
|
|
150
|
+
// myCustomFixture is now available
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
153
|
|
|
154
|
-
|
|
154
|
+
### Data Utilities
|
|
155
155
|
|
|
156
|
-
|
|
156
|
+
Load test data from JSON or YAML files:
|
|
157
157
|
|
|
158
158
|
```bash
|
|
159
159
|
npm install js-yaml
|
|
160
160
|
npm install -D @types/js-yaml
|
|
161
161
|
```
|
|
162
162
|
|
|
163
|
-
Example
|
|
163
|
+
Example utility (`tests/utils/readData.ts`):
|
|
164
164
|
|
|
165
165
|
```ts
|
|
166
166
|
import fs from 'fs';
|
|
@@ -168,58 +168,56 @@ import path from 'path';
|
|
|
168
168
|
import yaml from 'js-yaml';
|
|
169
169
|
|
|
170
170
|
export function readData(filePath: string): any {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
171
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
172
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
173
|
+
if (ext === '.json') return JSON.parse(raw);
|
|
174
|
+
if (ext === '.yml' || ext === '.yaml') return yaml.load(raw);
|
|
175
|
+
throw new Error(`Unsupported data format: ${ext}`);
|
|
176
176
|
}
|
|
177
177
|
```
|
|
178
178
|
|
|
179
|
-
Usage
|
|
179
|
+
Usage in steps:
|
|
180
180
|
|
|
181
181
|
```ts
|
|
182
182
|
import { readData } from '../utils/readData';
|
|
183
183
|
|
|
184
|
-
const
|
|
185
|
-
|
|
184
|
+
const loginData = readData('tests/data/users.yaml');
|
|
185
|
+
When('I login as {string}', async ({ page }, username: string) => {
|
|
186
|
+
const user = loginData[username];
|
|
187
|
+
// use user.password, etc.
|
|
188
|
+
});
|
|
186
189
|
```
|
|
187
190
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
- If you prefer importing JSON directly, enable `resolveJsonModule` in `tsconfig.json`.
|
|
191
|
-
- For large or frequently-modified data files, consider caching the parsed result in the utility.
|
|
192
|
-
|
|
193
|
-
## Dependency updates & provisioning
|
|
191
|
+
## Dependency Updates
|
|
194
192
|
|
|
195
|
-
To update dev dependencies
|
|
193
|
+
To update dev dependencies to compatible latest versions:
|
|
196
194
|
|
|
197
195
|
```bash
|
|
198
|
-
# update devDependencies in package.json
|
|
199
196
|
npx npm-check-updates -u '/.*/' --dep dev
|
|
200
|
-
|
|
201
|
-
# install updates
|
|
202
197
|
npm install
|
|
203
198
|
```
|
|
204
199
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
- `npx npm-check-updates -u` only modifies `package.json`. If `package-lock.json` or `node_modules` pin old versions, run a fresh install:
|
|
200
|
+
If you encounter peer dependency conflicts or need a fresh install:
|
|
208
201
|
|
|
209
202
|
```bash
|
|
210
|
-
#
|
|
203
|
+
# Windows PowerShell:
|
|
204
|
+
Remove-Item -Recurse -Force node_modules
|
|
205
|
+
Remove-Item package-lock.json
|
|
206
|
+
npm install
|
|
207
|
+
|
|
208
|
+
# Or on macOS/Linux:
|
|
211
209
|
rm -rf node_modules package-lock.json
|
|
212
210
|
npm install
|
|
213
211
|
```
|
|
214
212
|
|
|
215
|
-
|
|
213
|
+
## Troubleshooting
|
|
216
214
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
npm install
|
|
221
|
-
```
|
|
215
|
+
**"BDD config not found" error**: Ensure `playwright.config.ts` exports `bdd = defineBddConfig({...})` and the `testDir` matches your `outputDir`.
|
|
216
|
+
|
|
217
|
+
**"Unknown parameter" in generated tests**: Make sure custom fixture files are included in the `steps` pattern **before** step definition files, so fixtures are loaded and available.
|
|
222
218
|
|
|
223
|
-
|
|
219
|
+
**Tests not found**: Verify `outputDir` in `defineBddConfig()` points to a directory inside (or at) Playwright's `testDir`, typically `'tests'`.
|
|
220
|
+
|
|
221
|
+
---
|
|
224
222
|
|
|
225
|
-
|
|
223
|
+
_Updated: Playwright + TypeScript + BDD setup snapshot_
|