Blog
Screenshot rendering
min read

How to take website screenshots with Go

Capture website screenshots in Go using Selenium, rod (Puppeteer-like), Playwright, or simplify with Screenshot API as a Service.

Selenium WebDriver for Go

Selenium has been the gold standard in browser automation since the late 2000s. The Go client github.com/tebeka/selenium mirrors WebDriver’s capabilities, enabling interactions with Chrome, Firefox, and more. Though not officially maintained after 2021, the community still leverages it via Dockerized Selenium Grid for cross-browser support.

Install


go get -u github.com/tebeka/selenium

Example


import (
  "io/ioutil"
  "log"
  "github.com/tebeka/selenium"
)

func main() {
  caps := selenium.Capabilities{"browserName": "chrome"}
  wd, err := selenium.NewRemote(caps, "http://localhost:4444/wd/hub")

  if err != nil {
    log.Fatal(err)
  }
  defer wd.Quit()

  wd.Get("https://example.com")
  buf, err := wd.Screenshot()

  if err != nil {
    log.Fatal(err)
  }

  ioutil.WriteFile("selenium.png", buf, 0644)
}

Pros & cons

Selenium for Go gives you the broadest compatibility, allowing testing across multiple browsers via remote WebDriver services. Its API fidelity ensures alignment with mature Selenium workflows. However, relying on a browser + WebDriver stack can be cumbersome, tests can be fragile, and setting up servers, drivers, and handling asynchronous page changes require careful orchestration. Additionally, the Go port hasn’t been updated in years, sometimes lagging behind the latest browser features.

Puppeteer‑Style (rod) in Go

Rod, launched around 2020, offers Go developers a Chrome DevTools Protocol (CDP) wrapper reminiscent of Puppeteer. It’s optimized for headless Chrome/Edge and embraces chainable syntax, smart waiting, and automatic browser downloads.

Install


go get -u github.com/go-rod/rod

Example


import "github.com/go-rod/rod"

func main() {
  browser := rod.New().MustConnect()
  page := browser.MustPage("https://example.com")
  page.MustWaitLoad()
  page.MustScreenshot("rod.png")
}

Pros & cons

With rod, you dodge the overhead of WebDriver,connecting directly via CDP makes setup simpler and faster. Its API is intuitive with built-in wait helpers and full DevTools access. On the flip side, it’s limited to browsers implementing CDP (Chrome, Edge), so if you need cross-browser coverage, rod isn’t sufficient. And being newer, it may occasionally break on Chrome’s evolving behaviors.

Playwright for Go

Born from the creators of Puppeteer, Playwright arrived in Go around 2022, enabling consistent cross-browser automation (Chromium, Firefox, WebKit). It includes intelligent waits, request interception, and a unified API with Playwright-Go.

Install


go get -u github.com/playwright-community/playwright-go

Example


import (
  "log"
  "github.com/playwright-community/playwright-go"
)

func main() {
  pw, err := playwright.Run()

  if err != nil {
    log.Fatal(err)
  }

  browser, _ := pw.Chromium.Launch()
  page, _ := browser.NewPage()
  page.Goto("https://example.com")
  page.Screenshot(playwright.PageScreenshotOptions{
    Path:    playwright.String("playwright.png"),
    FullPage: playwright.Bool(true),
  })
  browser.Close()
  pw.Stop()
}

Pros & cons

Playwright-Go delivers true multi-browser and multi-platform support with robust automation primitives and network control. Its auto-waiting mechanisms help reduce flaky scripts. The tradeoff is larger dependencies and reliance on Playwright’s Go community library rather than an official Microsoft release. It demands slightly more setup and heavier runtime overhead.

Screenshot API Service

Slide into modern simplicity with ScreenshotMAX, an API-first service designed

for effortless screenshot generation. Photo quality rendering, ad-blocking, region-specific views, and no browser infra to maintain make it ideal for scalable, production use.

Install

No Go SDK, use Go’s net/http.

Example


import (
  "io"
  "net/http"
  "os"
)

func main() {
  resp, err := http.Get(
    "https://api.screenshotmax.com/v1/screenshot" +
    "?url=https://example.com&full_page=true&format=png&access_key=YOUR_ACCESS_KEY")

    if err != nil {
      panic(err)
    }
    defer resp.Body.Close()

    out, _ := os.Create("example.com.png")

    io.Copy(out, resp.Body)
    println("Saved screenshot result.")
}

Pros & cons

ScreenshotMAX frees you from browser maintenance,no drivers, no upgrades, no scaling headaches. It delivers quick, reliable screenshots with features like cookie-banner removal built-in. However, it does incur ongoing API costs, requires internet access, and depends on a third-party service and your API key.

Which one should you choose?

If you require full browser automation across multiple engines with deep control, Selenium or Playwright are your best bets. Choose rod when targeting Chrome/Edge and wanting a Puppeteer-like experience with minimal setup.

However, if your goal is to capture hundreds or thousands of screenshots reliably, especially in a production setting, a screenshot API like ScreenshotMAX is a better choice. It handles the infrastructure, parallel processing, and scaling for you, so you don’t have to worry about memory limits, browser crashes, or queueing jobs manually. You just call the API and get your result back quickly, with consistent rendering and high availability. It’s purpose-built for bulk screenshot tasks and large workloads.

Give ScreenshotMAX a test drive

Head to screenshotmax.com, grab your API key, drop in the example above, and watch as you get production-grade screenshots without the infra overhead. Focus your efforts on what matters,your product logic. Happy screenshotting!

Published on

Read more screenshot rendering

Get practical tips, detailed guides, trusted best practices and updates.

Start now

Take website screenshots in minutes
No browser setup, no headaches, no scaling concerns

Complete API for rendering website screenshots, HTML to PDF, animated screenshots, web page scraping, and scheduled screenshots.

No credit card required