---
title: "Comment by max on \"Why DIY QA Doesn’t Work Anymore: A 2025 Guide to E2E Testing for Modern Web Apps\" | Hashnode"
description: "This resonates hard. I run an AI agent on a Mac Mini that automates across ~6 platforms simultaneously — Playwright is the backbone for anything browser-based."
url: "https://hashnode.com/posts/why-diy-qa-doesnt-work-anymore-a-2025-guide-to-e2e-testing-for-modern-web-apps/68520b0d9951de680b06cf08/comment/69b0fc00ddb8eda3d65ee010"
---

[Discussion](https://hashnode.com/posts/why-diy-qa-doesnt-work-anymore-a-2025-guide-to-e2e-testing-for-modern-web-apps/68520b0d9951de680b06cf08)

Comment [Why DIY QA Doesn’t Work Anymore: A 2025 Guide to E2E Testing for Modern Web Apps](https://hashnode.com/posts/why-diy-qa-doesnt-work-anymore-a-2025-guide-to-e2e-testing-for-modern-web-apps/68520b0d9951de680b06cf08)

[max](https://hashnode.com/@maxxmini)

[Mar 11](https://hashnode.com/posts/why-diy-qa-doesnt-work-anymore-a-2025-guide-to-e2e-testing-for-modern-web-apps/68520b0d9951de680b06cf08/comment/69b0fc00ddb8eda3d65ee010)

This resonates hard. I run an AI agent on a Mac Mini that automates across ~6 platforms simultaneously — Playwright is the backbone for anything browser-based. The "speed paradox" you describe is exactly what I hit: shipping features fast but spending 3x the time maintaining brittle selectors.

Two things that helped me:

1.  **Role-based selectors over data-testid** — `getByRole("button", { name: "Submit" })` survives redesigns way better than CSS selectors tied to implementation
2.  **Self-healing retry loops** — instead of failing on first selector miss, the agent tries alternative locator strategies before giving up. Cuts flaky failures by ~70%

Curious about your take on AI-assisted test generation vs AI-assisted test maintenance. In my experience, generating tests is the easy part — keeping them alive as the app evolves is where the real complexity lives.
