Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

To take a screenshot in Go, use chromedp: create a browser context, navigate with chromedp.Navigate, run the screenshot action that matches your target, and write the returned bytes with os.WriteFile. Use Screenshot for one DOM element, CaptureScreenshot for the current viewport, and FullScreenshot for the page beyond the initial viewport.

What chromedp captures

chromedp drives a browser that supports the Chrome DevTools Protocol. The browser runs headless by default, so the examples below do not require a visible window. Every action writes image data into a []byte buffer; your Go program decides whether to save, upload, hash or otherwise process those bytes.

Need Action Result
One DOM element chromedp.Screenshot(selector, &buf, chromedp.NodeVisible) The first element matching the selector.
Visible viewport chromedp.CaptureScreenshot(&buf) The browser viewport currently on screen.
Entire page chromedp.FullScreenshot(&buf, quality) The full page, including content below the initial viewport.

These actions are not interchangeable. Decide whether your output is a component image, a viewport snapshot or a page-length document before choosing the action.

Prerequisites and installation

Install the Go package

Inside your module, run:

go get -u github.com/chromedp/chromedp

Use a Go toolchain and a browser installation suitable for your deployment. chromedp communicates through the Chrome DevTools Protocol, so a compatible Chrome or Chromium executable must be available where the program runs. The sources do not define one universal version matrix; when reproducibility matters, verify the package documentation and the browser version in your own build image.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Elebase USB to USB C Adapter for iPhone 18 Pro Max,USBC Car Charger Adapter
  • Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
  • Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
  • Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
  • Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
  • 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.

Understand headless execution

Chrome is headless by default in the project’s normal setup. That is useful for CI and servers, but it also means you will not see a window while debugging. If you need a visible browser, review chromedp’s allocator and browser-launch options for your installed version rather than assuming a desktop environment exists.

Minimal Go example: capture an element

This complete program navigates to a page, captures the first visible element matching h1, and saves the returned bytes. Replace the URL and selector with values from the page you automate.

package main

import (
    "context"
    "log"
    "os"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    browserCtx, cancelBrowser := chromedp.NewContext(context.Background())
    defer cancelBrowser()

    ctx, cancel := context.WithTimeout(browserCtx, 60*time.Second)
    defer cancel()

    var image []byte
    err := chromedp.Run(ctx,
        chromedp.Navigate("https://example.com"),
        chromedp.Screenshot("h1", &image, chromedp.NodeVisible),
    )
    if err != nil {
        log.Fatal(err)
    }

    if err := os.WriteFile("element.png", image, 0644); err != nil {
        log.Fatal(err)
    }
}

Screenshot selects the first match. chromedp.NodeVisible asks for a visible node, which prevents an off-screen or hidden match from being treated as the intended result. The selector in this example is deliberately simple; use a stable class, ID or attribute from your own markup.

Capture the current viewport

Use CaptureScreenshot when you want exactly what the browser viewport currently shows. It does not extend the image to include content below the fold.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Anker USB-C Hub, 5-in-1 USB Hub for Laptops, 4K HDMI Multiport Adapter
  • 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
  • 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
  • Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
  • 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
  • What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
package main

import (
    "context"
    "log"
    "os"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    browserCtx, cancelBrowser := chromedp.NewContext(context.Background())
    defer cancelBrowser()

    ctx, cancel := context.WithTimeout(browserCtx, 60*time.Second)
    defer cancel()

    var image []byte
    err := chromedp.Run(ctx,
        chromedp.Navigate("https://example.com"),
        chromedp.CaptureScreenshot(&image),
    )
    if err != nil {
        log.Fatal(err)
    }

    if err := os.WriteFile("viewport.png", image, 0644); err != nil {
        log.Fatal(err)
    }
}

The output reflects the viewport configured for that browser context. If a responsive layout is important, make the viewport part of your controlled test environment and keep it consistent between runs.

Capture a full page and choose the correct format

