Table of contents

How to Take Screenshots with Puppeteer?

Taking screenshots is one of the most common use cases for Puppeteer, Google's headless Chrome automation library. Whether you need to capture full-page screenshots, specific elements, or implement automated visual testing, Puppeteer provides powerful and flexible screenshot capabilities.

Basic Screenshot Setup

Before taking screenshots, you need to set up Puppeteer and launch a browser instance:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Navigate to the page you want to capture
  await page.goto('https://example.com');

  // Take a screenshot
  await page.screenshot({ path: 'screenshot.png' });

  await browser.close();
})();

Full-Page Screenshots

By default, Puppeteer captures only the visible viewport. To capture the entire page, use the fullPage option:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('https://example.com');

  // Capture full-page screenshot
  await page.screenshot({ 
    path: 'full-page.png',
    fullPage: true 
  });

  await browser.close();
})();

Element Screenshots

To capture specific elements on a page, first select the element, then use the screenshot() method on the element handle:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('https://example.com');

  // Select the element you want to capture
  const element = await page.$('#header');

  // Take a screenshot of the specific element
  await element.screenshot({ path: 'element.png' });

  await browser.close();
})();

Advanced Screenshot Configuration

Puppeteer offers numerous options to customize your screenshots:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Set viewport size
  await page.setViewport({ width: 1920, height: 1080 });

  await page.goto('https://example.com');

  // Advanced screenshot with multiple options
  await page.screenshot({
    path: 'advanced-screenshot.png',
    type: 'png',              // png, jpeg, webp
    quality: 80,              // Only for jpeg (0-100)
    fullPage: true,           // Capture full page
    clip: {                   // Capture specific area
      x: 0,
      y: 0,
      width: 800,
      height: 600
    },
    omitBackground: true      // Transparent background
  });

  await browser.close();
})();

Screenshot Formats and Quality

Puppeteer supports multiple image formats with different quality settings:

// PNG (default) - lossless compression
await page.screenshot({ 
  path: 'screenshot.png',
  type: 'png' 
});

// JPEG with quality setting
await page.screenshot({ 
  path: 'screenshot.jpg',
  type: 'jpeg',
  quality: 85 
});

// WebP format
await page.screenshot({ 
  path: 'screenshot.webp',
  type: 'webp',
  quality: 90 
});

Capturing Screenshots in Memory

Instead of saving to disk, you can capture screenshots as buffers for further processing:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('https://example.com');

  // Capture screenshot as buffer
  const buffer = await page.screenshot({ 
    type: 'png',
    fullPage: true 
  });

  // You can now process the buffer
  console.log('Screenshot size:', buffer.length);

  // Or save it manually
  const fs = require('fs');
  fs.writeFileSync('manual-save.png', buffer);

  await browser.close();
})();

Mobile Device Screenshots

To capture screenshots as they would appear on mobile devices:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // Emulate iPhone X
  await page.emulate(puppeteer.devices['iPhone X']);

  await page.goto('https://example.com');

  await page.screenshot({ 
    path: 'mobile-screenshot.png',
    fullPage: true 
  });

  await browser.close();
})();

Handling Dynamic Content

For pages with dynamic content, you might need to wait before taking screenshots:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('https://example.com');

  // Wait for specific element to load
  await page.waitForSelector('#dynamic-content');

  // Wait for network to be idle
  await page.waitForLoadState('networkidle');

  // Wait for specific time
  await page.waitForTimeout(2000);

  await page.screenshot({ 
    path: 'dynamic-content.png',
    fullPage: true 
  });

  await browser.close();
})();

Error Handling and Best Practices

Always implement proper error handling when taking screenshots:

const puppeteer = require('puppeteer');
const fs = require('fs').promises;

