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

Use Chrome’s unified Headless mode, not the old Headless mode, when an extension must run during automation. In Puppeteer, load an unpacked extension with enableExtensions, navigate to a permitted target, and verify the content-script, action/popup, and Manifest V3 service-worker paths your workflow depends on. The setup below is suitable for lawful, authorized collection only: browser support does not grant permission to scrape a site.

Can headless Chrome load extensions?

Yes, but the mode matters. Chrome’s extension end-to-end testing guidance says to launch with --headless=new; the old Headless mode does not support loading extensions. Unified Headless is regular Chrome running without a visible window. The older implementation is now distributed separately as chrome-headless-shell (available separately beginning with Chrome 132.0.6793.0), and it is not the documented route for extension testing.

Automation libraries expose different defaults. Puppeteer uses headless: true for Chrome Headless, headless: 'shell' for Headless Shell, and headless: false for a visible browser. Check the installed Chrome and Puppeteer versions and inspect the launch arguments in your environment. If your combination does not select unified Headless, pass the current API’s equivalent of --headless=new explicitly.

Chrome lists Puppeteer, Playwright, Selenium with ChromeOptions, and WebDriverIO as options for extension testing. The examples here use Puppeteer because its current API exposes extension installation and inspection directly.

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.

Before you automate a scrape

  • Confirm that you are authorized to collect the specific pages and data. Review the site’s terms, robots or technical access rules, contracts, privacy obligations, and applicable law for your jurisdiction.
  • Use a current Chrome/Puppeteer pair and pin versions in your project so a browser update does not silently change headless behavior.
  • Have an unpacked extension directory containing its manifest and packaged logic. Test against a staging page or another target for which you have permission.
  • Decide what evidence you need: page content seen by a content script, a user-triggered action or popup, background processing, or all three.

Load an unpacked extension with Puppeteer

Launch-time installation

Install Puppeteer, place your unpacked extension in my-extension, and run this ES module. The enableExtensions array receives filesystem paths, not a ZIP file.

import puppeteer from 'puppeteer';
import path from 'node:path';

const pathToExtension = path.join(process.cwd(), 'my-extension');
const browser = await puppeteer.launch({
  headless: true,
  enableExtensions: [pathToExtension],
  // If your version does not select unified Headless, add the
  // current Puppeteer launch option for --headless=new here.
});

try {
  const page = await browser.newPage();
  await page.goto('https://example.com/', {waitUntil: 'networkidle2'});
  console.log(await page.title());
  // Extract only data your authorization permits.
  const text = await page.locator('body').innerText();
  console.log(text.slice(0, 500));
} finally {
  await browser.close();
}

In a real scraper, replace the URL and extraction logic with selectors that match the permitted target. Do not assume that merely loading an extension causes its action to run on every page; extension permissions, match patterns, and the extension’s own code determine that behavior.

Install at runtime

For tests that install different extensions in one browser session, enable extension support first and install a directory when needed:

const browser = await puppeteer.launch({
  headless: true,
  enableExtensions: true,
});
await browser.installExtension(pathToExtension);
console.log(await browser.extensions());
// ...run checks...
await browser.uninstallExtension('extension-id');

Use the extension ID returned by the installed-extension information. Runtime installation is useful for a test matrix; launch-time loading is simpler for a stable worker.

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.

Verify each extension surface

Content scripts on the navigated page

Navigate normally and wait for the page state your script needs. Puppeteer injects content scripts on navigation according to the manifest. Its page.extensionRealms() API lets you evaluate in the content-script context when you need to inspect extension-side state rather than only the page’s JavaScript world.

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.
await page.goto('https://example.com/', {waitUntil: 'domcontentloaded'});
await page.waitForSelector('main');
const realms = await page.extensionRealms();
// Select the realm associated with your extension, then evaluate
// a small, observable check in that content-script context.

A useful assertion is that the content script can see the rendered element your extraction requires. Keep page extraction and extension-internal assertions separate so a site layout change identifies the failing layer.

Actions and popups

An action or popup is a user-triggered surface, not an automatic page hook. Trigger it through Puppeteer’s extension-action support, then observe or open the popup and assert its visible result. Chrome extension pages use the chrome-extension://<id>/ form. Test the click path your extension actually exposes instead of assuming a default popup file.

Manifest V3 service workers

Manifest V3 replaces a permanently running background page with a service worker. Puppeteer documents waiting for a service_worker target:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
const workerTarget = await browser.waitForTarget(
  target => target.type() === 'service_worker' &&
    target.url().startsWith('chrome-extension://')
);
const worker = await workerTarget.worker();
console.log('service worker ready:', Boolean(worker));

