Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
7886b41
build: configure playwright-bdd test runner and dependencies
xiduzo Jul 14, 2026
c4dbc5e
chore: remove legacy pre-BDD spec tests and login helpers
xiduzo Jul 14, 2026
9552728
test(e2e): add Plateau-4 playwright-bdd suite with vertical structure
xiduzo Jul 14, 2026
ec3bab0
docs: document e2e suite and remaining Plateau-4 work
xiduzo Jul 14, 2026
9900fad
refactor(e2e): promote admin page-objects to playwright-bdd fixtures
xiduzo Jul 14, 2026
5d5926f
fix(e2e): correct TOPIC_IMAGE path + enable aiFix report prompts
xiduzo Jul 15, 2026
c5d6683
test(e2e): implement TS6/7 publicatie + TS8 document beheer
xiduzo Jul 15, 2026
ee69113
build(e2e): upgrade zod 3→4
xiduzo Jul 15, 2026
e7359ba
feat(e2e): route Stagehand scenarios by role×cost tier
xiduzo Jul 15, 2026
79140b0
docs(e2e): document AI model routing
xiduzo Jul 15, 2026
efb2661
chore(e2e): ignore scratch/ run artifacts
xiduzo Jul 15, 2026
f08914a
style(e2e): apply prettier to PLAN doc
xiduzo Jul 15, 2026
e59f52e
feat(e2e): one unified trace per Stagehand scenario via shared browser
xiduzo Jul 15, 2026
49a425d
test(e2e): scope @ai to chromium and add local retries
xiduzo Jul 16, 2026
86e6e70
fix(e2e): harden admin helpers against render/timeout/500 flake
xiduzo Jul 16, 2026
dc608aa
fix(e2e): set publicatiestatus deterministically via native <select>
xiduzo Jul 16, 2026
30e288f
test(e2e): tag AI tiers, quarantine TS8, drop redundant folder tags
xiduzo Jul 16, 2026
70bbcb1
docs(e2e): document tags-from-path rule and TS8 provision prerequisite
xiduzo Jul 16, 2026
a4fbfd5
fix(e2e): open document change page deterministically, drop TS8 @fixme
xiduzo Jul 16, 2026
1ab971c
refactor(e2e): split fixtures per app, add role registry, singleton g…
xiduzo Jul 16, 2026
f8f663a
test(e2e): rename step files to <feature>.steps.ts convention
xiduzo Jul 16, 2026
a53c981
Add E2E-on-local-k8s CI workflow
xiduzo Jul 20, 2026
430fca3
feat(e2e): document coverage gaps with @todo scenarios and stubs
xiduzo Jul 21, 2026
0095863
add playwright-cli skills
xiduzo Jul 21, 2026
d04fb1f
fix(ci): pin charts to local-via-k3d ref + ES2022 lib for Error cause
xiduzo Jul 21, 2026
dbf4f48
fix(ci): install Helm 3.18 for --force-conflicts; clear all lint errors
xiduzo Jul 21, 2026
8de8799
fix(ci): install Helm 3.18 onto PATH via get-helm-3 script
xiduzo Jul 21, 2026
360069b
fix(ci): install Helm 4 (v4.2.3) for up.sh's --force-conflicts
xiduzo Jul 21, 2026
a2710f3
fix(ci): free runner disk before build — playwright deps hit no-space
xiduzo Jul 21, 2026
af31ad1
fix(e2e): keep {} step fixture pattern (playwright-bdd), disable no-e…
xiduzo Jul 21, 2026
18fad17
fix(e2e): decode Keycloak TOTP seed from UTF-8, not Base32
xiduzo Jul 21, 2026
d65d804
few scripts
surbhijha92 Jul 27, 2026
5e11c14
test scripts 6 and 7 ready
surbhijha92 Jul 29, 2026
5754834
ci(e2e): publish run summary to Confluence + report to GitHub Pages
xiduzo Jul 31, 2026
4791812
fix(bdd): comment out stray status notes in publicaties.feature
xiduzo Jul 31, 2026
999e08b
e2e-k8s: publish the full scenario tree to Confluence, deploy Pages o…
xiduzo Jul 31, 2026
f8a5f7e
confluence: only deep-link scenarios when REPORT_URL is set
xiduzo Jul 31, 2026
b8150c5
confluence: 4-column scenario table with the Gherkin source
xiduzo Jul 31, 2026
f25b7b0
TS9: implement the @todo gap scenarios, drop Stagehand from publicaties
xiduzo Aug 3, 2026
74a3be1
scripts till TS 6
surbhijha92 Aug 4, 2026
fa32075
report: full-width tables, report link under status
xiduzo Aug 4, 2026
895dabe
ci: unbreak the three pipelines
xiduzo Aug 4, 2026
95b6c8b
chore: npm run otp for a fresh Keycloak TOTP code
xiduzo Aug 5, 2026
958cadb
dont check in playwright files
xiduzo Aug 7, 2026
afb0a7b
added to gitignore
xiduzo Aug 7, 2026
cb94fcb
refactor: add admin navigation helper and robustify `organisaties` tests
xiduzo Aug 7, 2026
a1618e9
feat: enhance GPP-app BDD tests and add AI agent context rules
xiduzo Aug 10, 2026
3264be5
refactor: BDD tests to Playwright locators, deprecate AI automation
xiduzo Aug 10, 2026
5f848af
feat: expand BDD coverage and improve UI interaction robustness
xiduzo Aug 10, 2026
b4ad3f7
feat: harden burgerportaal/gpp-app BDD flows and add blocked steps
xiduzo Aug 10, 2026
1ad2664
fix: improve Confluence report layout and Scenario Outline Gherkin ma…
xiduzo Aug 10, 2026
8766cd9
fix: include Playwright skip/fix reasons in Confluence scenario reports
xiduzo Aug 10, 2026
9bfa8e4
feat: unblock zoeken and sitemap BDD scenarios with ES-backed steps
xiduzo Aug 10, 2026
2dd46f5
feat: enable document content search and document withdraw BDD scenarios
xiduzo Aug 10, 2026
61dc859
fix(e2e): drive the full 3-browser suite green (235 -> 304 passed)
xiduzo Aug 10, 2026
15c412c
fix(ci): unbreak the webkit project and pin the publicatiebank token-…
xiduzo Aug 10, 2026
a9017dc
fix(ci): provision the Documenten API after bring-up
xiduzo Aug 10, 2026
7b229ef
fix(ci): make the failure dump actually dump the apps, and explain em…
xiduzo Aug 11, 2026
40e0b00
fix(ci): set SITEMAP_CACHE_WAIT_MS
xiduzo Aug 11, 2026
a0d8f14
test(sitemap): say why a document is missing from the sitemap
xiduzo Aug 11, 2026
052c729
Cut the E2E pipeline from ~54 min to ~20 min on PRs
xiduzo Aug 11, 2026
b2f1f72
Merge a scenario's per-browser specs into one report row
xiduzo Aug 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
420 changes: 420 additions & 0 deletions .claude/skills/playwright-cli/SKILL.md

