Halmurat T.
Halmurat T.

Senior SDET

Home Blog Books ask About

The Dispatch

Weekly QA notes from the trenches.

Welcome aboard!

You're on the list. Expect real-world QA insights — no fluff, no spam.

© 2026 Halmurat T.

Automation 24
  • Selenium
  • Playwright
  • Appium
  • Cypress
AI Testing 5
CI/CD 6
  • GitHub Actions
  • Slack Reporting
QA Strategy 4
Case Studies 5
§ Journal · Archive

Blog

All (44) Automation (24) AI Testing (5) CI/CD (6) QA Strategy (4) Case Studies (5)
AI Testing
April 28, 2026 / 14 min

Playwright MCP vs CLI vs Agents: What to Use in 2026

Playwright has three ways to talk to AI: MCP, CLI, and Test Agents. Here's the decision framework an enterprise SDET uses to pick the right one for 2026.

Filed under ai-testing /playwright
AI Testing
April 23, 2026 / 12 min

Claude Code Has 2 Primitives, Not 3 — Use Skills First

Most engineers think Claude Code has three primitives. It actually has two — skills and subagents. Here's when to use which, with token-cost benchmarks.

Filed under ai-testing /claude
CI/CD
April 23, 2026 / 11 min

Playwright's New CLI Debugger Finally Works in Headless CI

Playwright 1.59 ships --debug=cli and scriptable trace analysis. The first debug surface that actually works where enterprise tests fail — headless CI.

Filed under playwright /cicd
Automation
April 21, 2026 / 11 min

Playwright 1.59's Screencast API Ends Useless Test Videos

Playwright 1.59 ships a Screencast API with burned-in action annotations and chapter markers. Microsoft sells it for AI agents — the real win is CI triage.

Filed under playwright /trace-viewer
QA Strategy
April 17, 2026 / 24 min

Stop Sharing Test Environments — Build One You Control

Shared staging environments are the #1 source of flaky UI tests in enterprise teams. Here's the 5-pillar blueprint for building a controlled test environment.

Filed under qa-strategy /test-data
Case Studies
April 9, 2026 / 11 min

We Cut 150 Min of Test Setup with 3 Java Classes

How we built a Playwright API test data layer in Java — replacing UI setup that burned 150 minutes per run with 3 classes and a legacy API wrapping pattern.

Filed under case-study /api-testing
Automation
April 2, 2026 / 13 min

Contract Testing vs API Testing — What's the Difference?

Contract testing and API testing look similar but they catch very different bugs. Here's where contract testing fits next to unit, API, and E2E tests.

Filed under api-testing /design-patterns
Automation
March 24, 2026 / 13 min

Parallel Execution Without the Refactor Tax

Thread-level parallelism demands ThreadLocal and full framework rewrites. Process-level parallelism doesn't. Here's the difference and when to use each.

Filed under selenium /parallel-execution
Automation
March 19, 2026 / 9 min

Stop Using locator() for Everything in Playwright

Most Playwright teams still use CSS selectors via locator() out of habit. getByRole and getByText find elements the way users do — and survive redesigns.

Filed under playwright /selenium
Automation
March 17, 2026 / 12 min

Shared Test Users Are Sabotaging Your Parallel Suite

How shared test accounts create race conditions in parallel Playwright runs, and the 3 isolation patterns that eliminated our 12% failure rate overnight.

Filed under playwright /parallel-execution
Automation
March 12, 2026 / 8 min

Stop Launching a Browser Per Test in Playwright

Launching a new browser per test in Playwright wastes 3-6 seconds each time. BrowserContext gives you the same isolation in milliseconds. Here's how to switch.

Filed under playwright /selenium
Automation
March 10, 2026 / 10 min

Playwright's storageState() Is Contaminating Your Tests

storageState() saves cookies, localStorage, and sessionStorage in one blob. Here's how it silently poisons parallel tests and how to strip it to cookies only.

Filed under playwright /parallel-execution
Automation
March 5, 2026 / 15 min

Selenium vs Playwright in 2026: Same Test, Two Frameworks

We build the exact same Java test in both Selenium and Playwright side by side. See the real code differences in setup, locators, network mocking, and debugging

Filed under selenium /playwright
Automation
March 3, 2026 / 6 min

The Browser Errors Your Test Suite Never Catches

Your UI tests pass green while the console throws errors. Learn to catch JavaScript and page errors in Selenium and Playwright Java — before users do.

