Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallSome links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
The shortest Ruby solution is Ferrum: start a headless Chrome or Chromium browser, navigate to the page, save a screenshot, and always close the browser. Ferrum speaks Chrome DevTools Protocol (CDP), so it does not require Selenium, WebDriver, or ChromeDriver.
require "ferrum"
browser = Ferrum::Browser.new
browser.go_to("https://example.com")
browser.screenshot(path: "example.png")
browser.quit
This guide expands that script into reliable viewport, full-page, element, format, PDF, test-suite, and deployment workflows, then shows a hosted alternative when maintaining Chrome is unnecessary.
What you need before writing Ruby code
- Ruby: a working Ruby installation and a bundle that includes the
ferrumgem. - Chrome or Chromium: Ferrum controls a locally installed browser. The executable must be on
PATH, or you must provide its path through Ferrum’s browser-path configuration. - Runtime permissions: the process needs permission to launch the browser and write the destination file.
Use an official Chrome or Chromium distribution appropriate for your operating system. In containers and CI, verify the executable path explicitly; a Ruby dependency can be installed correctly while the browser binary is still missing.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →Install Ferrum and capture a first PNG
Add Ferrum to your application’s bundle:
# Gemfile
gem "ferrum"
bundle install
Then create a script such as screenshot.rb:
require "bundler/setup"
require "ferrum"
browser = Ferrum::Browser.new
begin
browser.go_to("https://example.com")
browser.screenshot(path: "example.png")
ensure
browser.quit
end
Ferrum runs headless by default. go_to waits for navigation according to the browser’s loading behavior, and screenshot writes PNG by default. The ensure block matters in production scripts: it closes Chrome even when navigation or file writing raises an exception.
#1 Best Overall
- CRISP CLARITY: This 23.8″ Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
- INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
- THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
- WORK SEAMLESSLY: This sleek monitor is virtually bezel-free on three sides, so the screen looks even bigger for the viewer. This minimalistic design also allows for seamless multi-monitor setups that enhance your workflow and boost productivity
- A BETTER READING EXPERIENCE: For busy office workers, EasyRead mode provides a more paper-like experience for when viewing lengthy documents
Choose the right capture scope
Viewport screenshot
A normal screenshot captures the visible browser viewport. Set the viewport when a repeatable layout is important:
browser = Ferrum::Browser.new(window_size: [1440, 900])
begin
browser.go_to("https://example.com")
browser.screenshot(path: "viewport.png")
ensure
browser.quit
end
Use a fixed size for visual regression tests and documentation. A responsive site may render different navigation, columns, or typography at another width.
Full-page screenshot
Pass the full-page option when the output must include content below the fold:
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →browser.screenshot(path: "entire-page.png", full: true)
Long pages can produce very tall images. If a page uses lazy-loaded images, scroll or otherwise trigger loading before capture; Ferrum’s screenshot API supports full-page capture, but the page itself still has to load content through its normal JavaScript behavior.
Capture one element
When only a component matters, select it rather than cropping a full browser image:
card = browser.at_css(".pricing-card")
card.screenshot(path: "pricing-card.png")
Wait until the selector exists before calling at_css. A missing or dynamically rendered selector is a common source of failures. Element capture is useful for product cards, charts, invoices, and component-level regression tests.
Rank #2
- CRISP CLARITY: This 22 inch class (21.5″ viewable) Philips V line monitor delivers crisp Full HD 1920x1080 visuals. Enjoy movies, shows and videos with remarkable detail
- 100HZ FAST REFRESH RATE: 100Hz brings your favorite movies and video games to life. Stream, binge, and play effortlessly
- SMOOTH ACTION WITH ADAPTIVE-SYNC: Adaptive-Sync technology ensures fluid action sequences and rapid response time. Every frame will be rendered smoothly with crystal clarity and without stutter
- INCREDIBLE CONTRAST: The VA panel produces brighter whites and deeper blacks. You get true-to-life images and more gradients with 16.7 million colors
- THE PERFECT VIEW: The 178/178 degree extra wide viewing angle prevents the shifting of colors when viewed from an offset angle, so you always get consistent colors
Capture a rectangular area
Ferrum also documents screenshots of a specified coordinate area. Use an area when the target is defined by geometry rather than a stable CSS selector; keep the coordinates tied to a fixed viewport so responsive changes do not silently move the crop.
Recommended Free Tools
PNG, JPEG, WebP, and base64 output
PNG is the default and preserves sharp text without introducing lossy artifacts. Ferrum also supports JPEG/JPG and WebP, with quality settings for those formats. A path can be replaced by an in-memory result when your next step needs base64 rather than a file.
browser.screenshot(
path: "hero.webp",
format: :webp,
quality: 82
)
jpeg_data = browser.screenshot(
format: :jpeg,
quality: 88,
encoding: :base64
)
Use PNG for pixel comparisons and screenshots containing fine text. Choose JPEG when a smaller photographic image is more important than exact edges, and WebP when your downstream system accepts it and you want a modern compressed format. Confirm the exact option names against the Ferrum version in your bundle if you upgrade the gem.
Use an explicit page for longer workflows
For one URL, browser.go_to is sufficient. For scripts that interact with a page, create a page object and perform all actions through it:
require "bundler/setup"
require "ferrum"
browser = Ferrum::Browser.new(window_size: [1366, 768])
page = browser.create_page
begin
page.go_to("https://example.com/dashboard")
page.at_css("button.more").click
page.screenshot(path: "dashboard.webp", format: :webp, quality: 85)
ensure
browser.quit
end
A manually created page is the documented interaction pattern. If you create several pages or browser contexts, close them deliberately and retain one top-level cleanup path so a failed job does not leave Chrome processes behind.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemsWait for the page you actually want to capture
Navigation completion does not guarantee that an application has finished rendering. Build waits around observable conditions:
Rank #3
- Clear visuals. Fluid motion: A 144Hz refresh rate and 1ms MPRT deliver smooth, tear‑free motion across work, gaming, and streaming for clearer, more fluid viewing.
- Eye comfort: TÜV Rheinland 3‑star* certification reduces harmful blue light while preserving stunning color quality without compromise. *TÜV Rheinland 3-star eye comfort certification.
- Wide viewing angle: Get consistent views across a wide 178° /178° viewing angle.
- In-Plane Switching (IPS): See excellent color accuracy and consistency across wide viewing angles with In-plane Switching (IPS) technology.
- Ultra-thin bezels: Maximize your viewing experience with thin bezels.
page.go_to("https://example.com/app")
page.at_css("main[data-ready='true']")
page.screenshot(path: "ready.png", full: true)
For sites that do not expose a reliable ready marker, use a deliberate delay sparingly and keep it long enough for the known animation or data request. A selector wait is usually more robust because it tracks the state you need rather than a guessed number of milliseconds. For deterministic captures, disable or account for animations in the page or with test CSS before taking the image.
Generate a PDF instead of an image
Ferrum’s browser automation also provides PDF export. Set paper size, orientation, margins, and page ranges when the deliverable is a document rather than a bitmap:
browser = Ferrum::Browser.new
begin
browser.go_to("https://example.com/invoice")
browser.pdf(
path: "invoice.pdf",
format: "A4",
landscape: false,
margin_top: "12mm",
margin_bottom: "12mm",
margin_left: "10mm",
margin_right: "10mm"
)
ensure
browser.quit
end
PDF layout follows print-oriented browser rules, so test page breaks, backgrounds, and headers separately from image screenshots.
Capybara integration with Cuprite
If screenshots belong inside a Capybara test suite, Cuprite is the natural integration path: it is a pure Ruby Capybara driver built on Ferrum. This lets feature tests navigate and assert through Capybara while retaining Ferrum’s Chrome/CDP approach for browser control. Keep the browser executable and CI launch settings consistent between standalone scripts and test runs.
Production and CI reliability checklist
- Pin your environment: record the Ruby, Ferrum, Chrome/Chromium, and operating-system versions used for visual tests.
- Check the executable: fail early with a clear configuration error if Chrome is not on
PATHand no browser path is supplied. - Use cleanup: wrap every browser lifetime in
begin/ensure. - Control dimensions: set a window size and device scale consistently when comparing images.
- Wait on state: target a loaded selector or application-ready marker instead of relying only on navigation.
- Make output directories: create the destination directory before writing files and use unique names for parallel jobs.
- Expect external variability: third-party ads, fonts, network latency, time-based content, and geolocation can change pixels even when your code is unchanged.
Ferrum’s documentation establishes the available capture modes, but it does not provide a universal performance or visual-fidelity benchmark. Measure your own pages and deployment environment before choosing concurrency or timeout values.
Common errors and fixes
“Browser executable not found”
Cause: Chrome/Chromium is not installed, is not on PATH, or runs under a different user than your local shell. Fix: install an official browser, verify the executable as the same CI user, or set Ferrum’s browser-path configuration explicitly.
Rank #4
- CURVED FOR ENHANCED ENGAGEMENT: An immersive viewing experience with a curved monitor that wraps more closely around your field of vision; It creates a wider view, enhancing depth perception and minimizing peripheral distraction
- SMOOTH PERFORMANCE FOR SEAMLESS CONTENT: Stay in the action when playing games, watching videos, or working on creative projects; The 100Hz refresh rate reduces lag and motion blur so you don't miss a thing in fast-paced moments¹
- MORE GAMING POWER: Gain the edge with optimizable game settings; Color and image contrast can be adjusted to see scenes more vividly and spot enemies hiding in the dark; Game Mode adjusts any game to fill the screen so you can view every detail²
- KEEP IT EASY ON THE EYES: Care for your eyes and stay comfortable, even during long sessions; Advanced eye comfort technology certified by TÜV reduces eye strain by minimizing blue light and reducing irritating screen flicker²
- INCREASED VERSATILITY: Connect to more; Plug devices straight into your monitor for increased flexibility, making your computing environment even more convenient
Navigation times out
Cause: a slow origin, blocked resource, redirect loop, or page that never reaches the expected load state. Fix: test the URL from the capture host, inspect redirects and network dependencies, and configure a suitable timeout. Do not hide a permanently failing origin with an arbitrarily large timeout.
Screenshot is blank or incomplete
Cause: capture occurred before client-side rendering, content is behind a cookie dialog, or lazy assets were never requested. Fix: wait for a page-specific ready selector, perform the required interaction, scroll or trigger lazy loading, then capture.
Selector cannot be found
Cause: the selector is wrong, the component is inside a frame, or rendering is asynchronous. Fix: verify the selector in the same viewport, wait for it, and handle frame context explicitly rather than capturing immediately after navigation.
Files differ between runs
Cause: responsive dimensions, fonts, animations, timestamps, ads, or remote data. Fix: fix viewport settings, wait for fonts and application data, disable animations where appropriate, and stub volatile content in tests.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Or skip the browser setup
ScreenshotNeo is a hosted website screenshot API and MCP server. It accepts a URL in one request and returns PNG, JPEG, WebP, or PDF. Cookie and consent banners are accepted before capture, and more than 60 known consent platforms, newsletter popups, and chat widgets are removed; each cleanup step can be turned off. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status.
With an access key, the smallest call is:
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo documentation for authentication and options. The service also offers full-page capture with lazy images loaded, CSS-selector element capture, dark mode, 12 device presets or custom viewports, retina scale, PDF paper size/margins/orientation/page ranges, HTML/CSS-to-image, custom JavaScript and CSS, pre-capture clicks, hidden selectors, waits for selectors/delay/network idle, request and resource blocking, custom headers/cookies/user agents/Authorization, timezone and geolocation, transparent backgrounds, image resizing, selectable cache TTL, signed image links, asynchronous jobs with signed webhooks, bulk capture for up to 100 URLs per call, a usage API, and an OpenAPI specification. Parameter names used by other screenshot APIs are accepted to ease migration.
An MCP server exposes take_screenshot, get_page_info, and capture_pdf to Claude, Cursor, and other MCP clients, so an AI agent can request captures without a custom Ruby browser harness.
Best Value
- 【INTEGRATED SPEAKERS】Whether you're at work or in the midst of an intense gaming session, our built-in speakers provide rich and seamless audio, all while keeping your desk clutter-free.
- 【EASY ON THE EYES】 Protect your eyes and enhance your comfort with Blue-Light Shift technology. This feature reduces harmful blue light emissions from your screen, helping to alleviate eye strain during long hours of use and promoting healthier viewing habits.
- 【WIDEN YOUR PERSPECTIVE】Our sleek minimal bezel design ensures undivided attention. The nearly bezel-free display seamlessly connects in a dual monitor arrangement, delivering an unobstructed view that lets you focus on more at once, completely distraction-free.
Equivalent Ruby request
require "requests"
Ruby’s standard HTTP libraries or an HTTP gem can call the same endpoint. The API contract is a GET request with access_key and url; save the binary response, and inspect X-Page-Verdict and X-Billed when you need billing diagnostics.
Other client examples
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
ScreenshotNeo’s Free plan includes 1,000 screenshots per month with no card. Paid plans start at $5 for 3,000 shots; every feature is available on every plan. Sign up free to try it without a card.
Frequently Asked Questions
Can Ferrum run without Selenium or ChromeDriver?
Yes. Ferrum communicates with Chrome or Chromium through CDP and does not require Selenium, WebDriver, or ChromeDriver; the browser executable itself is still required.
Should I use an element selector or a coordinate crop?
Prefer a stable CSS selector for a component that has semantic markup. Use a coordinate area only when geometry is the contract and the viewport is fixed.
Why is a full-page image extremely tall?
Full-page mode includes the document below the viewport. For very long pages, capture a specific element or produce a PDF with deliberate page settings instead.
Quick Recap
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.
Free tools Windows power users keep installed
One-click scans. No signup required.

