Web Application Testing
anthropics/skills
Tests local web applications with Python Playwright scripts, checking frontend behavior, capturing screenshots and reading browser console logs.
Guide for writing, organizing, and maintaining Playwright end-to-end tests using the Page Object Model pattern.
$ npx skills add openkaiden/kaiden --skill playwright-testing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install openkaiden/kaiden playwright-testing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/openkaiden/kaiden.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/playwright-testing .claude/skills/playwright-testing && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "playwright-testing" agent skill from https://github.com/openkaiden/kaiden/tree/main/.agents/skills/playwright-testing into .claude/skills/playwright-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-testing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/openkaiden/kaiden/tree/main/.agents/skills/playwright-testingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add openkaiden/kaiden --skill playwright-testing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install openkaiden/kaiden playwright-testing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openkaiden/kaiden.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/playwright-testing .agents/skills/playwright-testing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "playwright-testing" agent skill from https://github.com/openkaiden/kaiden/tree/main/.agents/skills/playwright-testing into .agents/skills/playwright-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-testing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openkaiden/kaiden --skill playwright-testing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install openkaiden/kaiden playwright-testing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openkaiden/kaiden.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/playwright-testing .cursor/skills/playwright-testing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "playwright-testing" agent skill from https://github.com/openkaiden/kaiden/tree/main/.agents/skills/playwright-testing into .cursor/skills/playwright-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-testing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/openkaiden/kaiden.git --path .agents/skills/playwright-testing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add openkaiden/kaiden --skill playwright-testing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install openkaiden/kaiden playwright-testing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openkaiden/kaiden.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/playwright-testing .gemini/skills/playwright-testing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "playwright-testing" agent skill from https://github.com/openkaiden/kaiden/tree/main/.agents/skills/playwright-testing into .gemini/skills/playwright-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-testing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install openkaiden/kaiden playwright-testingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add openkaiden/kaiden --skill playwright-testing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/openkaiden/kaiden.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/playwright-testing .github/skills/playwright-testing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "playwright-testing" agent skill from https://github.com/openkaiden/kaiden/tree/main/.agents/skills/playwright-testing into .github/skills/playwright-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-testing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add openkaiden/kaiden --skill playwright-testing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install openkaiden/kaiden playwright-testing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/openkaiden/kaiden.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/playwright-testing .opencode/skills/playwright-testing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "playwright-testing" agent skill from https://github.com/openkaiden/kaiden/tree/main/.agents/skills/playwright-testing into .opencode/skills/playwright-testing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "playwright-testing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
playwright-testingGuide for writing, organizing, and maintaining Playwright end-to-end tests using the Page Object Model pattern.
Playwright Testing is an agent skill from openkaiden/kaiden. Guide for writing, organizing, and maintaining Playwright end-to-end tests using the Page Object Model pattern. Workspace provider lifecycle and sandbox matrix tests are documented in workspace-provider-e2e.md.
Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files (for example `examples.md`, `reference.md` and `workspace-provider-e2e.md`).
It sits in Testing & QA, covering Browser testing and End-to-end testing. It works with Playwright. The licence is Apache-2.0.
6 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 5a3f5af. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
pnpmnpxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use pnpm and npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GEMINI_API_KEYOPENAI_API_KEYGITHUB_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Playwright Testing loads about 3k tokens when it runs. Until then it costs about 57 tokens; SKILL.md has 495 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from openkaiden/kaiden at commit 5a3f5af, republished under its Apache-2.0 licence (© openkaiden). 495 words, ~2,993 tokens.
.claude/skills/playwright-testing/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.getByRole, getByLabel, getByText — before falling back to getByTestId or CSS.expect with auto-retry or expect.poll() for async operations. Never use arbitrary setTimeout delays.test.describe.serial() for interdependent tests (e.g., create → verify → delete flows).[FEATURE-NUM]).tests/playwright/
├── playwright.config.ts # Test projects, timeouts, reporters
├── package.json
├── tsconfig.json
├── src/
│ ├── fixtures/
│ │ ├── electron-app.ts # Core Electron app + page object fixtures
│ │ └── provider-fixtures.ts # Provider resource/MCP/Goose setup (worker-scoped)
│ ├── model/
│ │ ├── core/
│ │ │ └── types.ts # Enums, constants, interfaces, TIMEOUTS
│ │ ├── navigation/
│ │ │ └── navigation.ts # NavigationBar — navigates to all major pages
│ │ └── pages/
│ │ ├── base-page.ts # Abstract base: waitForLoad(), openTab()
│ │ ├── base-table-page.ts # Table operations: row lookup, polling, counting
│ │ ├── chat-page.ts # Chat UI interactions (40+ methods)
│ │ ├── flows-page.ts # Flow management with table operations
│ │ ├── flows-create-page.ts # Flow creation workflow
│ │ ├── flows-details-page.ts # Flow details view
│ │ ├── settings-page.ts # Main settings hub
│ │ ├── mcp-page.ts # MCP server management
│ │ ├── extensions-page.ts # Extension browsing
│ │ ├── agent-workspaces-page.ts # Workspace list + lifecycle entry
│ │ ├── agent-workspace-create-page.ts # Create wizard (FS + network steps)
│ │ ├── agent-workspace-details-page.ts # Workspace details shell
│ │ ├── agent-workspace-overview-page.ts # Overview tab
│ │ ├── agent-workspace-terminal-page.ts
│ │ └── *-tab-page.ts # Sub-page/tab objects
│ ├── specs/
│ │ ├── dashboard.spec.ts # App startup and navigation
│ │ ├── extensions-smoke.spec.ts # Extension management
│ │ ├── settings-smoke.spec.ts # Settings pages
│ │ ├── workspaces-smoke.spec.ts # Workspace wizard UI (Kaiden-App-Core, @smoke)
│ │ └── provider-specs/ # Provider-specific tests
│ │ ├── chat-smoke.spec.ts # Chat functionality (gold standard)
│ │ ├── mcp-smoke.spec.ts # MCP servers
│ │ └── workspaces/ # Coding Agent Workspace lifecycle (Workspace-Provider)
│ └── utils/
│ ├── app-ready.ts # waitForAppReady(), waitForNavigationReady(), handleDialogIfPresent()
│ └── test-artifacts.ts # Trace, screenshot, video capture on failure
└── output/ # Generated reports and artifacts| Artifact | Pattern | Example |
|---|---|---|
| Page object | *-page.ts | chat-page.ts |
| Tab sub-page | *-tab-page.ts | settings-resources-tab-page.ts |
| Spec file | *-smoke.spec.ts or *.spec.ts | extensions-smoke.spec.ts |
| Test ID | [FEATURE-SCENARIO-NUM] | [CHAT-HIST-01], [EXT-03] |
| Provider specs | provider-specs/*.spec.ts | chat-smoke.spec.ts |
| Workspace IDs | [{STEP}] {action} under {SCENARIO-ID} describe | [01] creation under FS-NONE-NET-DEVELOPER |
| Fixtures | camelCase with purpose | resourceSetup, mcpSetup |
All page objects extend BasePage and must implement waitForLoad():
import { BasePage } from './base-page';
export class MyPage extends BasePage {
readonly heading: Locator;
constructor(page: Page) {
super(page);
this.heading = this.page.getByRole('heading', { name: 'My Page' });
}
async waitForLoad(): Promise<void> {
await expect(this.heading).toBeVisible({ timeout: TIMEOUTS.PAGE_LOAD });
}
}For pages with data tables, extend BaseTablePage to get row lookup, polling, and counting for free:
import { BaseTablePage } from './base-table-page';
export class MyTablePage extends BaseTablePage {
constructor(page: Page) {
super(page, 'My Table'); // aria-label of the table
}
async waitForLoad(): Promise<void> {
await expect(this.table).toBeVisible({ timeout: TIMEOUTS.PAGE_LOAD });
}
}Inherited methods: getTableRowByName(), countRowsFromTable(), ensureRowExists(), ensureRowDoesNotExist(), getRowLocatorByName(), getRowLocatorByIndex().
Use openTab() to switch between tabs and return the new page object:
async openInstalledTab(): Promise<InstalledTabPage> {
return this.openTab(this.installedTabButton, InstalledTabPage);
}Use this order when selecting elements:
getByRole('button', { name: 'Submit' }) — accessibility-focused, preferredgetByLabel('Email') — form elementsgetByText('Welcome') — visible contentgetByTestId('submit-btn') — semantic fallbackelectron-app.ts)interface ElectronFixtures {
electronApp: ElectronApplication;
page: Page;
navigationBar: NavigationBar;
settingsPage: SettingsPage;
flowsPage: FlowsPage;
mcpPage: McpPage;
extensionsPage: ExtensionsPage;
chatPage: ChatPage;
}Import as: import { test, expect } from '../fixtures/electron-app';
provider-fixtures.ts)Worker-scoped fixtures for provider-specific tests:
resource: Selectable provider ID (gemini, openai, ollama, ramalama)resourceSetup: Auto-creates/deletes inference provider resources (auto: true)mcpSetup: Configures MCP servers with env-var-based credentials (auto: false)gooseSetup: Installs Goose CLI tool (auto: false)Import as: import { test, expect } from '../../fixtures/provider-fixtures';
electron-app.tsprovider-fixtures.tsDefined in src/model/core/types.ts:
const TIMEOUTS = {
PAGE_LOAD: 90_000, // Page initial load
STANDARD: 30_000, // Standard operations
SHORT: 10_000, // Quick checks
MODEL_RESPONSE: 90_000, // LLM responses (especially local models)
DEFAULT: 120_000, // App startup / general default
INITIALIZING_SCREEN: 180_000, // App initialization
NON_DEVTOOLS_WINDOW: 60_000, // Electron window detection
RETRY_DELAY: 1_000, // Retry interval
MAX_RETRIES: 3, // Max retry attempts
} as const;Located in src/utils/app-ready.ts:
| Function | Purpose |
|---|---|
waitForAppReady(page) | Waits for main element, initialization screen, title bar |
waitForNavigationReady(page) | Waits for app + navigation bar to be visible |
handleDialogIfPresent(page, options) | Safely handles optional confirmation dialogs |
clearAllToasts(page, toastLocator) | Dismisses all toast notifications |
Always call waitForNavigationReady(page) in beforeEach for specs that navigate.
playwright.config.ts)| Project | Tests | Condition |
|---|---|---|
Kaiden-App-Core | All specs except provider-specs | Always runs |
Gemini-Provider | provider-specs | Requires GEMINI_API_KEY |
OpenAI-Provider | provider-specs | Requires OPENAI_API_KEY |
Workspace-Provider | provider-specs/workspaces/ | PODMAN_ENABLED + API keys; not PR smoke — see workspace-provider-e2e.md |
Ollama-Provider | provider-specs (except flows) | Requires OLLAMA_ENABLED |
RamaLama-Provider | provider-specs (except flows) | Requires RAMALAMA_ENABLED |
OpenShift-AI-Provider | provider-specs | Currently disabled |
# Run all E2E tests (build + test)
pnpm run test:e2e
# Run tests only (must build first)
pnpm run test:e2e:run
# Run specific project
npx playwright test --project="Kaiden-App-Core"
# Run specific spec
npx playwright test tests/playwright/src/specs/extensions-smoke.spec.ts
# Debug mode
npx playwright test --debug
# Show report
pnpm run test:e2e:report
# Workspace provider tests (OpenShell; not PR smoke)
pnpm run test:e2e:workspaces:runSee workspace-provider-e2e.md for sandbox matrix structure, tags, env vars, and coverage notes.
// Skip based on resource type
test.skip(resource === 'ollama', 'Flows not supported for Ollama');
// Skip based on available data
if (modelCount < 2) {
test.skip(true, 'Skipping test: Less than 2 models available');
return;
}
// Skip based on environment
test.skip(!hasGithubToken, 'GITHUB_TOKEN not set');
test.skip(isLinux, 'safeStorage issues on Linux');
// Mark as expected failure
if (!isCI) {
test.fail();
}
// Mark as slow (3x timeout)
test.slow();On test failure, saveTestArtifacts() automatically captures:
trace.zip — full Playwright trace with screenshots, snapshots, and sourcesfailure.png — full-page screenshot at failure pointvideo.webm — recording of the test run© openkaiden, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files in .agents/skills/playwright-testing of openkaiden/kaiden.
Open the folder on GitHubat commit 5a3f5af
Playwright Testing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Playwright Testing this skillopenkaiden/kaiden | 110 | — | ~3k | Automated safety check: Pass | Apache-2.0 | |
| Web Application Testinganthropics/skills | 180k | 51 repos | ~966 | Automated safety check: Pass | Apache-2.0 | |
| playwright-cli Browser Automationgithub/gh-aw | 5.3k | 23 repos | ~2.8k | Automated safety check: Pass | MIT | |
| Write and Verify Playwright Testsappsmithorg/appsmith | 41k | — | ~2.9k | Automated safety check: Notes | Apache-2.0 | |
| Cucumber and Playwright E2E Testslanggenius/dify | 158k | — | ~682 | Automated safety check: Pass | Custom licence | |
| E2E Testinglangflow-ai/langflow | 156k | — | ~3.3k | Automated safety check: Pass | MIT |
anthropics/skills
Tests local web applications with Python Playwright scripts, checking frontend behavior, capturing screenshots and reading browser console logs.
github/gh-aw
Drives a real browser from the command line with playwright-cli to open pages, interact, mock requests, save state and work with Playwright tests.
appsmithorg/appsmith
Writes a Playwright end-to-end test from a prompt, runs it against a live Appsmith deployment and retries with fixes up to three times until it passes.
langgenius/dify
Guides changes and reviews of the Cucumber and Playwright end-to-end suite under `e2e/`: feature files, step definitions, support code, tags, locators and assertions.
langflow-ai/langflow
Write and review Playwright E2E tests for Langflow. An agent skill from langflow-ai/langflow.
handsontable/handsontable
Guides writing and changing Playwright end-to-end tests for Handsontable using page objects, data-testid hooks and deterministic waits.
openkaiden/kaiden
Create GitHub issues using the gh CLI. An agent skill from openkaiden/kaiden.
openkaiden/kaiden
UI Component Development Guide for Kaiden. An agent skill from openkaiden/kaiden.
Works with
Categories
Guide for writing, organizing, and maintaining Playwright end-to-end tests using the Page Object Model pattern. Playwright Testing is an agent skill from openkaiden/kaiden. Guide for writing, organizing, and maintaining Playwright end-to-end tests using the Page Object Model pattern.
Playwright Testing fits situations like: tasks that involve Browser testing; tasks that involve End-to-end testing.
Run `npx skills add openkaiden/kaiden --skill playwright-testing -a claude-code`. Or copy the skill folder (.agents/skills/playwright-testing in openkaiden/kaiden) into .claude/skills/playwright-testing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add openkaiden/kaiden --skill playwright-testing -a codex`. Or copy the skill folder (.agents/skills/playwright-testing in openkaiden/kaiden) into .agents/skills/playwright-testing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add openkaiden/kaiden --skill playwright-testing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/playwright-testing, .gemini/skills/playwright-testing, .github/skills/playwright-testing and .opencode/skills/playwright-testing in your project.
Going by SKILL.md and its folder, Playwright Testing needs the command-line tools its instructions call (pnpm and npx) and credentials named GEMINI_API_KEY, OPENAI_API_KEY and GITHUB_TOKEN. Our summary lists: Node.js; A credential in GEMINI_API_KEY; A credential in OPENAI_API_KEY.
SKILL.md contains no URLs. Its commands use npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Playwright Testing is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Playwright Testing: Web Application Testing (anthropics/skills, 180k stars), playwright-cli Browser Automation (github/gh-aw, 5.3k stars), Write and Verify Playwright Tests (appsmithorg/appsmith, 41k stars) and Cucumber and Playwright E2E Tests (langgenius/dify, 158k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
openkaiden (a GitHub organization) maintains it in openkaiden/kaiden, which has 110 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 7, 2026.
Source: openkaiden/kaiden on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.