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.
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.
| 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).
- 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) — nobeforeEachboilerplate. - 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_URLswitches the target, e.g. another variant of the site:BASE_URL=https://oleksandr-shevchenko.de npx playwright test
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 reportGitHub 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.