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.

The simplest Clojure approach is Etaoin, a WebDriver client. Start a headless Chrome session, navigate to the URL, and call etaoin.api/screenshot with a PNG path:

(require '[etaoin.api :as e])

(e/with-chrome-headless driver
  (e/go driver "https://example.com")
  (e/screenshot driver "target/page.png"))

Etaoin creates missing parent directories for the destination. You still need a compatible browser and WebDriver installed. The normal call captures the current browser view; element and full-page captures require separate handling.

What you need before writing Clojure code

  • Clojure 1.10 or newer and JDK 11 or newer, as specified in Etaoin’s user guide.
  • Etaoin in your project dependencies (the guide shows [etaoin "1.1.43"]; check project releases before pinning a version).
  • A supported browser and its WebDriver executable. Common executable names are chromedriver, geckodriver, safaridriver, and msedgedriver.
  • A writable working directory for the output file.

Etaoin is a pure Clojure implementation of the WebDriver protocol. Its project documentation describes support for Chrome, Firefox, Safari, and Edge, plus local or remote WebDriver processes. The guide’s test-coverage table lists Chrome and Firefox on Linux, macOS, and Windows; Safari on macOS; and Edge on macOS and Windows. Treat that as documented project coverage, not a promise for every browser release.

Chrome, Firefox, and Edge can run headlessly. The guide noted in August 2024 that Safari did not support headless mode; verify that status if your environment depends on Safari.

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

Install Etaoin and choose a driver

Leiningen

:dependencies [[etaoin "1.1.43"]]

deps.edn

{:deps {etaoin/etaoin {:mvn/version "1.1.43"}}}

Use the version shown by the current Etaoin documentation or repository when you create a new project. Installing the Clojure library does not install Chrome, Firefox, Edge, Safari, or a driver executable. Put the driver on PATH, or configure its location according to your browser and WebDriver setup. A driver/browser mismatch commonly fails before any page is loaded.

Take a basic page screenshot

This is the minimal, runnable pattern from the Etaoin guide:

(require '[etaoin.api :as e])

(e/with-chrome-headless driver
  (e/go driver "https://example.com")
  (e/screenshot driver "target/page.png"))

with-chrome-headless starts and closes a headless Chrome session around the body. e/go navigates the driver. e/screenshot writes a PNG and accepts either a string path or a java.io.File. Etaoin’s API documentation says missing parent directories are created automatically and that the function throws if the screenshot is empty.

A relative path is resolved from the Clojure process’s working directory. To make the location explicit, use an absolute path or print the path your build or test runner uses.

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

Using a Java File object

(require '[clojure.java.io :as io]
         '[etaoin.api :as e])

(e/with-chrome-headless driver
  (e/go driver "https://example.com")
  (e/screenshot driver (io/file "target" "page.png")))

Wait for dynamic content before capturing

Navigation finishing does not mean a single-page application, images, charts, or API-driven components have finished rendering. Wait for a meaningful condition before calling e/screenshot. Etaoin provides wait functions and load-strategy controls; select a condition that represents the state you actually need rather than assuming every asynchronous task is complete.

For example, your application might render a report container after its data request completes. Wait for that element, then capture. The exact selector and wait expression depend on the page and Etaoin version, so use the wait forms documented for your installed release. A fixed delay can be useful for a page with no reliable selector, but it is slower and less deterministic than waiting for a specific state.

Make captures repeatable

  • Use a fixed viewport and browser version in CI when pixel comparisons matter.
  • Set the same locale, timezone, authentication state, and test data for every run.
  • Wait for fonts, images, and application content that affect the pixels you compare.
  • Save each result to a unique or deliberately overwritten path so stale files cannot be mistaken for a new capture.

Capture one element instead of the whole viewport

Use e/screenshot-element when you need a queried element rather than the visible browser viewport:

(require '[etaoin.api :as e])

(e/with-chrome-headless driver
  (e/go driver "https://example.com")
  ;; Replace the selector with an element on the page.
  (e/screenshot-element driver {:css ".hero"} "target/hero.png"))

The API form is (screenshot-element driver q file), where q is an Etaoin query and file is the PNG destination. The user guide documents element screenshots for Chrome and Firefox and warns that the feature was not available for other browsers at the time of that guide. Confirm support with your browser/driver combination before building a cross-browser workflow.

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

Viewport versus full-page screenshots

The ordinary screenshot call should be treated as a capture of the currently visible page. It is not safe to assume that it automatically stitches the entire scrollable document. WebDriver screenshot behavior is partly browser- and driver-dependent, and Selenium describes non-conformant implementations as best effort.

Full-page capture therefore needs an explicit plan:

  • Check whether your exact browser and driver implement document-sized screenshots.
  • If they do not, use browser-specific scrolling and stitching code, and test pages with fixed headers, lazy images, and sticky elements.
  • Alternatively, use an automation API with an explicit full-page option. Playwright, for example, documents a fullPage option and locator screenshots, with PNG, JPEG, and WebP output and device-pixel scaling controls.

Do not label a viewport PNG as a full-page image. For long pages, verify the final image dimensions and inspect the top, middle, and bottom for missing lazy-loaded content.

Browser and operating-system choices

Chrome, Firefox, and Edge

These browsers are practical choices for server-side jobs because the guide documents headless operation. Their WebDriver executable must be compatible with the installed browser. In containers and CI, install both explicitly and expose the driver on PATH or configure its location.

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

Safari

Safari is listed for macOS in Etaoin’s documented coverage. The August 2024 guide note says Safari did not support headless mode, so a visible macOS session may be required. That is an operational constraint for Linux CI and remote servers.

Remote WebDriver

Etaoin can connect to a remote WebDriver process. This lets a separate machine own the browser, which can simplify centralized browser management, but it adds network authentication, latency, and version-coordination concerns. Keep the browser and driver versions aligned on the machine that actually launches the session.

Useful capture decisions

Need Etaoin approach Important qualification
Visible page e/screenshot Captures the current viewport; scope depends on browser/driver behavior.
One component e/screenshot-element Guide documents Chrome and Firefox support at the time described.
Entire document Browser-specific full-page implementation or another API Do not assume standard WebDriver capture stitches the document.
Server or CI execution Headless Chrome, Firefox, or Edge Install and version-match the browser and WebDriver.
Managed rendering Hosted screenshot API Trades local browser maintenance for service limits and network dependence.

Common failures and fixes

“Driver not found” or connection errors

The executable is absent, not on PATH, or configured for a different location. Install the driver for the browser you selected, verify the executable name, and test that the account running Clojure can execute it.

Session creation fails immediately

A browser/driver mismatch is the usual cause. Check both versions, remove stale drivers from PATH, and ensure the browser is installed in the environment where the code runs.

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

The file is missing

Inspect the process working directory and output path. Etaoin creates missing parent directories, but the process still needs write permission. Use an absolute path while diagnosing.

The screenshot is blank or Etaoin reports an empty image

The page may not have loaded, the browser may have crashed, or the driver returned no image. Navigate to a simple page first, verify the session remains alive, wait for required content, and check the browser/driver logs.

Content is missing

Wait for the selector or application state that proves rendering is complete. Lazy images may require scrolling or page-specific logic. A navigation event alone does not guarantee that client-side rendering has finished.

Full-page output is clipped

That behavior is consistent with browser-dependent screenshot scope. Test the actual browser/driver pair, then implement a documented full-page method or switch to a tool with an explicit full-page option.

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.

Headless output differs from desktop output

Fonts, viewport dimensions, GPU behavior, locale, and timing can change pixels. Fix those inputs in CI and compare screenshots only after the page reaches the same ready state.

Alternatives when Etaoin is not the right fit

The Etaoin guide names Wally as a Clojure Playwright wrapper and clj-chrome-devtools as a Clojure API for remote Chrome DevTools control. Selenium, Playwright, and Puppeteer are additional browser-automation choices. Compare them on Clojure integration, browser coverage, element versus viewport versus full-page behavior, local or remote browser management, and operational complexity. Available documentation does not establish a complete, current feature matrix, so validate the specific capability you need.

A hosted service such as Urlbox is another option when you prefer API-managed rendering instead of maintaining browsers and WebDrivers. Its Clojure tutorial uses Etaoin and notes that full-page screenshots can require browser-dependent code. Check its current capabilities, pricing, and terms directly before adopting it.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

ScreenshotNeo is a hosted website screenshot API and MCP server. One GET request returns PNG, JPEG, WebP, or PDF. It accepts cookie and consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be disabled. Bot checks and CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing result.

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

For Clojure projects, call the HTTP endpoint from your preferred client. The API parameter names commonly used by other screenshot services also work, which can simplify migration.

(require '[clj-http.client :as http])

(def response
  (http/get "https://api.screenshotneo.com/v1/shot"
            {:query-params {:access_key "YOUR_API_KEY"
                            :url "https://example.com"}
             :as :byte-array
             :throw-exceptions false
             :socket-timeout 90000
             :connection-timeout 90000}))

(spit "target/page.webp" (:body response))

See the ScreenshotNeo documentation for authentication, output and option details. The service supports full-page capture with lazy images loaded, CSS-selector element capture, dark mode, 12 device presets or any viewport, retina scale, PDF paper size/margins/landscape/page ranges, custom CSS and JavaScript, pre-capture clicks, hidden selectors, selector/delay/network-idle waits, ad/tracker/request/resource blocking, custom headers/cookies/user agent/Authorization, timezone and geolocation, transparent backgrounds, resizing, chosen cache TTLs, signed image links, asynchronous jobs with signed webhooks, up to 100 URLs per bulk call, a usage API, and an OpenAPI specification. An MCP server provides take_screenshot, get_page_info, and capture_pdf tools to Claude, Cursor, and other MCP clients.

Plan Included screenshots per month Price
Free 1,000 $0, no card
Starter 3,000 $5
Growth 15,000 $15
Pro 60,000 $39
Scale 250,000 $99
Business 1,000,000 $249

Yearly billing provides two months free, and every feature is available on every plan. Cookie banners, popups, and chat widgets are removed before the shot; bot checks, blank pages, and failed loads are never billed. You also get 1,000 screenshots a month free with no card, while paid plans start at $5 for 3,000. Create a free ScreenshotNeo account.

Cost, reliability, and security considerations

  • Local Etaoin has no per-screenshot service charge, but you pay in browser CPU, memory, startup time, maintenance, and CI complexity.
  • Hosted capture removes driver maintenance but depends on network availability, API authentication, service limits, and the target site’s accessibility.
  • Do not place API keys in source code or client-side JavaScript. Store them in environment variables or a secret manager.
  • Authenticated pages may require cookies, headers, or a controlled test account. Avoid capturing confidential data into shared artifacts.
  • Use caching deliberately. It improves repeatability and speed, but a cached image may not represent the current page.

Frequently Asked Questions

Does Etaoin save screenshots as JPEG or WebP?

The documented e/screenshot and screenshot-element calls save PNG files. Choose another tool or conversion step when JPEG or WebP output is required.

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

Can I run this on a machine without a graphical desktop?

Yes, with a browser that supports headless operation, such as Chrome, Firefox, or Edge in the documented guide. Safari was noted as non-headless in August 2024.

Why is my image only the visible portion of a long page?

A normal WebDriver screenshot is not a portable full-document stitch. Full-page behavior depends on the browser and driver; use a tested browser-specific method or an API with an explicit full-page option.

Where should I look when a page needs login or custom headers?

Use browser automation to establish the session, or a service that accepts cookies and headers. Keep credentials out of code and restrict captured artifacts to the intended audience.

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.

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