home / skills / yuniorglez / gemini-elite-core / e2e-testing-expert

e2e-testing-expert skill

/skills/e2e-testing-expert

This skill designs and validates robust end-to-end test suites using Playwright, POM, visual regression, and Axe-core accessibility for fast, reliable CI.

npx playbooks add skill yuniorglez/gemini-elite-core --skill e2e-testing-expert

Review the files below or copy the command above to add this skill to your agents.

Files (5)
SKILL.md
5.2 KB
---
name: e2e-testing-expert
description: Senior End-to-End (E2E) Test Architect for 2026. Specialized in Playwright orchestration, visual regression testing, and high-performance CI/CD sharding. Expert in building resilient, auto-waiting test suites using the Page Object Model (POM), automated accessibility auditing (Axe-core), and deep-trace forensic debugging.
---

# ๐Ÿงช Skill: e2e-testing-expert (v1.0.0)

## Executive Summary
Senior End-to-End (E2E) Test Architect for 2026. Specialized in Playwright orchestration, visual regression testing, and high-performance CI/CD sharding. Expert in building resilient, auto-waiting test suites using the Page Object Model (POM), automated accessibility auditing (Axe-core), and deep-trace forensic debugging.

---

## ๐Ÿ“‹ The Conductor's Protocol

1.  **Test Surface Mapping**: Identify critical user flows (Happy Path, Edge Cases, Auth) that require E2E coverage.
2.  **Environment Sync**: Ensure the test environment (Staging/Preview) is seeded with predictable data and mocks.
3.  **Sequential Activation**:
    `activate_skill(name="e2e-testing-expert")` โ†’ `activate_skill(name="github-actions-pro")` โ†’ `activate_skill(name="ui-ux-pro")`.
4.  **Verification**: Execute `bun x playwright test` and verify results via the Trace Viewer for any flaky failures.

---

## ๐Ÿ› ๏ธ Mandatory Protocols (2026 Standards)

### 1. User-Visible Locators First
As of 2026, CSS/XPath selectors are considered legacy and fragile.
- **Rule**: Always use `getByRole`, `getByText`, or `getByLabel`.
- **Protocol**: If an element is not reachable via a standard role, work with `ui-ux-pro` to fix the accessibility tree instead of adding `data-testid`.

### 2. Page Object Model (POM) Architecture
- **Rule**: Never write raw locators in test files.
- **Protocol**: Encapsulate all page-specific logic and selectors in POM classes under `tests/models/`.

### 3. Visual Regression & Masking
- **Rule**: Use `expect(page).toHaveScreenshot()` for critical UI components.
- **Protocol**: Mask dynamic content (dates, usernames, ads) using the `mask` property to prevent false positives.

### 4. Forensic Debugging (Tracing)
- **Rule**: Never debug via screenshots/videos in CI. Use Playwright Traces.
- **Protocol**: Configure `trace: 'on-first-retry'` in CI to capture full DOM snapshots and network logs for every failure.

### 5. Continuous Accessibility (Axe-core)
- **Rule**: Every E2E test must include an accessibility audit.
- **Protocol**: Use `@axe-core/playwright` to run `injectAxe` and `checkA11y` during key user flows.

---

## ๐Ÿš€ Show, Don't Just Tell (Implementation Patterns)

### Page Object Model (POM) Example
`tests/models/LoginPage.ts`:
```typescript
import { Page, Locator, expect } from "@playwright/test";

export class LoginPage {
  readonly page: Page;
  readonly emailInput: Locator;
  readonly passwordInput: Locator;
  readonly loginButton: Locator;

  constructor(page: Page) {
    this.page = page;
    this.emailInput = page.getByLabel("Email address");
    this.passwordInput = page.getByLabel("Password");
    this.loginButton = page.getByRole("button", { name: "Sign in" });
  }

  async goto() {
    await this.page.goto("/auth/login");
  }

  async login(email: string, pass: string) {
    await this.emailInput.fill(email);
    await this.passwordInput.fill(pass);
    await this.loginButton.click();
  }
}
```

### Visual Testing & Accessibility
```typescript
test("homepage looks correct and is accessible", async ({ page }) => {
  await page.goto("/");
  
  // 1. Accessibility Check
  await injectAxe(page);
  await checkA11y(page);

  // 2. Visual Regression
  await expect(page).toHaveScreenshot("homepage.png", {
    mask: [page.getByTestId("current-date")],
    maxDiffPixels: 100
  });
});
```