Filed under playwright /selenium
Automation
February 26, 2026 / 12 min

Your Test Suite Is Slow for 5 Reasons — Not Just One

Parallelism alone won't save your slow test suite. Here are five layers of optimization — from test design to cloud infrastructure — ranked by real impact.

Filed under selenium /parallel-execution
QA Strategy
February 24, 2026 / 9 min

Shift-Left Is a Lie If Only QA Shifted

Shift-left promised earlier testing. In practice, it shifted QA's workload without shifting developer accountability. Here's what actually needs to change.

Filed under qa-strategy /shift-left
Case Studies
February 19, 2026 / 13 min

Shared Session Cookies Corrupted Our Parallel Tests

Eight Playwright BrowserContexts were properly isolated, but they all loaded the same session cookie — so the server treated 8 parallel threads as one.

Filed under case-study /parallel-execution
AI Testing
February 12, 2026 / 12 min

Self-Healing Locators Aren't Magic — Here's How They Work

Most self-healing test tools use simple fallback chains, not real AI. Learn the 4 approaches to AI locator repair and which one fits your framework best.

Filed under self-healing /ai-testing
QA Strategy
February 10, 2026 / 13 min

Your Green Test Suite Is Hiding Real Bugs

Handling unexpected alerts or removing assertions to make tests pass doesn't fix anything — it buries bugs. Here's how to spot and stop these patterns.

Filed under qa-strategy /testing
Automation
January 27, 2026 / 5 min

Playwright's onceDialog Has a Silent Handler Leak

Why onceDialog stays registered when no dialog fires, silently eating the next dialog from an unrelated action — and the onDialog/offDialog pattern that fixes it.

Filed under playwright /framework-design
Case Studies
January 13, 2026 / 13 min

The Flaky Test Isn't Flaky — It's a Race Condition

How a 'flaky' Playwright test exposed a shared test user race condition in our parallel suite, and the isolation patterns that fixed it for good.

Filed under case-study /parallel-execution
Automation
December 16, 2025 / 12 min

Selenium's Alert Handling Crashed Our Parallel Suite

How UnhandledAlertException broke 8-thread parallel execution and why Playwright's event-driven dialog model avoids that entire failure pattern in practice.

Filed under playwright /selenium
Automation
November 4, 2025 / 3 min

Playwright's onceDialog Saved Me From a Handler Leak — Until It Didn't

How onceDialog fixes permanent handler leaks from onDialog — and the one case where it creates a new problem. Includes the onDialog/offDialog pattern for dialogs that might not fire.

Filed under playwright /framework-design
CI/CD
September 23, 2025 / 12 min

Stop Emailing Test Reports — Host Allure on Jenkins

Replace emailed Extent Report HTML files with a persistent Allure portal on Jenkins, so the team gets one URL, full history, and zero downloads to manage.

Filed under cicd /jenkins
CI/CD
August 12, 2025 / 10 min

Host a Team Report Portal with Allure Docker Service

Set up a standalone Allure report portal with Docker that any CI tool can push to, so the whole team can review results without logging into Jenkins daily.

Filed under cicd /docker
AI Testing
June 24, 2025 / 10 min

Your Copilot Isn't Dumb — You're Starving It of Context

Enterprise GitHub Copilot stuck on an older model? Three files give it project context, reusable prompts, and path-specific rules that improve output.

Filed under copilot /ai-testing
CI/CD
May 6, 2025 / 11 min

Task Scheduler Runs Our Automation Server — Here's How

Five real ways I use Windows Task Scheduler to keep an enterprise Playwright automation server healthy — from nightly test runs to disk alerts and cleanup.

Filed under cicd /devops
Case Studies
March 11, 2025 / 11 min

2 Minutes a Day Cost Me More Than You Think

I automated my enterprise VPN login with Python and saved 10+ hours a year. But the real win wasn't time — it was the focus and brain energy I never got back.

Filed under case-study /war-story
Case Studies
January 28, 2025 / 11 min

Our Enterprise Approved AI — And Why It's the Biggest Risk

Enterprises lock teams into outdated AI models for safety. The irony? Older, less capable models produce worse code and create more risk than they prevent.

Filed under case-study /ai-testing
Automation
December 10, 2024 / 5 min

From Selenium Wrappers to Playwright Locators

