Articles

Getting Started with Puppeteer in JavaScript

Sun Aug 18 2024 · 4 min read
Photo by Boitumelo on Unsplash

As a developer, you’ve probably had moments where you needed to automate repetitive browser tasks, like scraping web data, generating screenshots, or testing web applications. Performing these tasks manually is not only time-consuming but also prone to errors. Fortunately, there’s a nifty tool called Puppeteer that can handle all of this for you with the power of JavaScript.

Puppeteer is a Node library that provides a high-level API to control Chrome or Chromium over the DevTools Protocol. It’s something of a powerhouse in the world of headless browsers, doing everything from taking screenshots and generating PDFs of pages, to automating form submissions and UI testing. Let’s dive into how you can get started with Puppeteer.

What You’ll Need

Before we jump into code, let’s make sure you have everything you need to get started:

If you’ve got these checked off, you’re good to go!

Setting Up Your Project

First, you’ll need to set up a Node.js project if you don’t already have one. Create a new directory for your project and run the following commands:

mkdir puppeteer-demo
cd puppeteer-demo
npm init -y

This will create a new directory called puppeteer-demo and initialize a new Node.js project with default settings.

Next, you’ll need to install Puppeteer:

npm install puppeteer

Puppeteer typically downloads a compatible version of Chromium with it, so it might take a minute to install.

An Easy Introduction: Taking a Screenshot

Let’s jump right in with a simple example: taking a screenshot of a website. Create a new file called screenshot.js and add the following code:

const puppeteer = require("puppeteer")
;(async () => {
    // Launch a new browser instance
    const browser = await puppeteer.launch()

    // Open a new page
    const page = await browser.newPage()

    // Navigate to the desired URL
    await page.goto("https://example.com")

    // Take a screenshot and save it to a file
    await page.screenshot({ path: "example.png" })

    // Close the browser instance
    await browser.close()
})()

To run this script, use the following command in your terminal:

node screenshot.js

You should see a new file named example.png in your project directory. Congrats, you’ve just taken your first screenshot using Puppeteer!

Puppeteer is not just about taking screenshots. You can navigate through pages, mimic user interactions, and extract data. Let’s say you want to pull the title of a page and log it to the console. Modify your script to look like this:

const puppeteer = require("puppeteer")
;(async () => {
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.goto("https://example.com")

    // Extract the title of the page
    const title = await page.title()
    console.log(`Title: ${title}`)

    await browser.close()
})()

Run this with node screenshot.js (or rename it accordingly). You should see the page title displayed in your terminal.

Let’s take it a step further by mimicking user actions. Suppose you want to search for “Puppeteer” on Google and get the first result. Here’s how you could do it:

const puppeteer = require("puppeteer")
;(async () => {
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.goto("https://google.com")

    // Type in the search box
    await page.type("input[name=q]", "Puppeteer")

    // Click the search button
    await Promise.all([
        page.waitForNavigation(), // The promise resolves after navigation has finished
        page.click("input[name=btnK]"), // Click the search button
    ])

    // Get the first result's text
    const firstResult = await page.$eval("h3", (element) => element.textContent)
    console.log(`First result: ${firstResult}`)

    await browser.close()
})()
Photo by Markus Winkler on Unsplash

Automating Form Submissions

Another powerful feature of Puppeteer is its ability to automate form submissions. Suppose you have a login form you need to fill and submit. Here’s how you can do it with Puppeteer:

const puppeteer = require("puppeteer")
;(async () => {
    const browser = await puppeteer.launch({ headless: false }) // Disable headless mode
    const page = await browser.newPage()
    await page.goto("https://example.com/login")

    // Enter username and password
    await page.type("#username", "your-username")
    await page.type("#password", "your-password")

    // Click the login button
    await Promise.all([
        page.waitForNavigation(),
        page.click("#login-button"),
    ])

    console.log("Form submitted")

    await browser.close()
})()

With this script, Puppeteer will open a browser window, navigate to your login page, fill out the form fields, and submit the form just as a human would do.

Taking Full-Page Screenshots

Sometimes you need to take a screenshot of the entire page, not just the visible part. This is also straightforward with Puppeteer:

const puppeteer = require("puppeteer")
;(async () => {
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.goto("https://example.com")

    // Take a full-page screenshot
    await page.screenshot({ path: "fullpage.png", fullPage: true })

    await browser.close()
})()

This script will save a full-page screenshot to fullpage.png.

Generating PDFs

One more neat trick is generating PDFs from web pages:

const puppeteer = require("puppeteer")
;(async () => {
    const browser = await puppeteer.launch()
    const page = await browser.newPage()
    await page.goto("https://example.com")

    // Generate a PDF
    await page.pdf({ path: "example.pdf", format: "A4" })

    await browser.close()
})()

Run this script, and you’ll have a PDF named example.pdf in your project directory.

Wrapping Up

Puppeteer is a versatile and powerful tool that can help you automate a wide range of tasks in the browser. Whether it’s taking screenshots, scraping data, submitting forms, or generating PDFs, Puppeteer has got you covered. And the best part? It’s all done using the language you’re already familiar with—JavaScript.

So go ahead and start experimenting with Puppeteer in your own projects. The possibilities are nearly endless, and you’ll find that many tedious tasks can be automated in just a few lines of code. Happy coding!

Report bugs like it's 2024
Bug reports has looked the same since forever. You try to jam as much detail as possible to avoid the dreaded "can't reproduce". It's time to fix that. Whitespace captures every possible detail automatically and puts it all in a neat little package you can share as link.

Read more

Top 5 Bug Tracking Tools for Agile Teams in 2024

Copy this bug report template into your bug tracking tool and use it as a template for all new bugs. This templates gives you a great foundation to organize your bugs. Read more

Published 4 min read
Getting Started with Puppeteer in PHP

When it comes to web scraping, automated testing, or rendering webpages, many developers turn to powerful tools like Puppeteer. Read more

Published 3 min read
Getting Started with Puppeteer in Python

In today's fast-paced digital landscape, web automation is an essential skill for developers and testers alike. Read more

Published 3 min read
Getting Started with Puppeteer in C#

Web scraping—or extraction—is a critical tool in modern web development, used in gathering data from different web sources. Read more

Published 5 min read
Getting Started with Puppeteer in Java

Automation testing has become an integral part of the development ecosystem. Read more

Published 3 min read
Getting Started with Puppeteer in Node.js

Modern web development often requires testing and automating various web applications and processes. Read more

Published 3 min read
Getting Started with Playwright in PHP

In the fast-paced world of web development, testing is essential to ensure the stability and functionality of applications. Read more

Published 3 min read
Getting Started with Playwright in Python

In the realm of web application development, ensuring that your application works flawlessly across different browsers is no small feat. Read more

Published 3 min read
Getting Started with Playwright in C#

In the fast-evolving world of web development, you need reliable tools for your end-to-end testing to ensure your applications run smoothly across different browsers and environments. Read more

Published 3 min read
Getting Started with Playwright in Java

Modern web development can sometimes feel like a whirlwind of continuous updates and new tools. Read more

Published 5 min read