Playwright Testing
chongdashu/vibejam-starter-pack
Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.
Migrate a test suite from one framework to another, incrementally and without losing coverage.
$ npx skills add petrkindlmann/qa-skills --skill test-migration -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install petrkindlmann/qa-skills test-migration --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/petrkindlmann/qa-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/test-migration .claude/skills/test-migration && 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 "test-migration" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-migration into .claude/skills/test-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-migration", 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/petrkindlmann/qa-skills/tree/main/skills/test-migrationType 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 petrkindlmann/qa-skills --skill test-migration -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install petrkindlmann/qa-skills test-migration --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/test-migration .agents/skills/test-migration && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "test-migration" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-migration into .agents/skills/test-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-migration", 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 petrkindlmann/qa-skills --skill test-migration -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install petrkindlmann/qa-skills test-migration --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/test-migration .cursor/skills/test-migration && 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 "test-migration" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-migration into .cursor/skills/test-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-migration", 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/petrkindlmann/qa-skills.git --path skills/test-migration--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 petrkindlmann/qa-skills --skill test-migration -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install petrkindlmann/qa-skills test-migration --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/test-migration .gemini/skills/test-migration && 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 "test-migration" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-migration into .gemini/skills/test-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-migration", 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 petrkindlmann/qa-skills test-migrationInstalls 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 petrkindlmann/qa-skills --skill test-migration -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/test-migration .github/skills/test-migration && 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 "test-migration" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-migration into .github/skills/test-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-migration", 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 petrkindlmann/qa-skills --skill test-migration -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install petrkindlmann/qa-skills test-migration --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/petrkindlmann/qa-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/test-migration .opencode/skills/test-migration && 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 "test-migration" agent skill from https://github.com/petrkindlmann/qa-skills/tree/main/skills/test-migration into .opencode/skills/test-migration/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-migration", 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.
test-migrationMigrate a test suite from one framework to another, incrementally and without losing coverage.
Test Migration is an agent skill from petrkindlmann/qa-skills. Migrate a test suite from one framework to another, incrementally and without losing coverage. Covers Selenium→Playwright, Cypress→Playwright, Jest→Vitest, Mocha→Vitest, and Protractor→Playwright, with parallel CI running, locator/assertion translation, and a coverage-parity track. Use when: "migrate tests," "switch framework," "Selenium to Playwright," "Jest to Vitest," "framework migration." Not for: bulk selector regeneration after a UI refactor on the SAME framework — use selector-drift-recovery. Not for…
Its SKILL.md is about 5.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 3 other files, including reference files (for example `references/framework-guides.md` and `references/parallel-ci.md`).
It sits in Testing & QA, covering Unit testing, Browser testing and End-to-end testing. It works with Playwright, Vitest, Jest and Selenium. The repository describes itself as: 50 QA and test-automation skills for Claude Code, Codex, Cursor, and any Agent Skills Standard runtime. The licence is MIT.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b3bb61b. 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:
npxFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
demo.playwright.devFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Test Migration loads about 5.3k tokens when it runs, and up to ~8.6k if it reads all its reference files. Until then it costs about 192 tokens; SKILL.md has 2,450 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 petrkindlmann/qa-skills at commit b3bb61b, republished under its MIT licence (© petrkindlmann). 2,450 words, ~5,342 tokens.
.claude/skills/test-migration/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.<objective>
A framework migration is where coverage quietly leaks: twenty old tests become fifteen new ones, a flaky Selenium test is faithfully reproduced as a flaky Playwright test, and the old safety-net suite gets deleted a sprint too early. This skill migrates incrementally with both suites running in CI until parity is proven — so the new suite earns the decommission, you don't just assert it.
</objective>
| You're going from → to | Jump to | First-pass tooling |
|---|---|---|
| Selenium → Playwright | Translation Patterns + references/framework-guides.md | hand-write; no codemod worth trusting |
| Cypress → Playwright | Translation Patterns + references/framework-guides.md | cy2pw web converter / community CLI (see tooling table) |
| Protractor → Playwright | references/framework-guides.md (urgent — EOL 2023) | hand-write; map by.model/by.binding |
| Jest → Vitest | references/framework-guides.md | jest.→vi. sed pass, then verify |
| Mocha → Vitest | references/framework-guides.md | chai-matcher codemod, then verify |
| Any path, 100+ tests | Migration Workflow + Parallel Running Strategy | always parallel-run in CI |
Check .agents/qa-project-context.md first. If it exists, use it as context and skip questions already answered there.
Current state:
Test infrastructure:
Constraints:
A big-bang rewrite — all tests at once — is the highest-risk approach. It freezes test development for weeks, lands a large batch of unproven tests in one drop, and removes the proven safety net before the replacement exists. Always migrate one test, one module at a time.
Run both suites in CI until the new one provides at least the coverage of the old one. The old suite is your safety net; keep it non-blocking but present. Do not decommission until the new suite has caught real regressions over multiple sprints.
Start with critical user journeys, frequently-failing tests (which benefit most from a better framework), and high-risk areas. Save low-value tests for last — some are not worth migrating at all, and that's a valid, documented decision.
Translating a bad Selenium test into a bad Playwright test wastes the opportunity. For each test ask "how would I write this from scratch in the target framework?" — user-facing locators, auto-waiting, fixtures. This applies tenfold to AI-codemod output (see Anti-Patterns).
Six phases for a typical multi-sprint migration. Use the checklists inline; heavy code lives in references.
Phase 1 — Audit existing suite (Week 1). Count tests by category, skipped/flaky percentage, coverage if measured, runtime, page-object/utility files, custom plugins, CI stages. Then categorize each test: Critical (revenue flows) → High (core journeys) → Medium (secondary) → Low (admin/edge) → Skip (disabled, duplicate, obsolete). This priority order drives everything downstream.
Phase 2 — Set up target framework (Week 1-2). Install alongside the old one. Create the config (playwright.config.ts / vitest.config.ts), a separate test directory, a non-blocking CI stage, one smoke test to prove the setup, reporters matching the existing format, shared env/secrets.
Phase 3 — Migrate shared infrastructure (Week 2-3). Infrastructure before tests, in this order: base page object/test base → auth helpers → API client helpers → common page objects (nav/header/footer) → data factories → custom assertions → feature-specific page objects (with their tests). Capture storageState here so migrated tests skip the login flow.
Phase 4 — Migrate tests by priority (Week 3-8+). Per test: read the old one and understand what it actually verifies → write the new one from scratch with modern patterns (do not line-by-line translate) → run locally green → run in CI green → tag the old one "migrated" (don't delete) → after one sprint of parallel passing, delete the old one.
Phase 5 — Parallel run in CI (throughout). Both suites run every pipeline. The legacy suite stays non-blocking (continue-on-error: true) until the new suite reaches parity; then flip blocking onto the new suite and remove the old job. See references/parallel-ci.md for the full GitHub Actions workflow.
Phase 6 — Decommission old framework (final). Only after parity + stability: all critical/high tests migrated, new suite green in CI for 2+ consecutive sprints, new-suite flakiness ≤ old, coverage comparison shows no regression, team writing new tests in the new framework for 2+ sprints. Then remove old deps from package.json, delete old test files (not just disable), update CI to run only the new suite, update docs.
There is no AI magic button. Pick the right first-pass tool by path, then refine by hand using references/framework-guides.md.
| Tool | Use when | Don't trust for |
|---|---|---|
| cy2pw web converter (demo.playwright.dev/cy2pw) | Cypress→Playwright, straightforward specs; official, deterministic, browser UI | custom commands, POM conventions, fixture setup |
@11joselu/cypress-to-playwright (community CLI, npx @11joselu/cypress-to-playwright <dir>) | Cypress→Playwright bulk first pass over a directory | anything timing-dependent — review every file |
| AI agents (Claude Code, Cursor) | custom-command and fixture translation, the parts converters can't do | a finished test — treat output as a first pass only |
Playwright 1.59+ agentic CLI (npx playwright trace, --debug=cli, AI-optimized a11y snapshots) | post-migration triage of a failing migrated test | the migration itself — these are debug tools, not converters |
Avoid:
npx playwright migrate— there is no such built-in Playwright CLI command; the instruction fails at the terminal (verified June 2026). Use cy2pw or the community CLI above.
Golden-reference recipe. Before letting any AI or codemod batch the suite, hand-migrate ONE representative test end to end. Commit it as the team's canonical pattern (e.g. e2e/_golden/login.spec.ts). Feed it back to the AI as a few-shot reference and point human reviewers at it. Every later migration anchors to this file — it's the single highest-leverage tactic for keeping AI output and reviewers consistent.
| Old Pattern | New Pattern (Playwright) | Notes |
|---|---|---|
By.id('submit-btn') | page.getByRole('button', { name: 'Submit' }) | Prefer role-based |
By.css('.nav-item.active') | page.getByRole('link', { name: 'Dashboard' }) | Use user-visible text |
By.xpath('//div[@class="modal"]') | page.getByRole('dialog') | ARIA roles are more stable |
By.css('[data-testid="user-menu"]') | page.getByTestId('user-menu') | testid as fallback |
cy.get('.product-card').first() | page.getByRole('article').first() | Semantic elements preferred |
cy.contains('Add to cart') | page.getByRole('button', { name: 'Add to cart' }) | Specific role is better |
element(by.model('username')) | page.getByLabel('Username') | Angular model → label |
Role/label names above are illustrative — replace them with the accessible name your app actually renders.
| Old Pattern | New Pattern (Playwright) | Notes |
|---|---|---|
Thread.sleep(3000) | (remove entirely) | Playwright auto-waits |
WebDriverWait(driver, 10).until(visible) | (remove entirely) | Auto-wait on actions |
cy.wait(2000) | (remove entirely) | Auto-wait on assertions |
cy.wait('@apiCall') | page.waitForResponse(/\/api\/data/) | Explicit network wait (start the promise before the action) |
browser.wait(EC.presenceOf(...)) | await expect(locator).toBeVisible() | Web-first assertion |
implicitlyWait(10, SECONDS) | (remove — configure in config) | Use actionTimeout in config |
FluentWait with polling | await expect(locator).toHaveText('Done') | Web-first assertions retry |
| Old Pattern | New Pattern (Playwright) | Notes |
|---|---|---|
assert element.is_displayed() | await expect(locator).toBeVisible() | Auto-retrying |
cy.get('.msg').should('have.text', 'Done') | await expect(locator).toHaveText('Done') | Auto-retrying |
expect(element.getText()).toBe('Done') | await expect(locator).toHaveText('Done') | Auto-retrying |
cy.url().should('include', '/dashboard') | await expect(page).toHaveURL(/dashboard/) | Auto-retrying |
assert len(elements) == 5 | await expect(locator).toHaveCount(5) | Auto-retrying |
| Old (Cypress) | New (Playwright) |
|---|---|
baseUrl | use.baseURL |
defaultCommandTimeout: 10000 | use.actionTimeout: 10000 |
pageLoadTimeout: 30000 | use.navigationTimeout: 30000 |
retries: { runMode: 2 } | retries: 2 |
video: true | use.video: 'on' |
screenshotOnRunFailure: true | use.screenshot: 'only-on-failure' |
Each path has its own key differences, before/after code, and migration-notes checklist in references/framework-guides.md. Quick orientation:
getByRole/getByLabel/getByTestId, replace WebDriver sessions with BrowserContext. Capture storageState instead of re-implementing login.jest. with vi., convert jest.config.js to vitest.config.ts, drop Babel/ts-jest transforms (but keep an esbuild/SWC equivalent if you use custom Babel plugins like emotion/styled-components macros). Expect 2-10x faster runs. Use Vitest 4.1 test tags for incremental cutover.cy.intercept()+cy.wait() becomes page.route()+page.waitForResponse(); custom commands become fixtures. Mind the 1.52 page.route() glob and Cookie-header breaking changes (set cookies via browserContext.addCookies(), not a header override).describe/it/hooks are unchanged; convert chai matchers (to.equal→toBe, to.deep.equal→toEqual, to.contain→toContain) and sinon→vi.fn()/vi.spyOn().waitForAngular, map by.model/by.binding to getByLabel/getByText/getByTestId, and onPrepare becomes globalSetup.Track parity between old and new suites in a spreadsheet so nothing leaks. This artifact is the objective check at decommission time.
Feature Area | Old Suite Tests | New Suite Tests | Parity | Notes
Login/Auth | 8 | 8 | 100% | Complete
Dashboard | 12 | 7 | 58% | In progress
Search | 6 | 0 | 0% | Not started
Checkout | 15 | 15 | 100% | Complete
User Settings | 4 | 4 | 100% | Complete
Admin Panel | 20 | 0 | 0% | Low priority
--- | --- | --- | --- |
Total | 65 | 34 | 52% | On track for Q2For a 200-test suite, plan ~10 sprints: setup + infrastructure (Sprint 1-2), critical-path migration (Sprint 3-5, ~50 tests), bulk migration (Sprint 6-8), cleanup + decommission (Sprint 9-10). The old suite starts blocking and becomes non-blocking as parity approaches. New tests are written exclusively in the new framework from Sprint 3 onward.
Tag old tests "migrated" rather than deleting immediately. Delete only after the new equivalent has passed in CI for 2+ weeks and a manual review confirms no unique assertions are lost. If the old test catches a regression the new one misses, enhance the new test first.
Stopping all development for 3 months to rewrite every test at once. The team cannot ship new tests during the rewrite, coverage freezes, and the new suite is untested in CI until it lands all at once.
Fix: Incremental migration with parallel running. Migrate one module per sprint. Both suites run in CI throughout. New tests are written in the new framework from day one.
Line-by-line translation of Selenium tests into Playwright tests, preserving explicit waits, CSS selectors, and fragile patterns. The tests are in a new framework but have all the old problems.
Fix: Rewrite each test using the target framework's best practices — getByRole instead of CSS, no explicit waits, fixtures instead of beforeEach. The migration is an opportunity to improve every test.
Cursor, Aider, Continue, Claude Code, and the cy2pw/community converters all do mechanical translation, but quality is uneven and the "translate, don't modernize" trap applies tenfold to their output.
Fix: Run the tool on ONE file, diff against the source. If it modernized correctly, batch the rest. If it just translated, write your own golden-reference file and feed it back as a few-shot. After every pass, parallel-run against the original suite — if results diverge, the tool got it wrong; investigate before promoting.
Decommissioning the old suite before the new suite is proven. A regression slips through because the new suite was missing a test that existed in the old one.
Fix: Run both suites in CI for at least 2 sprints after reaching parity. The old suite is cheap insurance. Only decommission once the new suite has caught regressions on its own.
Twenty old tests become fifteen new ones because "some were redundant" — but nobody verified whether the deleted tests covered unique scenarios.
Fix: Map each old test to its new equivalent explicitly in the coverage spreadsheet. If an old test is intentionally not migrated, document why and verify its coverage is provided elsewhere.
A test flaky in Selenium will be flaky in Playwright if the root cause is test design (shared state, timing assumptions, non-deterministic data). Faithful migration reproduces the flakiness.
Fix: Diagnose the flakiness first, fix the root cause, then write the new test with the fix baked in. Migration is the best time to fix flakiness because you're rewriting the test anyway. For runtime per-test triage, see test-reliability.
Migrating to Playwright while the team has never used it means the champions write everything and the rest of the team can't maintain it.
Fix: Run a 2-hour workshop before starting. Pair-program the first 10 migrated tests (champion + team member). Write a team style guide for the new framework. Require 2+ reviewers per migrated test.
| Symptom | Likely cause | Fix or check |
|---|---|---|
| Migrated test logs in fresh every run / session lost mid-test | No storageState — login flow wasn't carried over | Capture storageState in globalSetup; reuse per test. cy.setCookie/driver.add_cookie → browserContext.addCookies() |
npx playwright migrate errors "unknown command" | No such built-in CLI exists | Use cy2pw web converter or @11joselu/cypress-to-playwright |
| Migrated intercept never matches | 1.52 glob change dropped ?/[] | Escape the chars or rewrite the route as a regex |
Cookies set on route.continue() are ignored | Cookie header on route.continue() is loaded from the cookie store, not your override | Set cookies via browserContext.addCookies() |
| New test passes locally, flakes in CI | Old timing assumption translated literally | Replace waitForTimeout/explicit waits with web-first expect(...) assertions |
| Test count dropped after a codemod pass | Codemod silently skipped unsupported syntax | Diff test counts per feature area against the parity sheet before promoting |
Prove the migrated artifacts work — smallest check first:
npx playwright test <migrated-file> (or npx vitest run <migrated-file>) exits 0. A green run is the floor, not the finish.npx playwright test --list | wc -l per area).continue-on-error: true and the new job blocking; both appear in the pipeline run.package.json, old test files deleted (not just disabled), and CI config updated to run only the new suite.references/)© petrkindlmann, MIT. 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 2 other files (references) in skills/test-migration of petrkindlmann/qa-skills.
Open the folder on GitHubat commit b3bb61b
Test Migration 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 |
|---|---|---|---|---|---|---|
| Test Migration this skillpetrkindlmann/qa-skills | 165 | — | ~5.3k | Automated safety check: Pass | MIT | |
| Playwright Testingchongdashu/vibejam-starter-pack | 149 | — | ~2.1k | Automated safety check: Pass | None | |
| Playwright Testingchongdashu/vibejam-starter-pack | 149 | — | ~2.2k | Automated safety check: Pass | None | |
| React Testingaffaan-m/ECC | 275k | 1 repos | ~3.3k | Automated safety check: Pass | MIT | |
| Testingradix-ng/primitives | 274 | — | ~3.3k | Automated safety check: Pass | MIT | |
| Web Testing with Playwright and Vitestwithkynam/vibecode-pro-max-kit | 1.1k | — | ~892 | Automated safety check: Pass | Apache-2.0 |
chongdashu/vibejam-starter-pack
Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.
chongdashu/vibejam-starter-pack
Plan, implement, and debug frontend tests: unit/integration/E2E/visual/a11y.
affaan-m/ECC
React component testing with React Testing Library, Vitest/Jest, MSW for network mocking, accessibility assertions with axe, and the decision boundary between component tests and Playwright/Cypress…
radix-ng/primitives
Test Radix NG primitives across every layer and pick the RIGHT one for a change: Vitest unit (zoneless), jest-axe a11y, Playwright browser regression (apps/visual-regression), SSR…
withkynam/vibecode-pro-max-kit
Covers web testing from unit to E2E, load, visual, accessibility and security checks, with Playwright, Vitest and k6 guides plus a Playwright setup script.
alirezarezvani/claude-skills
Production-grade Playwright testing toolkit. An agent skill from alirezarezvani/claude-skills.
petrkindlmann/qa-skills
Test for WCAG 2.2 AA compliance with axe-core + Playwright, keyboard navigation audits, screen reader testing, ARIA pattern validation, and legal compliance mapping (ADA, EAA, Section 508).
petrkindlmann/qa-skills
Goal-driven E2E testing where a browser agent (Playwright MCP / computer-use) reads a natural-language goal and explores the app via the accessibility tree to assert outcomes — no pre-written script.
petrkindlmann/qa-skills
Use AI to write NEW test code from specs, PRDs, user stories, code diffs, bug reports, or OpenAPI specs.
petrkindlmann/qa-skills
Test REST and GraphQL APIs with Playwright APIRequestContext, Supertest, or standalone HTTP clients.
petrkindlmann/qa-skills
Design CI/CD pipelines that run test suites. An agent skill from petrkindlmann/qa-skills.
petrkindlmann/qa-skills
Test for regulatory compliance: GDPR/CMP consent verification, Google Consent Mode v2, Global Privacy Control (GPC), CCPA/US state opt-out, EU AI Act Article 50 transparency, Better Ads Standards…
Works with
Categories
Migrate a test suite from one framework to another, incrementally and without losing coverage. Test Migration is an agent skill from petrkindlmann/qa-skills. Migrate a test suite from one framework to another, incrementally and without losing coverage.
Test Migration fits situations like: : migrate tests; switch framework; selenium to Playwright; framework migration. Not for: bulk selector regeneration after a UI refactor on the SAME framework — use selector-drift-recovery.
Run `npx skills add petrkindlmann/qa-skills --skill test-migration -a claude-code`. Or copy the skill folder (skills/test-migration in petrkindlmann/qa-skills) into .claude/skills/test-migration in your project. Claude Code loads it when a task matches its description.
Run `npx skills add petrkindlmann/qa-skills --skill test-migration -a codex`. Or copy the skill folder (skills/test-migration in petrkindlmann/qa-skills) into .agents/skills/test-migration 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 petrkindlmann/qa-skills --skill test-migration -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/test-migration, .gemini/skills/test-migration, .github/skills/test-migration and .opencode/skills/test-migration in your project.
Going by SKILL.md and its folder, Test Migration needs the command-line tools its instructions call (npx). Our summary lists: Node.js.
SKILL.md names 1 domain. As links in the text: demo.playwright.dev. 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.
Test Migration is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.3k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 3.3k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Test Migration: Playwright Testing (chongdashu/vibejam-starter-pack, 149 stars), Playwright Testing (chongdashu/vibejam-starter-pack, 149 stars), React Testing (affaan-m/ECC, 275k stars) and Testing (radix-ng/primitives, 274 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
petrkindlmann (a GitHub user) maintains it in petrkindlmann/qa-skills, which has 165 GitHub stars. The repository holds 45 skills in this directory. The repository was last updated on June 10, 2026.
Source: petrkindlmann/qa-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.