Large diffs are not rendered by default.

23 changes: 23 additions & 0 deletions .claude/skills/playwright-cli/references/element-attributes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Inspecting Element Attributes

When the snapshot doesn't show an element's `id`, `class`, `data-*` attributes, or other DOM properties, use `eval` to inspect them.

## Examples

```bash
playwright-cli snapshot
# snapshot shows a button as e7 but doesn't reveal its id or data attributes

# get the element's id
playwright-cli eval "el => el.id" e7

# get all CSS classes
playwright-cli eval "el => el.className" e7

# get a specific attribute
playwright-cli eval "el => el.getAttribute('data-testid')" e7
playwright-cli eval "el => el.getAttribute('aria-label')" e7

# get a computed style property
playwright-cli eval "el => getComputedStyle(el).display" e7
```
39 changes: 39 additions & 0 deletions .claude/skills/playwright-cli/references/playwright-tests.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Running Playwright Tests

To run Playwright tests, use the `npx playwright test` command, or a package manager script. To avoid opening the interactive html report, use `PLAYWRIGHT_HTML_OPEN=never` environment variable.

```bash
# Run all tests
PLAYWRIGHT_HTML_OPEN=never npx playwright test

# Run all tests through a custom npm script
PLAYWRIGHT_HTML_OPEN=never npm run special-test-command
```

# Debugging Playwright Tests

To debug a failing Playwright test, run it with `--debug=cli` option. This command will pause the test at the start and print the debugging instructions.