FullScreenshot captures beyond the initially visible region. Its quality argument is an inclusive value from 0 through 100. A quality of 100 produces PNG; every other value produces JPEG. Match the filename to that rule.

Full-page PNG

package main

import (
    "context"
    "log"
    "os"
    "time"

    "github.com/chromedp/chromedp"
)

func main() {
    browserCtx, cancelBrowser := chromedp.NewContext(context.Background())
    defer cancelBrowser()

    ctx, cancel := context.WithTimeout(browserCtx, 90*time.Second)
    defer cancel()

    var image []byte
    err := chromedp.Run(ctx,
        chromedp.Navigate("https://example.com"),
        chromedp.FullScreenshot(&image, 100),
    )
    if err != nil {
        log.Fatal(err)
    }

    if err := os.WriteFile("full-page.png", image, 0644); err != nil {
        log.Fatal(err)
    }
}

Full-page JPEG

err := chromedp.Run(ctx,
    chromedp.Navigate("https://example.com"),
    chromedp.FullScreenshot(&image, 90),
)
if err != nil {
    log.Fatal(err)
}
if err := os.WriteFile("full-page.jpg", image, 0644); err != nil {
    log.Fatal(err)
}

Do not copy an example that passes quality 90 while naming the output .png: the API documentation says that non-100 quality selects JPEG, and the extension is not established as being corrected automatically.

Selectors, page state and changing sites

Validate the selector

The official example uses selectors such as img.Homepage-logo, but example sites and their markup change. Treat those selectors as demonstrations, not permanent fixtures. Inspect the target page and test the selector against the exact version you deploy against.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #3
Sale
Anker USB C Hub, 7in1 Multi-Port USB Adapter, 4K@60Hz USBC to HDMI Splitter
  • Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
  • Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
  • Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
  • Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
  • What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.

Capture after navigation

Put chromedp.Navigate before the screenshot action in the same chromedp.Run call. For pages that render important content asynchronously, make your workflow wait for the page state your application requires before capturing; otherwise a technically successful screenshot can contain an incomplete render. The exact synchronization action depends on the page and the chromedp version you use.

Element-capture differences

The package documentation notes that element screenshots can differ from Chrome’s own node-capture command because chromedp does not send every related DevTools command. If an element image has unexpected bounds, clipping or scaling, compare the selector and browser state first, then consult the API notes for the behavior of your installed version rather than assuming pixel identity with another capture path.

Reusable helper for multiple screenshots

For a small service, keep the browser context alive for a batch of captures while applying a deadline to each job. The helper below shows the common element path and returns bytes to the caller.

package screenshot

import (
    "context"
    "time"

    "github.com/chromedp/chromedp"
)

func Element(ctx context.Context, url, selector string) ([]byte, error) {
    jobCtx, cancel := context.WithTimeout(ctx, 60*time.Second)
    defer cancel()

    var image []byte
    err := chromedp.Run(jobCtx,
        chromedp.Navigate(url),
        chromedp.Screenshot(selector, &image, chromedp.NodeVisible),
    )
    if err != nil {
        return nil, err
    }
    return image, nil
}

Callers can persist the returned bytes with os.WriteFile or stream them to object storage. Keep the timeout finite so a failed navigation cannot occupy a worker indefinitely. Choose a longer deadline for unusually heavy pages, but treat that as an operational decision rather than a universal value.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #4
Sale
UGREEN USB to USB C Adapter Combo 4-Pack, 10Gbps USB C Converter Space Gray
  • Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
  • Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
  • Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
  • Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
  • Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft

Troubleshooting common failures

