DEV Community

Styrow.dev
Styrow.dev

Posted on Originally published at styrow.dev

How would you implement robust early-stage error detection and reporting for critical client-side issues (e.g., specific

🚨 Client-Side Errors Killing Your Playwright Tests? How do you catch critical JS errors or failed API calls before they even render during initial page load, ensuring robust early-stage error detection?

📌 Problem Statement
Detecting early client-side issues like uncaught JavaScript exceptions, console errors, or failed critical network requests is challenging. These often occur pre-rendering or before the load event fires.
❌ Traditional assertions on the DOM or network logs can miss issues that manifest too early.
❌ Waiting for page.waitForLoadState('load') is often insufficient for immediate lifecycle problems.

💡 Solution & Code Walkthrough
A robust solution leverages Playwright's event-driven API by attaching listeners to the Page and BrowserContext objects proactively, before any navigation. This ensures comprehensive coverage from the earliest possible moment.

• Use page.on('pageerror') to capture uncaught JavaScript exceptions.
• Use page.on('console') to intercept and filter for error or warn messages.
• Use browserContext.on('requestfailed') to monitor all failed network requests within the context, catching issues even from early-stage fetches.

// Assume Playwright setup, e.g., in a 'tests' folder
import { test, expect, BrowserContext, Page } from '@playwright/test';

let page: Page;
let context: BrowserContext;
const clientErrors: string[] = [];
const networkFailures: string[] = [];

test.beforeEach(async ({ browser }) => {
  context = await browser.newContext();
  page = await context.newPage();

  // Attach listeners BEFORE page navigation
  page.on('pageerror', err => clientErrors.push(`JS Error: ${err.message}`));
  page.on('console', msg => {
    if (msg.type() === 'error' || msg.type() === 'warn') {
      clientErrors.push(`Console ${msg.type()}: ${msg.text()}`);
    }
  });
  context.on('requestfailed', req =>
    networkFailures.push(`Failed Req: ${req.url()} - ${req.failure()?.errorText}`));
});

test.afterEach(async () => {
  clientErrors.length = 0; // Clear array for next test
  networkFailures.length = 0;
  await page.close();
  await context.close();
});

test('critical page loads without client-side issues', async () => {
  await page.goto('https://your-critical-app.com'); // Navigate AFTER listeners are set

  // Assertions after navigation completes
  expect(clientErrors).toEqual([], 'Expected no client-side JS or console errors');
  expect(networkFailures).toEqual([], 'Expected no critical network failures');
  // Add other page-specific assertions here
});
Enter fullscreen mode Exit fullscreen mode

🔑 Key Takeaways
✅ Proactive Attachment: Crucially, attach all event listeners before calling page.goto().
✅ Holistic Coverage: Capture uncaught JS errors, console messages, and network failures.
✅ BrowserContext Scope: browserContext.on('requestfailed') ensures even the earliest network issues are detected.
✅ Actionable Reporting: Collect errors into arrays for clear, easily assertable results.

❓ Quick Summary Q&A
Q: How do you detect early client-side issues (JS errors, failed API calls) in Playwright tests?
A: By attaching page.on('pageerror'), page.on('console'), and browserContext.on('requestfailed') listeners before any navigation, ensuring issues are caught from the earliest lifecycle stage.

TAGS: playwright, typescript, e2e testing, automation, web testing, frontend testing, error handling

────────────────────────────────────────
Level up your testing skills on the go!
────────────────────────────────────────

📲 𝐅𝐑𝐄𝐄 𝐌𝐎𝐁𝐈𝐋𝐄 𝐀𝐏𝐏 — 𝟔𝟎𝟎+ 𝐒𝐃𝐄𝐓 𝐐&𝐀𝐬
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_20260922

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

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

Top comments (0)