QA Lab · Cross-Stack Series · Stack 4

Cypress + JavaScript
+ Mochawesome Framework

Browser-native automation framework demonstrating Cypress-specific patterns — time-travel debugging, cy.intercept() network stubbing, and cy.session() auth caching — built against the same QA Lab target as all Cross-Stack Series frameworks.

Cypress 13.x · JavaScript ES2022 · Mochawesome 7.x · @cypress/grep 4.x · Node.js 20 LTS

✓ CI Green 12 Test Files 12 UI Sections Covered Cypress 13.x LTS 📊 Mochawesome Report Live IFrames: Documented Skip

About This Project

The Purpose

Cypress runs inside the browser — in the same event loop as the application under test. This architectural difference from Playwright and Selenium produces unique capabilities: real-time test runner with time-travel debugging, built-in network stubbing via cy.intercept(), and efficient auth state caching via cy.session().

This is Stack 4 of the Cross-Stack Series — the same QA Lab target tested with different frameworks to enable direct, evidence-based comparison. The framework demonstrates idiomatic Cypress patterns: plain JS page objects, custom commands, and @smoke tag filtering via @cypress/grep.

Key differentiator vs Stack 1 (Playwright TS): Cypress’s browser-native architecture makes cy.intercept() network stubbing seamless and the interactive Test Runner uniquely productive for debugging — at the cost of cross-origin iframe support.

⚠ IFrame trade-off documented: Cross-origin iframe support is an architectural limitation of Cypress. IFrame tests are intentionally skipped in this stack (it.skip() with documented reason) — not hidden. Playwright (Stack 1) covers iframes fully.

Architecture Constraints

Every decision reflects real Cypress ecosystem requirements:

  • Page objects as plain JS objects — not ES6 classes, return cy chains, no assertions inside
  • cy.session() for auth state caching — shared across tests, clears between spec files
  • cy.intercept() for network assertions — no arbitrary cy.wait(number) timeouts
  • Custom commands in commands.js — scrollToSection, waitForButtonState, getTableRow
  • @smoke tag via @cypress/grep — filtered smoke run on every push, no testng.xml needed
  • Mochawesome reporter with json:true — merge step required for single HTML output
  • retries: { runMode: 2 } — CI retry strategy, no retry in interactive mode
  • ESLint 9 + eslint-plugin-cypress — cy.wait(number) lint rule enforced
  • iframes.cy.js contains only it.skip() with documented rationale — not deleted

Test Coverage

12 QA Lab UI sections covered across 12 test files. IFrames intentionally skipped — documented architectural trade-off, not an oversight.

Buttons
Click states, disabled state assertion
Forms
Validation, field interaction, submit
Input Fields
Text, number, date, search, URL types
Checkboxes
Check/uncheck, disabled state
Radio Buttons
Selection, mutual exclusivity
Dropdowns
select(), multiple selection
Tables
Cell content, row count, edit action
Alerts & Modals
Open, confirm, cancel, dismiss
Dynamic Visibility
Checkbox-triggered panel reveal
Async Buttons
Loading → success/error transitions
Drag & Drop
trigger() HTML5 drag event simulation
Slider
Value change via trigger() assertion
IFrames — ⚫ Skipped
Cypress cross-origin limitation — it.skip() with documented reason. Full coverage in Stack 1 (Playwright TS).

CI Test Results

Latest GitHub Actions run · May 6, 2026 · ubuntu-latest · View all runs →

57
Total Tests
57
Passed
0
Failed
2m 38s
Run Duration
Smoke 22 tests · ~74s
Regression 57 tests · ~61s
Schedule Weekly · Mon 11:00 UTC
Report Mochawesome → GitHub Pages

Tech Stack

Browser-native Cypress stack — every tool chosen for the JavaScript-first ecosystem. Zero proprietary or paid dependencies.

📺
Cypress 13.x
Test framework — browser-native, time-travel debugging, cy.intercept() built-in
📋
JavaScript ES2022
Language — Cypress-native, no TS compilation overhead, full ESM module support
📊
Mochawesome 7.x
Reporting — Cypress standard HTML reporter, per-spec JSON merged to single output
🏷
@cypress/grep 4.x
Tag filtering — @smoke / @regression tags without testng.xml configuration
🔎
ESLint 9 + cypress plugin
Code quality — cy.wait(number) rule, no jQuery selectors, enforced in CI
⚙️
GitHub Actions
CI/CD — smoke on push, full regression on main, Monday 11:00 UTC schedule
🌐
GitHub Pages
Report hosting — Mochawesome HTML published after every CI run, free tier
🔁
cy.intercept() + cy.session()
Built-in patterns — network stubbing and auth caching unique to Cypress architecture
🤖
Claude Code
AI engineering accelerator — scaffolding, pattern review, CLAUDE.md specification

Cross-Stack Series

Same target, different stacks. Five frameworks built against the same QA Lab UI to produce evidence-based comparisons — not vendor benchmarks.

Performance Testing — Artillery

Unique in the series: Artillery with @artillery/plugin-playwright runs real Chromium browser instances under load — the only tool in the Cross-Stack Performance Series measuring Core Web Vitals. Part of the Cross-Stack Performance Series.

22ms
HTTP p95
62ms
Browser TTFB
561ms
Avg Page Load
32ms
INP (interaction)
HTTP Smoke 10 VU · 60s · p50 19ms · p99 24ms
HTTP Baseline 20 VU · 70s
Browser 3 Chromium VU · 60s · FCP / LCP / INP / CLS
Unique Only tool in series measuring user-perceived load
📊 View Full Performance Series →
Evgenii Subbotin
QA/SDET Lead · QA Architect · SAFe RTE

20 years in software engineering. This framework demonstrates cross-stack fluency — including knowing when not to fight a tool’s constraints. Documenting the IFrame limitation honestly is a stronger portfolio signal than hiding it.