•
Drizz raises $2.7M in seed funding •
•
Featured on Forbes
•
Drizz raises $2.7M in seed funding •
•
Featured on Forbes

This is #1 cause. A study analyzing 201 fixes across 51 Apache projects found that 45% of flaky test fixes addressed async timing issues. A 2026 benchmark report confirmed same range across mobile and web.
What happens: your test clicks a button before screen finishes loading. The element exists in DOM but isn't interactive yet. The test fails. You re-run it 30 seconds later and it passes. Nothing changed except timing.
The bad fix: Thread.sleep() or time.sleep().
The right fix: explicit, condition based waits.
The mobile-specific wrinkle: animations. A button might be "visible" but still animating into position. The test taps wrong coordinates. Disable animations in your test environment (adb shell settings put global window_animation_scale 0 on Android) or use a framework that waits for animation completion.
On r/Playwright, a developer who rewrote a flaky suite summarized it cleanly: "The real lesson: flakiness is usually a waiting problem, not a selector problem." In same thread, another commenter added a practical warning for SPAs: "waitForResponse is right call but SPAs will still bite you when response lands before component finishes rendering." The fix is combining network-level waits (API response received) with DOM-level checks (element is visible and interactive). And on topic of hardcoded timeouts, one reply put it bluntly: "You don't actually win until you go back and delete page.waitForTimeout calls someone added in a panic six months ago, because those are ones that mask real bugs."
QA Wolf's analysis of production test suite failures found that DOM changes and brittle selectors account for about 28% of test failures. Not majority, but consistent.
What happens: a developer renames a component, changes a CSS class, restructures view hierarchy, or removes an accessibility ID during refactoring. The test can't find element. It fails. The QA team investigates, discovers selector broke, updates it, and re-runs. That cycle repeats every sprint.
Selectors from most fragile to most stable:
How to reduce selector fragility (within selector-based frameworks):
The fundamental limit: no matter how disciplined your selector strategy, selectors are a coupling between your test code and your app code. When app changes, coupling can break. The question is how often and how quickly you can fix it. For teams where selector maintenance consumes 30-50% of QA time (common with Appium), structural problem is coupling itself.
On r/Playwright, a commenter gave most practical advice for any flaky test: "Find out why test is failing. That will help you figure out solution." It sounds obvious, but most teams skip investigation and jump to retries. Retries mask root cause. On r/PracticalTesting, a post made case that "Flaky tests need owners, not just retries." Assigning ownership to specific team members forces investigation instead of suppression.
Device inconsistency is third root cause. It's especially painful on Android, where fragmentation means your test can pass on a Pixel 8 emulator and fail on a Samsung Galaxy S23 real device.
What causes it:
How to fix it:
On r/QualityAssurance, a tester recommended pragmatic first step: "Disable specific tests until you have time to fix and stabilize them." Quarantining device-dependent flakes keeps your CI signal clean while you investigate.
On r/devops, another commenter pointed to test pyramid as structural fix: "The textbook solution is to have majority tests as unit test, maybe 20% of tests should be integration tests and lastly perhaps 5-10% system level tests." Fewer E2E tests means fewer opportunities for device-specific flakes to block your pipeline.
The fourth root cause. A test passes locally, fails in CI, and nobody can reproduce it.
What causes it:
How to fix it:
On r/Playwright, a commenter described CI specific pattern: "This comes up all time and usually is a mix of an infrastructure (bottlenecks that get revealed when you increase workers in your CI environment) and poor test code (writing tests that are not parallel friendly or brittle)." On r/devops, another pointed to shared state: "With 'flaky' tests you will likely have some of following - global state being used between tests that are not being accounted for correctly, such as a global logger, a global tracing provider, etc." Both are CI-specific problems that don't show up when running tests locally one at a time.
The first three root causes (timing, devices, environments) exist in every testing framework. The fourth category, selector fragility, is structural. It exists because selector-based frameworks couple your tests to your app's internal element identifiers.
Drizz's Vision AI removes that coupling.
How it works:
What this fixes:
What this doesn't fix:
The numbers: teams using Vision AI report 90%+ reduction in flaky test failures. The reduction comes primarily from eliminating selector fragility and reducing timing flakes through adaptive waits. The remaining flakiness is device and environment related, which requires infrastructure fixes, not framework changes.
For teams where selector maintenance eats sprint time, removing selector layer is highest-leverage fix. For teams where timing or environment drift is dominant problem, fixes in sections 1 and 4 of this guide apply regardless of which framework you use.
The pattern across every Reddit thread on flaky tests is same: teams retry instead of investigating, patch instead of fixing, and add sleep commands instead of understanding wait. The four root causes listed above are what investigation should target.
About 28%, based on QA Wolf's analysis of production test suite failures. The larger category is async timing at roughly 45%.
No. It eliminates selector fragility. Timing, device, and environment issues still need separate fixes. Teams report 90%+ overall reduction because selector flakes compound with other causes.
No. Use explicit, condition-based waits. Sleep commands waste time when app is fast and cause failures when app is slow.
Re-run it on same commit without code changes. Passes on retry = flaky. Fails consistently = real regression. Track both categories separately.
Quarantine known flaky tests so they don't block deploys. Gather execution data over 1-2 sprints. Then fix or delete them. This stops bleeding while you address root causes.
Yes. Drizz uses adaptive wait logic that detects screen state before executing next step, instead of static timers. It doesn't eliminate all timing issues, but it handles common cases without explicit wait commands.
Related Content:
Self-healing test automation | Why test automation fails | Self-healing test automation tools | Book a demo