---

## ๐Ÿ›ก๏ธ The Do Not List (Anti-Patterns)

1.  **DO NOT** use `page.waitForTimeout()`. Use web-first assertions like `expect().toBeVisible()`.
2.  **DO NOT** test 3rd party APIs (Stripe, Auth0) directly. Use `page.route()` to mock them.
3.  **DO NOT** share state between tests. Use a fresh `BrowserContext` for every test.
4.  **DO NOT** run all tests in one job. Use Playwright Sharding (`--shard=1/3`) for large suites.
5.  **DO NOT** ignore console errors or warnings during tests. Fail the test if unexpected errors occur.

---

## ๐Ÿ“‚ Progressive Disclosure (Deep Dives)

- **[Advanced Locators & Auto-Waiting](./references/locators.md)**: Role-based vs. Text-based strategy.
- **[Network Mocking & Interception](./references/mocking.md)**: Using `page.route()` for stable tests.
- **[Sharding & Parallelism in CI](./references/ci-sharding.md)**: Running 1,000 tests in under 2 minutes.
- **[Visual Regression Strategies](./references/visual-testing.md)**: Tolerance, Masking, and Baseline management.

---

## ๐Ÿ› ๏ธ Specialized Tools & Scripts

- `scripts/analyze-traces.sh`: A wrapper to open the Trace Viewer for the latest CI failures.
- `scripts/generate-pom.ts`: Scaffolds a POM class based on a URL's accessibility tree.

---

## ๐ŸŽ“ Learning Resources
- [Playwright Official Documentation](https://playwright.dev/)
- [Axe-core Accessibility Testing](https://github.com/dequelabs/axe-core-playwright)
- [Modern E2E Testing Patterns 2026](https://example.com/e2e-2026)

---
*Updated: January 23, 2026 - 20:50*

Overview

This skill is a Senior End-to-End (E2E) Test Architect agent focused on Playwright orchestration, visual regression, and high-performance CI/CD sharding. It codifies resilient, auto-waiting test suite patterns using Page Object Model (POM), automated Axe-core accessibility audits, and deep-trace forensic debugging. It is designed to help teams build stable, fast, and debuggable E2E pipelines for modern web apps.

How this skill works

The skill inspects test surfaces to identify critical user flows and applies a conductor protocol to sync environments, activate required integrations, and run tests with trace-enabled CI. It enforces role-based locators, POM architecture, visual regression with masking, and mandatory accessibility checks using @axe-core/playwright. On failures it captures Playwright traces for forensic analysis and recommends sharding strategies to optimize CI throughput.

When to use it

  • When you need to replace flaky selector-based tests with role/text-based locators for reliability
  • When adding visual regression checks and masking dynamic content to prevent false positives
  • When incorporating accessibility audits into every key user flow
  • When debugging intermittent CI failures with full Playwright traces
  • When optimizing large suites via sharding and parallelism to meet tight CI time budgets

Best practices

  • Prefer getByRole/getByText/getByLabel over CSS/XPath; fix accessibility tree rather than adding test-only attributes
  • Encapsulate page logic and selectors in POM classes; never litter tests with raw locators
  • Use web-first assertions (expect().toBeVisible()) and avoid fixed timeouts like waitForTimeout
  • Mask dynamic regions in visual snapshots and set sensible maxDiffPixels
  • Configure trace: 'on-first-retry' in CI and fail on unexpected console errors

Example use cases

  • Scaffold POM classes for an onboarding flow and enforce consistent selectors across tests
  • Add automated Axe-core audits to checkout and profile flows to catch regressions early
  • Implement visual regression for marketing landing pages with masks for dates and ads
  • Configure Playwright sharding in GitHub Actions to run thousands of tests under strict time budgets
  • Use Playwright traces to triage intermittent failures that screenshots and videos cannot explain

FAQ

Why use role-based locators instead of data-testid?

Role-based locators align tests with the accessibility tree and produce more resilient selectors; if an element lacks a role, work with design to expose it rather than adding test-only attributes.

How do I prevent visual tests from flaking on dynamic content?

Mask dynamic regions (dates, usernames, ads) in screenshots and set conservative diff tolerances; maintain baselines with a review process for intentional UI changes.