QA Lab · Cross-Stack Series · Stack 1

Playwright + TypeScript
+ Allure Framework

Modern TypeScript-first automation framework demonstrating the patterns valued in product-engineering organisations — typed fixtures, rich Allure reporting, true cross-browser execution — built against the QA Lab as the reference benchmark for the Cross-Stack Series.

Playwright 1.44 · TypeScript 5.x · allure-playwright 3.x · ESLint + @typescript-eslint · Node.js 20 LTS

✓ CI Green 12 Test Files 14 UI Sections Covered TypeScript 5.x Strict 📊 Allure Report Live Chromium · Firefox · WebKit

About This Project

The Purpose

Playwright is the reference framework for new automation projects — the author’s preferred stack for any greenfield engagement. It runs outside the browser via the Chrome DevTools Protocol, giving it full cross-browser reach (including WebKit / Safari), native iframe support via frameLocator(), and a best-in-class async API designed for modern JavaScript runtimes.

This is Stack 1 of the Cross-Stack Series — the benchmark against which all other stacks are compared. It demonstrates the patterns that command the most value in TypeScript-native product organisations: typed fixtures for dependency injection, @step decorators for self-documenting Allure reports, and soft assertions for multi-field validation scenarios.

Key differentiator vs other stacks: Full cross-browser execution (Chromium + Firefox + WebKit), native iframe support via frameLocator(), and fullyParallel: true at zero extra cost — none of which require paid services.

Architecture Constraints

Every decision reflects real TypeScript ecosystem requirements:

  • types.ts defined first — all interfaces (RegistrationForm, TableRow, AsyncButtonState) typed before any page object
  • base.fixture.ts with test.extend() — typed fixture injection, single setup point for all sections
  • @step decorator on all Page Object methods — Allure report populated automatically, zero manual allure.step() calls
  • Locators as readonly class properties — resolved once in constructor, reused across methods
  • expect.soft() for multi-field form checks — collects all failures, not first-fail
  • No page.waitForTimeout() anywhere — all waits via Playwright auto-waiting or expect().toBeVisible()
  • frameLocator('#iframes iframe') for iframe access — never page.frames()
  • fullyParallel: true — free parallelism via GitHub Actions matrix, no Playwright Cloud needed
  • npx tsc --noEmit in CI — compile gate before any test execution

Test Coverage

14 QA Lab UI sections covered across 12 test files — the widest coverage in the Cross-Stack Series, including full iframe support not available in all stacks.

Buttons
Click states, disabled state assertion
Forms
Validation, field interaction, @parametrize submit
Input Fields
Text, number, date, search, URL types
Checkboxes
Check/uncheck, disabled state
Radio Buttons
Selection, mutual exclusivity
Dropdowns
Single select, multi-select
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
IFrames
frameLocator() — context switch, inner element interaction
Drag & Drop
dragAndDrop() — item reorder, drop zone validation
Slider
Value change via fill() — input[type=range]
Text Area
Input and content validation

CI Test Results

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

60
Total Tests
60
Passed
0
Failed
3m 35s
Run Duration
Browser Setup ~73s
Test Execution 60 tests · ~122s
Schedule Weekly · Mon 08:00 UTC
Report Allure → GitHub Pages

Tech Stack

TypeScript-first stack — every tool justified by real-world engineering requirements. Zero proprietary or paid dependencies.

📺
Playwright 1.44
Test framework — CDP-based, full cross-browser, native frameLocator(), auto-waiting
📋
TypeScript 5.x Strict
Language — strict mode, noImplicitAny, compile gate in CI before tests run
📊
allure-playwright 3.x
Reporting — @step decorators, @feature/@story/@severity, screenshots, GitHub Pages
🎓
Typed Fixtures
base.fixture.ts with test.extend() — typed dependency injection, single setup point
🔎
ESLint + @typescript-eslint
Code quality — no-any, no-floating-promises rules enforced in CI lint gate
⚙️
GitHub Actions
CI/CD — tsc + lint gate, cross-browser run, Allure deploy, Monday 08:00 UTC schedule
🌐
Cross-Browser (3 engines)
Chromium + Firefox + WebKit — bundled browsers, zero extra cost, fullyParallel: true
🔄
GitHub Pages
Allure report hosting — deployed after every CI run, free tier, permanent URL
🤖
Claude Code
AI engineering accelerator — scaffolding, pattern review, CLAUDE.md specification

Performance Testing — k6

JavaScript-native performance testing embedded in the same repo. k6 runs in its own V8 runtime — zero friction with the TypeScript ecosystem. Grafana Cloud integration optional. Part of the Cross-Stack Performance Series.

~65ms
p95 Response
~120ms
p99 Response
0.00%
Error Rate
500ms
p95 SLO Target
Smoke 5 VU · 30s · every push
Baseline 10 staged VU · 60s · main only
Warm CDN p95 ~55ms
Cold CDN p95 ~210ms (edge miss — documented)
📊 View Full Performance Series →

Cross-Stack Series

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

Evgenii Subbotin
QA/SDET Lead · QA Architect · SAFe RTE

20 years in software engineering. Playwright TypeScript is the author’s recommended stack for new projects — this framework demonstrates why, and the rest of the Cross-Stack Series demonstrates what the trade-offs look like in practice.