|

Playwright Network Interception: Mock APIs, Block Resources, and Control Every Request

Playwright’s page.route() gives you complete control over every network request your application makes. Mock APIs, block analytics, simulate errors, and test offline behavior — all without changing your application code.

Contents

Basic API Mocking

test('mock API response', async ({ page }) => {
  await page.route('**/api/users', route => {
    route.fulfill({
      status: 200,
      contentType: 'application/json',
      body: JSON.stringify([
        { id: 1, name: 'Test User', email: 'test@example.com' }
      ])
    });
  });

  await page.goto('/users');
  await expect(page.getByText('Test User')).toBeVisible();
});

Simulate Error Responses

test('handle 500 server error gracefully', async ({ page }) => {
  await page.route('**/api/orders', route => {
    route.fulfill({ status: 500, body: 'Internal Server Error' });
  });

  await page.goto('/orders');
  await expect(page.getByText('Something went wrong')).toBeVisible();
  await expect(page.getByRole('button', { name: 'Retry' })).toBeVisible();
});

Block Third-Party Resources

test('block analytics and ads for faster tests', async ({ page }) => {
  await page.route('**/*.{png,jpg,jpeg,gif,svg}', route => route.abort());
  await page.route('**/analytics/**', route => route.abort());
  await page.route('**/ads/**', route => route.abort());
  await page.route('**google-analytics.com**', route => route.abort());

  await page.goto('/dashboard');  // Loads 3x faster without images/analytics
});

Modify Requests in Flight

test('add custom headers to all API requests', async ({ page }) => {
  await page.route('**/api/**', route => {
    route.continue({
      headers: {
        ...route.request().headers(),
        'X-Test-Mode': 'true',
        'X-Test-Id': 'test-123'
      }
    });
  });
});

Wait for Specific API Responses

test('wait for API before asserting', async ({ page }) => {
  const responsePromise = page.waitForResponse('**/api/search**');

  await page.goto('/search');
  await page.getByPlaceholder('Search').fill('playwright');
  await page.getByRole('button', { name: 'Search' }).click();

  const response = await responsePromise;
  expect(response.status()).toBe(200);

  const data = await response.json();
  expect(data.results.length).toBeGreaterThan(0);
});

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.