**IMPORTANT**: run the command in the background and check the output until "Debugging Instructions" is printed. Make sure to stop the command after you have finished.

Once instructions containing a session name are printed, use `playwright-cli` to attach the session and explore the page.

```bash
# Run the test
PLAYWRIGHT_HTML_OPEN=never npx playwright test --debug=cli
# ...
# ... debugging instructions for "tw-abcdef" session ...
# ...

# Attach to the test
playwright-cli attach tw-abcdef
```

Keep the test running in the background while you explore and look for a fix.
The test is paused at the start, so you should step over or pause at a particular location
where the problem is most likely to be.

Every action you perform with `playwright-cli` generates corresponding Playwright TypeScript code.
This code appears in the output and can be copied directly into the test. Most of the time, a specific locator or an expectation should be updated, but it could also be a bug in the app. Use your judgement.

After fixing the test, stop the background test run. Rerun to check that test passes.
87 changes: 87 additions & 0 deletions .claude/skills/playwright-cli/references/request-mocking.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Request Mocking

Intercept, mock, modify, and block network requests.

## CLI Route Commands

```bash
# Mock with custom status
playwright-cli route "**/*.jpg" --status=404

# Mock with JSON body
playwright-cli route "**/api/users" --body='[{"id":1,"name":"Alice"}]' --content-type=application/json

# Mock with custom headers
playwright-cli route "**/api/data" --body='{"ok":true}' --header="X-Custom: value"

# Remove headers from requests
playwright-cli route "**/*" --remove-header=cookie,authorization

# List active routes
playwright-cli route-list

# Remove a route or all routes
playwright-cli unroute "**/*.jpg"
playwright-cli unroute
```

## URL Patterns

```
**/api/users - Exact path match
**/api/*/details - Wildcard in path
**/*.{png,jpg,jpeg} - Match file extensions
**/search?q=* - Match query parameters
```

## Advanced Mocking with run-code

For conditional responses, request body inspection, response modification, or delays:

### Conditional Response Based on Request

```bash
playwright-cli run-code "async page => {
await page.route('**/api/login', route => {
const body = route.request().postDataJSON();
if (body.username === 'admin') {
route.fulfill({ body: JSON.stringify({ token: 'mock-token' }) });
} else {
route.fulfill({ status: 401, body: JSON.stringify({ error: 'Invalid' }) });
}
});
}"
```

### Modify Real Response

```bash
playwright-cli run-code "async page => {
await page.route('**/api/user', async route => {
const response = await route.fetch();
const json = await response.json();
json.isPremium = true;
await route.fulfill({ response, json });
});
}"
```

### Simulate Network Failures

```bash
playwright-cli run-code "async page => {
await page.route('**/api/offline', route => route.abort('internetdisconnected'));
}"
# Options: connectionrefused, timedout, connectionreset, internetdisconnected
```

### Delayed Response

```bash
playwright-cli run-code "async page => {
await page.route('**/api/slow', async route => {
await new Promise(r => setTimeout(r, 3000));
route.fulfill({ body: JSON.stringify({ data: 'loaded' }) });
});
}"
```
241 changes: 241 additions & 0 deletions .claude/skills/playwright-cli/references/running-code.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
# Running Custom Playwright Code

Use `run-code` to execute arbitrary Playwright code for advanced scenarios not covered by CLI commands.

## Syntax

```bash
playwright-cli run-code "async page => {
// Your Playwright code here
// Access page.context() for browser context operations
}"
```

You can also load the function from a file:

```bash
playwright-cli run-code --filename=./my-script.js
```


The code must be a single function expression, it is wrapped in `(...)` and evaluated.
import/export/require syntax is not supported.

## Geolocation

```bash
# Grant geolocation permission and set location
playwright-cli run-code "async page => {
await page.context().grantPermissions(['geolocation']);
await page.context().setGeolocation({ latitude: 37.7749, longitude: -122.4194 });
}"

# Set location to London
playwright-cli run-code "async page => {
await page.context().grantPermissions(['geolocation']);
await page.context().setGeolocation({ latitude: 51.5074, longitude: -0.1278 });
}"

# Clear geolocation override
playwright-cli run-code "async page => {
await page.context().clearPermissions();
}"
```

## Permissions