Symptom Likely cause Fix
Browser fails to start No compatible Chrome/Chromium executable or an unsuitable server environment. Install or expose a compatible browser in the runtime, then verify the deployed browser and chromedp versions together.
Context deadline exceeded Navigation or rendering did not finish before your timeout. Check the URL from the same host, inspect network restrictions, and increase the deadline only when the page genuinely needs more time.
“No node found” or an empty element result The selector is wrong, the site changed, or the first match is not present/visible yet. Recheck the selector in the live page and ensure the capture runs after the required page state is reached.
Image is only the top of the page CaptureScreenshot captures the viewport, not the full document. Use FullScreenshot when content below the fold is required.
File extension and bytes disagree Quality was set below 100 while the filename ends in .png. Use quality 100 for PNG, or rename the output to .jpg/.jpeg for any other quality.
Live example no longer works The external site changed its HTML, selector or loading behavior. Use the example only as a pattern and substitute a selector verified against your target.

Performance, reliability and operational notes

  • Browser automation has startup and rendering work that a direct image transform does not. Measure your own pages; the reviewed documentation does not provide a universal throughput benchmark.
  • Use context cancellation for every job and handle both chromedp.Run and file-write errors. A successful browser action does not guarantee that persistence succeeded.
  • Keep output format intentional. PNG preserves lossless output, while JPEG quality below 100 reduces size at the cost of compression artifacts.
  • External pages are moving targets. Pin your own application’s selectors and validate them in CI or a staging environment before relying on screenshots for visual tests.
  • For reproducible builds, record the Go dependency version and browser version you deploy. The available documentation does not establish one current compatibility matrix for every combination.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

FAQ

Does chromedp upload the screenshot anywhere?

No upload occurs in these examples. The action places encoded image bytes in your Go slice; your program controls any subsequent storage or transfer.

Can I use the same byte buffer for several captures?

Yes. Declare a buffer for each action or reset/reassign it before the next call, then save or process each result before it is replaced. Separate files make it easier to diagnose which navigation produced an image.

Or skip the browser setup

If you need a hosted screenshot API instead of managing a local Chrome runtime, ScreenshotNeo is the first option to try: it removes common consent banners, popups and chat widgets before capture, bills only clean shots, and its paid entry plan is $5 for 3,000 shots.

One GET request returns PNG, JPEG, WebP or a PDF. See the ScreenshotNeo API documentation for the complete parameter list.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

cURL

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python

import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"},
    timeout=90,
)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`Screenshot failed: ${res.status}`);
const bytes = Buffer.from(await res.arrayBuffer());
require('fs').writeFileSync('shot.webp', bytes);

ScreenshotNeo removes more than 60 known consent platforms along with newsletter popups and chat widgets; each cleanup step can be disabled. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads and cache hits cost nothing, and response headers identify the page verdict and whether the request was billed. Its MCP server exposes take_screenshot, get_page_info and capture_pdf to Claude, Cursor and other MCP clients.

Best Value
Anker USB C Hub, 5-in-1 USBC to HDMI Splitter with 4K Display
  • 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
  • Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
  • Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
  • HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
  • What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.

All features are included on every plan. The Free plan provides 1,000 shots per month with no card; Starter is $5 for 3,000, Growth $15 for 15,000, Pro $39 for 60,000, Scale $99 for 250,000 and Business $249 for 1,000,000. Yearly billing gives two months free. After creating an account, you can also use full-page capture, element selectors, device presets, retina scale, PDF settings, custom CSS and JavaScript, clicks, waits, request blocking, headers, cookies, user agents, authorization, timezone, geolocation, transparent backgrounds, resizing, chosen cache TTLs, signed image links, asynchronous webhooks, bulk capture of up to 100 URLs per call, usage reporting and the OpenAPI specification.

Create a free ScreenshotNeo account to get 1,000 screenshots a month without adding a card.

Frequently Asked Questions

What happens if a page’s HTML changes after deployment?

A selector-based capture can stop matching or select a different element. Keep selectors under version control and validate them against the deployed page, especially when capturing third-party sites.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Which action should I use for a screenshot of a component?

Use chromedp.Screenshot with a selector when the output should contain one DOM element; use CaptureScreenshot or FullScreenshot only when the required scope is the viewport or whole document.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.