cypress — Claude Code skill: reliable E2E test patterns
A skill for writing Cypress E2E and component tests: stable selectors, deterministic waits and network stubbing instead of fixed sleeps.
npx skills add bobmatnyc/claude-mpm-skills --skill cypress -a claude-codeWhat cypress does
The skill lays out Cypress patterns for browser E2E suites and component tests. It ships runnable examples: a minimal spec, selectors via data-testid, waiting on a network alias instead of cy.wait(1000), stubbing responses with cy.intercept, and caching login with cy.session. A CI section covers screenshots on failure, the video option, run-mode retries and parallelization through Cypress Cloud.
Anti-patterns and troubleshooting get their own sections. When a click is flaky or an element is missing, the skill points to adding a data-testid hook, asserting visibility with should("be.visible") and waiting on the alias that renders the element. Tests that fail only in CI usually trace back to a viewport or baseUrl mismatch, or to local-only seed data — so create data through API calls.
The skill does not invoke the model on its own: it carries disable-model-invocation: true, so it works as a reference rather than an active agent. Component tests need npx cypress open --component and a mounted component. Keep heavy network stubbing out of specs that also assert against a real backend; those break the moment a response changes.
What it helps with
- write an E2E test for a critical user flow
- replace fixed sleeps with network alias waits
- cache login across tests with
cy.session - stub an API response and drop the backend dependency
- debug tests that fail only in CI
Example prompts for the agent
- write an E2E test for saving a user with a data-testid selector
- replace cy.wait(1000) with a network alias wait
- add a component test for Button using cy.mount
How to install cypress
1Skills CLI (Vercel)
npx skills add bobmatnyc/claude-mpm-skills --skill cypress -a claude-code2Manually: put the files in place
~/.claude/skills/cypress/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/cypress/
1Skills CLI (Vercel)
npx skills add bobmatnyc/claude-mpm-skills --skill cypress -a codex2Manually: put the files in place
.agents/skills/cypress/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add bobmatnyc/claude-mpm-skills --skill cypress -a cursor2Manually: put the files in place
.cursor/skills/cypress/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install bobmatnyc/claude-mpm-skills cypress2Manually: put the files in place
.github/skills/cypress/SKILL.md1Skills CLI (Vercel)
npx skills add bobmatnyc/claude-mpm-skills --skill cypress -a gemini-cli2Platform CLI
gemini skills install https://github.com/bobmatnyc/claude-mpm-skills --path toolchains/javascript/testing/cypressManually: put the files in place
.devin/skills/cypress/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add bobmatnyc/claude-mpm-skills --skill cypress -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about cypress
How do I install cypress in Claude?
Run npx skills add bobmatnyc/claude-mpm-skills --skill cypress -a claude-code. The skill file lands at ~/.claude/skills/cypress/SKILL.md.
What does the cypress skill do?
It collects Cypress patterns for E2E and component testing: stable selectors, deterministic waits, network stubbing, auth handling and CI setup.
Why do my tests fail only in CI?
The skill suggests raising run-mode retries, recording screenshots on failure, checking that viewport and baseUrl match the CI environment, and creating data through API calls instead of local seed files.
Source text
SKILL.md · MIT
---
name: cypress
description: "Cypress end-to-end and component testing patterns for web apps: reliable selectors, stable waits, network stubbing, auth handling, CI parallelization, and flake reduction"
user-invocable: false
disable-model-invocation: true
version: 1.0.0
category: toolchain
author: Claude MPM Team
license: MIT
progressive_disclosure:
entry_point:
summary: "Write reliable Cypress E2E and component tests with stable selectors, deterministic waits, and network control"
when_to_use: "When building browser E2E suites, debugging flaky UI tests, validating critical user flows, or adding component tests to a modern frontend"
quick_start: "1. Install Cypress 2. Add data-testid selectors 3. Use cy.intercept for network control 4. Avoid fixed sleeps 5. Run in CI with artifacts"
token_estimate:
entry: 130
full: 5200
context_limit: 900
tags:
- javascript
- testing
- cypress
- e2e
- component-testing
- ci
- flake-reduction
requires_tools: []
---
# Cypress (E2E + Component Testing)
## Overview
Cypress runs browser automation with first-class network control, time-travel debugging, and a strong local dev workflow. Use it for critical path E2E tests and for component tests when browser-level rendering matters.
## Quick Start
### Install and open
```bash
npm i -D cypress
npx cypress open
```
### Minimal spec
```ts
// cypress/e2e/health.cy.ts
describe("health", () => {
it("loads", () => {
cy.visit("/");
cy.contains("Hello").should("be.visible");
});
});
```
## Core Patterns
### 1) Stable selectors
Prefer `data-testid` (or `data-cy`) attributes for selectors. Avoid brittle CSS chains and text-only selectors for critical interactions.
```html
<button data-testid="save-user">Save</button>
```
```ts
cy.get('[data-testid="save-user"]').click();
```
### 2) Deterministic waiting (avoid fixed sleeps)
Wait on app-visible conditions or network aliases rather than `cy.wait(1000)`.
```ts
cy.intercept("GET", "/api/users/*").as("getUser");
cy.visit("/users/1");
cy.wait("@getUser");
cy.get('[data-testid="user-email"]').should("not.be.empty");
```
### 3) Network control with `cy.intercept`
Stub responses for deterministic tests and speed. Keep a small set of “real backend” smoke tests separate.
```ts
cy.intercept("GET", "/api/users/1", {
statusCode: 200,
body: { id: "1", email: "[email protected]" },
}).as("getUser");
```
### 4) Authentication strategies
Prefer `cy.session` to cache login for speed and stability.
```ts
// cypress/support/commands.ts
Cypress.Commands.add("login", () => {
cy.session("user", () => {
cy.request("POST", "/api/auth/login", {
email: "[email protected]",
password: "password",
});
});
});
```
```ts
// e2e spec
beforeEach(() => {
cy.login();
});
```
## Component Testing
Run component tests to validate UI behavior in isolation while keeping browser rendering.
```bash
npx cypress open --component
```
```ts
// cypress/component/Button.cy.tsx
import React from "react";
import Button from "../../src/Button";
describe("<Button />", () => {
it("clicks", () => {
cy.mount(<Button onClick={cy.stub().as("onClick")}>Save</Button>);
cy.contains("Save").click();
cy.get("@onClick").should("have.been.calledOnce");
});
});
```
## CI Patterns
### Artifacts (videos/screenshots)
Store artifacts for failed runs and keep videos optional to reduce storage.
```ts
// cypress.config.ts
import { defineConfig } from "cypress";
export default defineConfig({
video: false,
screenshotOnRunFailure: true,
retries: { runMode: 2, openMode: 0 },
});
```
### Parallelization (Cypress Cloud)
Parallelize long E2E suites via Cypress Cloud when runtime dominates feedback loops.
## Anti-Patterns
- Use `cy.wait(1000)` as a synchronization mechanism.
- Select elements via deep CSS paths.
- Mix heavy network stubbing with “real backend” assertions in the same spec.
- Depend on test order; isolate state with `cy.session` and per-test setup.
## Troubleshooting
### Symptom: flaky click or element not found
Actions:
- Add a `data-testid` hook for the element.
- Assert visibility before interaction (`should("be.visible")`).
- Wait on network alias for the data that renders the element.
### Symptom: tests fail only in CI
Actions:
- Increase run-mode retries and record screenshots on failure.
- Verify viewport and baseUrl config match CI environment.
- Eliminate reliance on local-only seed data; create data via API calls.
## Resources
- Cypress docs: https://docs.cypress.io/
- Best practices: https://docs.cypress.io/guides/references/best-practices
© Claude MPM Team · MIT · bobmatnyc/claude-mpm-skills