DEV Community

Styrow.dev
Styrow.dev

Posted on Originally published at styrow.dev

Designing a Resilient Playwright Strategy for Real-time Dashboard Consistency Under High Load

🔥 Real-time Dashboard Flakiness: The Playwright Nightmare! 🤯
Your E2E tests for dynamic financial dashboards are flaky. Race conditions and stale data from waitForTimeout mean slow, unreliable results.

📌 Problem Statement
Real-time UIs with cascading updates (WebSockets/SSE) challenge test stability. page.waitForTimeout() is an anti-pattern; it fails to guarantee data consistency across interdependent UI elements after updates.

💡 Solution & Code Walkthrough
Achieve stability with multi-pronged waits and robust data validation.

• Advanced Waiting:
❌ waitForTimeout(): Slow, brittle, hides race conditions.
✅ Event-driven: page.waitForResponse() for backend triggers.
✅ State-driven: page.waitForFunction() polls JS for UI stability (e.g., element content, app flag).
✅ Element-specific: locator.waitFor() for individual element states.

• Data Integrity:
❌ Asserting on partial updates.
✅ Reconcile: Capture expected data from backend before interaction. After waitForFunction ensures UI stability, assert displayed UI elements against this expected state, accounting for interdependencies.

// Example: Wait for dashboard stability
await page.waitForResponse(res => res.url().includes('/api/trades') && res.status() === 200); // Backend trigger

const expectedPortfolioVal = "1,234,567.89"; // Derive from backend
await page.waitForFunction(
  ([selector, expected]) => document.querySelector(selector)?.textContent?.includes(expected),
  ['.portfolio-value', expectedPortfolioVal],
  { timeout: 15000 }
); // Poll UI for specific text
await page.locator('.live-price-widget').first().waitFor({ state: 'visible' }); // Specific element check

await expect(page.locator('.individual-stock-price')).toHaveText('$123.45');
Enter fullscreen mode Exit fullscreen mode

🔑 Key Takeaways
• Observe: Wait for network/DOM events, not time.
• Custom Conditions: waitForFunction for complex UI states.
• Data Reconciliation: Compare UI data with known backend sources.

❓ Quick Summary Q&A
Q: waitForTimeout? A: No, slow & unreliable.
Q: Best wait? A: waitForResponse + waitForFunction.
Q: Interdependent data? A: Reconcile with expected backend state.

TAGS: playwright, e2e testing, automation, real-time, web sockets, sse, financial dashboard, data consistency, test flakiness, software quality, frontend testing

────────────────────────────────────────
Level up your engineering skills!
Download our app today:
App Store: ────────────────────────────────────────

📲 𝐅𝐑𝐄𝐄 𝐌𝐎𝐁𝐈𝐋𝐄 𝐀𝐏𝐏 — 𝟔𝟎𝟎+ 𝐒𝐃𝐄𝐓 𝐐&𝐀𝐬
Practice real-world interview scenarios offline on the free QA Automation & SDET Prep app:

🤖 𝐆𝐨𝐨𝐠𝐥𝐞 𝐏𝐥𝐚𝐲 (𝐀𝐧𝐝𝐫𝐨𝐢𝐝):
https://play.google.com/store/apps/details?id=com.app.seleniuminterviewquestions&referrer=utm_source%3Ddevto%26utm_medium%3Darticle%26utm_campaign%3Dselenium_20261010

🍎 𝐀𝐩𝐩 𝐒𝐭𝐨𝐫𝐞 (𝐢𝐎𝐒):
https://apps.apple.com/app/id6786760948?pt=128640464&ct=devto_selenium_20261010&mt=8

────────────────────────────────────────
Play Store: ────────────────────────────────────────

📲 𝐅𝐑𝐄𝐄 𝐌𝐎𝐁𝐈𝐋𝐄 𝐀𝐏𝐏 — 𝟔𝟎𝟎+ 𝐒𝐃𝐄𝐓 𝐐&𝐀𝐬
Practice real-world interview scenarios offline on the free QA Automation & SDET Prep app:

🤖 𝐆𝐨𝐨𝐠𝐥𝐞 𝐏𝐥𝐚𝐲 (𝐀𝐧𝐝𝐫𝐨𝐢𝐝):
https://play.google.com/store/apps/details?id=com.app.seleniuminterviewquestions&referrer=utm_source%3Ddevto%26utm_medium%3Darticle%26utm_campaign%3Dselenium_20261010

🍎 𝐀𝐩𝐩 𝐒𝐭𝐨𝐫𝐞 (𝐢𝐎𝐒):
https://apps.apple.com/app/id6786760948?pt=128640464&ct=devto_selenium_20261010&mt=8

────────────────────────────────────────
────────────────────────────────────────

Top comments (0)