```bash
# Grant multiple permissions
playwright-cli run-code "async page => {
await page.context().grantPermissions([
'geolocation',
'notifications',
'camera',
'microphone'
]);
}"

# Grant permissions for specific origin
playwright-cli run-code "async page => {
await page.context().grantPermissions(['clipboard-read'], {
origin: 'https://example.com'
});
}"
```

## Media Emulation

```bash
# Emulate dark color scheme
playwright-cli run-code "async page => {
await page.emulateMedia({ colorScheme: 'dark' });
}"

# Emulate light color scheme
playwright-cli run-code "async page => {
await page.emulateMedia({ colorScheme: 'light' });
}"

# Emulate reduced motion
playwright-cli run-code "async page => {
await page.emulateMedia({ reducedMotion: 'reduce' });
}"

# Emulate print media
playwright-cli run-code "async page => {
await page.emulateMedia({ media: 'print' });
}"
```

## Wait Strategies

```bash
# Wait for network idle
playwright-cli run-code "async page => {
await page.waitForLoadState('networkidle');
}"

# Wait for specific element
playwright-cli run-code "async page => {
await page.locator('.loading').waitFor({ state: 'hidden' });
}"

# Wait for function to return true
playwright-cli run-code "async page => {
await page.waitForFunction(() => window.appReady === true);
}"

# Wait with timeout
playwright-cli run-code "async page => {
await page.locator('.result').waitFor({ timeout: 10000 });
}"
```

## Frames and Iframes

```bash
# Work with iframe
playwright-cli run-code "async page => {
const frame = page.locator('iframe#my-iframe').contentFrame();
await frame.locator('button').click();
}"

# Get all frames
playwright-cli run-code "async page => {
const frames = page.frames();
return frames.map(f => f.url());
}"
```

## File Downloads

```bash
# Handle file download
playwright-cli run-code "async page => {
const downloadPromise = page.waitForEvent('download');
await page.getByRole('link', { name: 'Download' }).click();
const download = await downloadPromise;
await download.saveAs('./downloaded-file.pdf');
return download.suggestedFilename();
}"
```

## Clipboard

```bash
# Read clipboard (requires permission)
playwright-cli run-code "async page => {
await page.context().grantPermissions(['clipboard-read']);
return await page.evaluate(() => navigator.clipboard.readText());
}"

# Write to clipboard
playwright-cli run-code "async page => {
await page.evaluate(text => navigator.clipboard.writeText(text), 'Hello clipboard!');
}"
```

## Page Information

```bash
# Get page title
playwright-cli run-code "async page => {
return await page.title();
}"

# Get current URL
playwright-cli run-code "async page => {
return page.url();
}"

# Get page content
playwright-cli run-code "async page => {
return await page.content();
}"

# Get viewport size
playwright-cli run-code "async page => {
return page.viewportSize();
}"
```

## JavaScript Execution

```bash
# Execute JavaScript and return result
playwright-cli run-code "async page => {
return await page.evaluate(() => {
return {
userAgent: navigator.userAgent,
language: navigator.language,
cookiesEnabled: navigator.cookieEnabled
};
});
}"

# Pass arguments to evaluate
playwright-cli run-code "async page => {
const multiplier = 5;
return await page.evaluate(m => document.querySelectorAll('li').length * m, multiplier);
}"
```

## Error Handling

```bash
# Try-catch in run-code
playwright-cli run-code "async page => {
try {
await page.getByRole('button', { name: 'Submit' }).click({ timeout: 1000 });
return 'clicked';
} catch (e) {
return 'element not found';
}
}"
```

## Complex Workflows

```bash
# Login and save state
playwright-cli run-code "async page => {
await page.goto('https://example.com/login');
await page.getByRole('textbox', { name: 'Email' }).fill('user@example.com');
await page.getByRole('textbox', { name: 'Password' }).fill('secret');
await page.getByRole('button', { name: 'Sign in' }).click();
await page.waitForURL('**/dashboard');
await page.context().storageState({ path: 'auth.json' });
return 'Login successful';
}"

# Scrape data from multiple pages
playwright-cli run-code "async page => {
const results = [];
for (let i = 1; i <= 3; i++) {
await page.goto(\`https://example.com/page/\${i}\`);
const items = await page.locator('.item').allTextContents();
results.push(...items);
}
return results;
}"
```
Loading
Loading