The worker may start only when an event requires it and may stop afterward. Design scraping work around events, alarms, messages, and resumable jobs. Persist state that must survive a worker shutdown; never rely on a continuously awake background context.

Manifest V3 constraints that affect scraping extensions

Package executable behavior

Manifest V3 and Chrome Web Store policy require extension functionality to be discernible from submitted code and prohibit remotely hosted executable code in ordinary extension logic. Common violations include loading a remote script, executing fetched strings with eval(), or using an interpreter for remote commands.

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.

You may fetch remote data or configuration in circumstances allowed by policy, but keep executable selectors, parsers, and control flow packaged. If a server supplies selectors, treat them as inert data and validate them; do not turn the extension into a remote-code loader. Recheck current Chrome policy before distributing an extension.

Event-driven extraction

Send a message from the content script when the page is ready, let the service worker coordinate storage or queuing, and make every operation safe to retry. Record the URL, extraction version, and completion state so a worker restart does not duplicate or lose results.

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

Reliable scraping workflow

  1. Start the correct browser. Confirm unified Headless and log the Chrome/Puppeteer versions.
  2. Load the unpacked extension. Use enableExtensions: [path] or runtime installation.
  3. Navigate and wait deliberately. Prefer a meaningful selector, a known application state, or a bounded delay over an arbitrary long sleep.
  4. Trigger extension behavior. Exercise content scripts, actions/popups, and the service worker independently.
  5. Extract and persist. Save structured output, status, and errors after each page so retries are safe.
  6. Close cleanly. Close pages and the browser in a finally block and remove temporary profiles.

Troubleshooting

“Extension failed to load”

Check that the path points to the directory containing manifest.json, that the manifest is valid, and that the process can read every file. Use an absolute path and test the same directory in visible Chrome.

The extension is absent in headless mode

You are likely using old Headless or Headless Shell. Select unified mode with --headless=new (or the current Puppeteer setting that produces it), then verify the actual command line and browser version.

The content script never runs

Check manifest match patterns, host permissions, navigation timing, frames, and whether the target is a restricted Chrome page. Navigate to an ordinary permitted HTTPS page and wait for a distinctive selector before asserting.

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

No service-worker target appears

MV3 workers are lazy. Trigger the event that starts the worker, then wait with a timeout. Confirm the manifest declares a background service worker and inspect extension errors in a visible debugging run.

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

Popup tests hang

Actions may require an explicit trigger and the popup can close when focus changes. Assert the action state, open the popup through the library’s documented mechanism, and perform assertions before navigating elsewhere.

Results differ between runs

Control viewport, timezone, locale, permissions, cookies, and network readiness. Record the extension version and use a fresh profile when isolation matters. Do not interpret a successful launch as proof that a target permits collection.

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

Performance, reliability, and cost decisions

These official extension-testing references do not establish scraping throughput, evasion rates, site compatibility, or operating cost comparisons between Puppeteer, Playwright, Selenium, and WebDriverIO. Choose based on the API surface and operational controls you need, then measure your own authorized workload. Keep concurrency within the target’s rules, cap navigation and worker timeouts, retry only transient failures, and cache results where permitted.

Or skip the browser setup

For a plain website screenshot rather than an extension-driven extraction workflow, ScreenshotNeo provides a one-call screenshot API and MCP server. It removes cookie banners, newsletter popups, and chat widgets before capture; bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, with the result identified by X-Page-Verdict and X-Billed headers. AI agents can use its MCP tools—take_screenshot, get_page_info, and capture_pdf.

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

Use the documented parameters and options, including full-page capture, CSS-selector elements, device presets, custom CSS/JavaScript, waits, headers, cookies, blocking rules, PDF settings, caching, signed links, asynchronous webhooks, bulk capture, and usage reporting. Every feature is on every plan: 1,000 screenshots per month are free with no card; paid plans start at $5 for 3,000 shots. See the ScreenshotNeo documentation.

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.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
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}`);

Sign up for the free ScreenshotNeo plan with 1,000 screenshots a month and no card.

Legal and operational boundary

Neither Chrome’s testing guidance nor Puppeteer’s extension API determines whether a particular site, dataset, jurisdiction, or purpose permits automated collection. Obtain the needed authorization and apply data-minimization, retention, and access controls before running a production scraper.

Frequently Asked Questions

How do I load a Chrome extension in headless Chrome?

Run unified Chrome Headless with --headless=new and load the unpacked directory through Puppeteer’s enableExtensions option.

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

Does headless Chrome support Chrome extensions?

Unified/new Headless supports the documented extension-testing workflow; Chrome’s old Headless mode does not support loading extensions.

Can Manifest V3 extensions keep a background process running continuously?

No. Their background context is a service worker that starts when needed, so durable state and retry-safe event handling are required.

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.