How Playwright's locator API eliminates the need for custom wrapper classes we spent weeks building in Selenium, and when wrappers still make sense today.

Filed under selenium /playwright
AI Testing
October 15, 2024 / 11 min

I Let AI Write My Test Suite — Here's What Broke

A hands-on experiment with AI-generated Playwright tests: where LLMs save time, where they create false confidence, and the review workflow that works.

Filed under ai-testing /test-generation
Automation
August 6, 2024 / 8 min

How We Stopped Arguing About Whose Tests Failed

Use Cucumber squad tags and Extent Reports to route test failures to the right team automatically, with full implementation details for Appium projects.

Filed under selenium /framework-design
Automation
May 28, 2024 / 7 min

Your Selectors Keep Breaking — Start Using Text

Why text-based locators reduce test maintenance by up to 60%, and how to use them in Selenium and Playwright with real enterprise UI examples that last.

Filed under selenium /playwright
Automation
March 19, 2024 / 5 min

Managing UI Text in Test Automation

When to use properties files, enums, or spreadsheets for UI text in test automation, and how to keep assertions maintainable across locales and releases.

Filed under test-automation /java
Automation
January 23, 2024 / 8 min

Testing Webhooks Requires a Different Strategy

Why your API testing patterns fail for webhooks, and the listener-based strategy that fixed our CI pipeline after a full week of production-style debugging.

Filed under api-testing /framework-design
CI/CD
November 14, 2023 / 5 min

Passing Inputs to Tests with GitHub Actions

Use workflow_dispatch inputs to choose platform, suite, and release data at runtime without cloning workflows or hardcoding separate jobs for each scenario.

Filed under testing /github-actions
CI/CD
August 22, 2023 / 5 min

Send Test Results to Slack Without Losing the Signal

A practical pattern for posting color-coded test summaries to Slack from GitHub Actions, with thresholds and summaries that help teams notice failures fast.

Filed under slack /reporting
Automation
May 16, 2023 / 9 min

What Makes a Good Test?

A practical guide to writing tests that catch broken behavior, fail for useful reasons, and keep earning trust in noisy enterprise CI pipelines over time.

Filed under java /testing
Automation
February 7, 2023 / 6 min

Migrating Off Cypress? Here's When to Keep It

An honest take on Cypress vs Playwright migrations from an SDET who's done three, including the signals that tell you not to migrate your suite just yet.

Filed under cypress /playwright
Automation
October 18, 2022 / 6 min

The Async Trap Behind Flaky Playwright Tests

The 3 async mistakes that cause flaky Playwright tests after a Selenium migration, and how we fixed a 23% intermittent failure rate in our CI pipeline.

Filed under playwright /framework-design
Automation
June 14, 2022 / 11 min

Thread Safety in Parallel Tests: The 3-Day Bug

How a shared WebDriver instance caused phantom failures in our 800-test parallel suite, and the ThreadLocal pattern that finally stabilized the whole run.

Filed under java /parallel-execution
QA Strategy
February 8, 2022 / 7 min

What the SDET Role Looks Like in the Age of AI

How AI is changing the SDET role in practice, from faster test generation and log analysis to stronger review, evaluation, and system design judgment.

Filed under ai /sdet
Automation
October 12, 2021 / 4 min

Tight vs Loose Coupling in Java Test Design

A practical explanation of tight and loose coupling in Java, with examples that show why dependency boundaries matter for maintainability and testing.

Filed under java /loose-coupling
Automation
June 29, 2021 / 8 min

XPath text() vs Dot — Why Your Text Match Fails

The real difference between XPath text(), dot, contains(), and normalize-space() for test automation — with examples that explain real flaky failures.

Filed under selenium /playwright
§ Colophon

Halmurat T. — Senior SDET writing about test automation, CI/CD, and QA strategy from 10+ years in the enterprise trenches.

Set in
IBM Plex Sans, Lora, and IBM Plex Mono.
Built with
Astro, MDX, Tailwind CSS & Expressive Code. Served by Vercel.
Privacy
No cookies. No tracking scripts on the main thread — analytics run sandboxed via Partytown.
Source
github.com/Halmurat-Uyghur
Terminal
Try /ask to query Halmurat's notes in a shell prompt.

© 2026 Halmurat T. · Written in plain text, shipped in plain time.

Search
Esc

Search is not available in dev mode.

Run npm run build then npm run preview:local to test search locally.