async function takeScreenshot(url, outputPath) {
  let browser;

  try {
    browser = await puppeteer.launch({ 
      headless: true,
      args: ['--no-sandbox', '--disable-setuid-sandbox'] 
    });

    const page = await browser.newPage();

    // Set a reasonable timeout
    await page.goto(url, { 
      waitUntil: 'networkidle2', 
      timeout: 30000 
    });

    // Ensure output directory exists
    const dir = require('path').dirname(outputPath);
    await fs.mkdir(dir, { recursive: true });

    await page.screenshot({ 
      path: outputPath,
      fullPage: true 
    });

    console.log(`Screenshot saved to ${outputPath}`);

  } catch (error) {
    console.error('Screenshot failed:', error);
    throw error;
  } finally {
    if (browser) {
      await browser.close();
    }
  }
}

// Usage
takeScreenshot('https://example.com', './screenshots/example.png');

Performance Optimization

For taking multiple screenshots efficiently, reuse browser instances:

const puppeteer = require('puppeteer');

async function takeMultipleScreenshots(urls) {
  const browser = await puppeteer.launch();

  try {
    const screenshots = await Promise.all(
      urls.map(async (url, index) => {
        const page = await browser.newPage();
        await page.goto(url);
        await page.screenshot({ path: `screenshot-${index}.png` });
        await page.close();
        return `screenshot-${index}.png`;
      })
    );

    return screenshots;
  } finally {
    await browser.close();
  }
}

// Usage
const urls = ['https://example.com', 'https://google.com', 'https://github.com'];
takeMultipleScreenshots(urls);

Integration with Testing Frameworks

Screenshots are commonly used in automated testing for visual regression testing:

const puppeteer = require('puppeteer');
const { expect } = require('chai');

describe('Visual Tests', () => {
  let browser, page;

  before(async () => {
    browser = await puppeteer.launch();
    page = await browser.newPage();
  });

  after(async () => {
    await browser.close();
  });

  it('should capture homepage screenshot', async () => {
    await page.goto('https://example.com');

    const screenshot = await page.screenshot({ 
      fullPage: true,
      type: 'png'
    });

    // Save for visual comparison
    require('fs').writeFileSync('./test-screenshots/homepage.png', screenshot);

    expect(screenshot).to.be.instanceOf(Buffer);
  });
});

Alternative: Using Playwright for Screenshots

While Puppeteer is excellent for Chrome-based screenshots, you might also consider Playwright for cross-browser screenshot capabilities. Playwright offers similar functionality with support for multiple browser engines.

Conclusion

Puppeteer provides comprehensive screenshot capabilities for web automation and testing. Whether you need basic page captures, element-specific screenshots, or advanced visual testing workflows, Puppeteer's flexible API can handle your requirements. Remember to implement proper error handling, optimize for performance when taking multiple screenshots, and consider using headless browser automation best practices for production environments.

The key to successful screenshot automation is understanding your specific use case and choosing the appropriate configuration options, wait strategies, and error handling approaches for your application's needs.

Try WebScraping.AI for Your Web Scraping Needs

Looking for a powerful web scraping solution? WebScraping.AI provides an LLM-powered API that combines Chromium JavaScript rendering with rotating proxies for reliable data extraction.

Key Features:

  • AI-powered extraction: Ask questions about web pages or extract structured data fields
  • JavaScript rendering: Full Chromium browser support for dynamic content
  • Rotating proxies: Datacenter and residential proxies from multiple countries
  • Easy integration: Simple REST API with SDKs for Python, Ruby, PHP, and more
  • Reliable & scalable: Built for developers who need consistent results

Getting Started:

Get page content with AI analysis:

curl "https://api.webscraping.ai/ai/question?url=https://example.com&question=What is the main topic?&api_key=YOUR_API_KEY"

Extract structured data:

curl "https://api.webscraping.ai/ai/fields?url=https://example.com&fields[title]=Page title&fields[price]=Product price&api_key=YOUR_API_KEY"

Try in request builder

Related Questions

Get Started Now

WebScraping.AI provides rotating proxies, Chromium rendering and built-in HTML parser for web scraping
Icon