Skip to content

Repository files navigation

Portfolio E2E Test Suite

e2e

End-to-end, API and accessibility test suite for my portfolio site work.oleksandr-shevchenko.de — built with Playwright + TypeScript and running in GitHub Actions against production.

Why this repo exists

I come from three years of daily, AI-assisted browser automation — isolated browser/session orchestration across 10,000+ profiles and network traffic analysis with custom mitmproxy tooling. This repository shows the other side of that experience: maintainable, deterministic test code for a real, deployed web application. The implementation is AI-assisted; scope, verification and debugging are mine.

What is covered

Spec Coverage
smoke.spec.ts Page loads, hero content, zero uncaught JS errors, header/footer chrome, legal pages
navigation.spec.ts Anchor navigation, browser back after anchor + project navigation, every published project route (via UI click and direct URL), 404 handling
i18n.spec.ts EN/DE locale switching, lang attribute, localized content actually differs, hreflang alternates
contact.spec.ts Direct contact channels: correct mailto:, GitHub/LinkedIn/Telegram profiles, rel="noopener" on external links
api.spec.ts JSON contract tests for /api/models and /api/github, unknown-route 404
seo.spec.ts Sitemap completeness, robots.txt, web manifest, meta description, canonical URL, Open Graph tags
a11y.spec.ts Axe-core WCAG 2.0 A/AA scan on both locales — build fails on serious/critical violations
positioning.spec.ts Positioning contract: production must tell the current, factually accurate story — outdated claims fail the build

Everything runs on two browser profiles: Desktop Chrome and Pixel 7 (mobile) — the mobile run caught a real difference on day one (the section navigation is hidden in the mobile header, which the suite now documents explicitly).

Design decisions

  • Page Object Model + custom fixtures. Selectors and page flows live in src/pages/, specs stay declarative. Page objects are injected via Playwright fixtures (src/fixtures.ts) — no beforeEach boilerplate.
  • Deterministic by construction. No LLM-dependent flows are asserted in CI (the site's AI demos call external model providers); API tests pin the contract, not volatile payloads. No visual snapshots — font rendering varies across environments and produces flaky diffs.
  • No side effects on production. The suite never submits forms or triggers outbound messages; external links are asserted, not followed.
  • Accessibility as a gate, not a report. Serious/critical axe violations fail the build; minor findings are attached to the test report as JSON.
  • Environment-agnostic. BASE_URL switches the target, e.g. another variant of the site: BASE_URL=https://oleksandr-shevchenko.de npx playwright test

Running locally

npm ci
npx playwright install chromium
npx playwright test          # full suite, desktop + mobile
npx playwright test --ui     # interactive mode
npm run report               # open the HTML report

CI

GitHub Actions runs the suite on every push, on demand, and on a weekly schedule against production — a lightweight uptime/regression monitor that catches drift between deploys. The HTML report (with traces and screenshots on failure) is uploaded as a build artifact for every run.

About

E2E, API and accessibility test suite for my portfolio — Playwright + TypeScript, POM, GitHub Actions against production

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages