invisible_selenium is a free, open source data extraction & web scraping project written in Python and released under MIT. It has 1,965 GitHub stars, 277 forks and 0 open issues, and was last pushed 2 hours ago. On this registry it ranks #75 of 137 tracked projects in Data Extraction & Web Scraping, with 5 head-to-head comparisons available.

What is invisible_selenium?

invisible_selenium is a Python package for web scrapers and browser-automation engineers who want Selenium's existing API to run on an anti-detect Firefox that anti-bot systems do not flag as automated.

What it is

invisible_selenium is a Python library in the Data Extraction & Web Scraping space, released under the MIT licence, that replaces Selenium's browser stack with an anti-detect build of Firefox patched at the C++ source level. It keeps Selenium's API intact — webdriver, By, WebDriverWait and expected_conditions all work as before — so switching means changing the import path from selenium to invisible_selenium and nothing else. The project implements Selenium's API itself rather than depending on it, and it also ships a companion CLI (invisible-selenium) for fetching and versioning the patched engine.

The concrete problem it addresses is that ordinary Selenium sessions are scored by anti-bot systems such as reCAPTCHA, hCaptcha and Cloudflare Turnstile and consequently produce captchas or blocks. Two checks drive that scoring: whether the driver is a real browser, and whether a real person appears to be using it. Because the fingerprint — navigator, screen, GPU/WebGL, canvas, fonts, audio, WebRTC, timezone and network — is set inside the engine rather than injected into the page, and because there is no geckodriver or Marionette (so navigator.webdriver is never turned on and there is no JavaScript shim for a page to find), the first check passes. Humanized driver actions, in which every click, hover and drag follows a natural mouse path with human timing and input travels through the browser's real input path so the page receives trusted events, address the second check.

Key capabilities

  • Every session receives a distinct fingerprint across roughly 200 fields covering GPU, audio, fonts, screen and more.
  • A seed argument makes the fingerprint reproducible: the same seed yields the same fingerprint on every run, and driver.seed can be logged to replay a run.
  • Headless and headed modes report the same fingerprint values, and pin={"screen.width": 2560, "screen.height": 1440} forces specific fields while the rest stay seed-derived.
  • Proxy support covers socks5, socks4, http and https with optional username and password, DNS routed through the proxy, and a timezone argument that defaults to the proxy's exit IP.
  • profile_dir="./profile" preserves cookies and storage between runs, and FirefoxOptions including -headless behave as they do in Selenium.
  • The invisible-selenium fetch command downloads the patched Firefox with sha256 verification, re-checks every cached engine and prints its path; invisible-selenium version reports wrapper, core and engine versions.
  • pin fields are documented alongside invisible_playwright's pinning reference, which shares the same engine.

Who uses it and how

  • Teams with existing Selenium codebases migrate by changing only the import, retaining webdriver, By, WebDriverWait and expected_conditions without rewriting tests or scrapers.
  • Scraping pipelines that need session persistence set profile_dir so cookies and storage survive between runs of the same driver.
  • Operators routing traffic through residential or datacenter exit nodes supply a socks5/http proxy and get timezone and DNS aligned with the exit IP automatically.
  • Analysts debugging a fingerprint mismatch pin specific fields such as screen.width and log driver.seed to replay a run with an identical fingerprint.
  • Environments running headless automation where a hidden desktop with real rendering is required, since headless and headed produce the same fingerprint.

Getting started

Install with pip install invisible-selenium, then run python -m invisible_selenium fetch for a one-time sha256-verified download of the patched Firefox. Python 3.11 or newer is required, on Windows x86_64/ARM64 or Linux x86_64/arm64.

How it compares

Among similar tools named in the project's own documentation, invisible_selenium is one member of a family sharing the same engine: invisible_playwright uses Playwright's API, invisible_puppeteer uses Puppeteer's API in Python, invisible_playwright_mcp exposes the engine to AI agents over MCP, and invisible_core turns a seed into a fingerprint and then into Firefox preferences, pinned to an exact version here. It differs from those siblings specifically by preserving Selenium's API rather than another automation framework's.

When to use it — and when not

The self-hoster or operator runs the driver, the proxy, the profile directory and the downloaded engine, and must not install Selenium alongside the package, because invisible_selenium already implements that API. It is a poor fit for teams that need geckodriver, Marionette or non-Firefox browsers, since none are present, and for platforms outside Windows x86_64/ARM64 and Linux x86_64/arm64. The project's dependence on an exact version of invisible_core and on hand-patched C++ sources means engine updates and rebuilds are a maintenance consideration.

project readme (upstream, from github) — read inline
invisible_selenium, Selenium's API on an anti-detect Firefox. An animation: the import that changes, the fingerprint set inside the engine, a mouse that moves like a hand, and the options for a reproducible run.

Selenium gets caught by anti-bots and captchas.
This one runs on an anti-detect Firefox with an undetected fingerprint, compatible with your existing Selenium code.

How it works

Anti-bots ask two questions, and reCAPTCHA, hCaptcha and Cloudflare Turnstile score the answers. invisible_selenium answers yes to both.

1. Is this a real browser? Yes. It is Firefox, patched at the C++ source level.

  • The browser fingerprint is set inside the engine, not injected into the page: navigator, screen, GPU/WebGL, canvas, fonts, audio, WebRTC, timezone, network. Headless or headed, the same values either way.
  • No geckodriver and no Marionette, so nothing turns navigator.webdriver on, and no JavaScript shim for a page to find.

2. Is a real person using it? Yes. The actions are humanized in the driver.

  • Every click, hover and drag follows a natural mouse path with human timing, no teleporting cursor.
  • Input goes through the browser's real input path, so the page sees trusted events.

Install

pip install invisible-selenium
python -m invisible_selenium fetch      # one-time download of the patched Firefox, sha256-verified

Requires Python 3.11 or newer. Supported platforms: Windows x86_64 / ARM64 (the x86_64 engine, under Windows' own emulation), Linux x86_64 / arm64.


Usage

Selenium's API, with no code changes. The same webdriver, By, WebDriverWait and expected_conditions. If you already use Selenium, switching is the import:

- from selenium import webdriver
- from selenium.webdriver.common.by import By
+ from invisible_selenium import webdriver
+ from invisible_selenium.webdriver.common.by import By
from invisible_selenium import webdriver
from invisible_selenium.webdriver.common.by import By
from invisible_selenium.webdriver.support.ui import WebDriverWait
from invisible_selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("https://example.com")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.TAG_NAME, "a"))).click()  # the mouse arcs to the link
print("seed =", driver.seed)   # log it to replay the run
driver.quit()

Every session gets a distinct fingerprint (GPU, audio, fonts, screen, ~200 fields). Do not install Selenium alongside it: this package already implements its API.

Options

driver = webdriver.Firefox(
    seed=42,                        # same seed, same fingerprint, every run
    proxy={"server": "socks5://host:1080", "username": "u", "password": "p"},
    timezone="America/New_York",    # default: derived from the proxy's exit IP
    pin={"screen.width": 2560, "screen.height": 1440},   # force fields, the rest stays seed-derived
    headless=True,                  # hidden desktop, real rendering: same fingerprint as headed
    profile_dir="./profile",        # cookies and storage survive the run
)

Proxies can be socks5, socks4, http or https, and DNS goes through them too. FirefoxOptions work as they do in Selenium, -headless included. The fields you can pin are the same as in invisible_playwright: pinning.

CLI

invisible-selenium fetch      # download the engine if missing, check every cached one, print the path
invisible-selenium version    # wrapper, core and engine versions

Related projects

Switching from another tool?

Development

git clone https://github.com/feder-cr/invisible_selenium && cd invisible_selenium
uv venv && uv pip install -e ".[dev]"
uv run pytest -q                      # unit
uv run pytest -q -m e2e               # against the real browser

License

MIT, see LICENSE. The Juggler client it drives the browser with lives in invisible-core, which carries two files taken from Playwright's driver under Apache-2.0. The patched Firefox binary is MPL-2.0, built from feder-cr/firefox_antidetect_patch.

Disclaimer

This project is for educational purposes only. It is provided as-is, with no warranties. I take no responsibility for how it is used. Use it at your own risk and in compliance with the laws of your jurisdiction.


Built by Federico Elia  LinkedIn

tests License: MIT Python 3.11+

Frequently asked questions

Is invisible_selenium free to use?

invisible_selenium is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does invisible_selenium do?

Selenium that anti-bots cannot see, so no captchas: same API, anti-detect stealth headless Firefox, undetected fingerprint, bypass bot detection, Python web scr

What is invisible_selenium written in?

invisible_selenium is primarily written in Python. Its source is publicly available at https://github.com/feder-cr/invisible_selenium, and it has 1,965 GitHub stars.