Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
invisible_playwright — Playwright que los anti-bots no pueden ver, así que sin captchas: misma API, Firefox headless sigiloso anti-detección, huella indetectable, elude la detección de bots, web scraping y automatización de navegador en Python. | Kitploit
Herramientas/GitHubGitHub/feder-cr/invisible_playwright
Evasión de IDS/IPSHerramientas de SuplantaciónSeguridad WebAnti-BotSuplantación de Huella DigitalBypass de CAPTCHA
GitHubfeder-cr/invisible_playwright

invisible_playwright

Playwright que los anti-bots no pueden ver, así que sin captchas: misma API, Firefox headless sigiloso anti-detección, huella indetectable, elude la detección de bots, web scraping y automatización de navegador en Python.

Ver Repositorio
1.8k201307hace 2 díasRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
<div align="center">
<picture>
  <source media="(max-width: 374px) and (prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/banner-small-dark.gif">
  <source media="(max-width: 374px)" srcset="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/banner-small-light.gif">
  <source media="(max-width: 1239px) and (prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/banner-phone-dark.gif">
  <source media="(max-width: 1239px)" srcset="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/banner-phone-light.gif">
  <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/banner-dark.gif">
  <img alt="invisible_playwright, Playwright sobre un Firefox anti-detección. Una animación: el interruptor de dos líneas de Playwright, el conjunto de huellas dentro del motor, un ratón que se mueve como una mano y las pruebas de bots que supera." src="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/banner-light.gif" width="100%">
</picture>
<h3 align="center">Playwright es detectado por los anti-bots y los captchas.<br>
Este se ejecuta sobre un Firefox anti-detección con una huella no detectada, compatible con tu código Playwright existente.</h3>
</div>

![invisible_playwright - 5/5 suites de detección superadas](https://assets.kitploit.com/production/public/readmes/7462/e23d5b9ad68fbaf1e80c3e7f70118a4e135514dc069f0b6d27076f6af3e23051.gif)

## Cómo funciona

Los anti-bots hacen dos preguntas, y reCAPTCHA, hCaptcha y Cloudflare Turnstile puntúan las respuestas. invisible_playwright responde que sí a ambas.

**1. ¿Es este un navegador real?** Sí. Es Firefox, parcheado a nivel del código fuente en C++.

- La huella del navegador se establece dentro del motor, no se inyecta en la página: navigator, screen, GPU/WebGL, canvas, fuentes, audio, WebRTC, zona horaria, red. En modo headless o con interfaz, los mismos valores en ambos casos.
- Sin shim de JS, sin override, sin costura que leer.

**2. ¿Lo está usando una persona real?** Sí. Las acciones están humanizadas en el driver.

- Cada clic, hover y arrastre sigue una trayectoria natural del ratón con tiempos humanos, sin cursor que se teletransporta.
- Cada entrada es idéntica byte a byte a la de un ratón real: fuente de entrada real, presión, eventos de confianza.

---

## Instalación

Windows, en PowerShell:

```powershell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
$env:Path = "$env:USERPROFILE\.local\bin;$env:Path"
uv init --python ">=3.11" my-project
cd my-project
uv add invisible-playwright
uv run invisible-playwright fetch      # one-time download, sha256-verified: 240 MB, about 550 MB unpacked
```

Linux:

```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv init --python ">=3.11" my-project
cd my-project
uv add invisible-playwright
uv run invisible-playwright fetch      # one-time download, sha256-verified: 262 MB (x86_64) / 253 MB (arm64), about 550 MB unpacked
```

Plataformas compatibles: **Windows x86_64**, **Linux x86_64 / arm64**.

Luego guarda uno de los ejemplos a continuación como `main.py` en `my-project` y ejecútalo con `uv run main.py`.

---

## Uso
### Huella aleatoria por sesión
**La API de Playwright, síncrona y asíncrona, sin cambios en el código.** Los mismos objetos, las mismas llamadas, los mismos valores de retorno. Algunas superficies quedan fuera del alcance —tracing, HAR, CDP, el contexto de solicitudes de la API— y cada una de ellas rechaza la operación con una frase que explica el motivo en lugar de comportarse de forma incorrecta de manera silenciosa. Si ya usas Playwright, cambiar es cuestión de dos líneas:

```diff
- from playwright.sync_api import sync_playwright
- with sync_playwright() as p:
-     browser = p.firefox.launch()
+ from invisible_playwright import InvisiblePlaywright
+ with InvisiblePlaywright() as browser:
```

Cada sesión obtiene una huella digital distinta (GPU, audio, fuentes, pantalla, ~200 campos) y movimiento del ratón con curvas de Bézier.

**Sincronización**
```python
from invisible_playwright import InvisiblePlaywright

with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
    page = browser.new_page()
    page.goto("https://example.com")
    page.click("#submit")   # mouse arcs to the button on a Bezier curve
```

**Asíncrono**
```python
from invisible_playwright.async_api import InvisiblePlaywright

async with InvisiblePlaywright(proxy={"server": "socks5://...", "username": "u", "password": "p"}) as browser:
    page = await browser.new_page()
    await page.goto("https://example.com")
    await page.click("#submit")
```

El objeto `browser` es un `playwright.sync_api.Browser` / `playwright.async_api.Browser` - cada método de Playwright funciona tal cual.

Registra la semilla para reproducir una ejecución:

```python
sf = InvisiblePlaywright()
with sf as browser:
    print("seed =", sf.seed)
    # ...
```

### Huella reproducible

```python
with InvisiblePlaywright(seed=42) as browser:
    ...   # same GPU, same canvas hash, same audio context, every run
```

### Proxies

```python
proxy = {
    "server": "socks5://gate.example.com:1080",
    "username": "user",
    "password": "pass",
}
with InvisiblePlaywright(proxy=proxy) as browser:
    ...
```

Esquemas compatibles: `socks5`, `socks4`, `http`, `https`. El DNS se enruta a través del proxy de forma predeterminada, sin fuga local.

### Zona horaria

La zona horaria del navegador sigue a `timezone=`:

```python
# default: timezone is auto-derived from the egress IP (proxy egress if a
# proxy is set, otherwise the host's own public IP)
with InvisiblePlaywright(proxy=proxy) as browser:
    ...

# explicit IANA zone always wins, the only way to force a specific zone
with InvisiblePlaywright(proxy=proxy, timezone="America/New_York") as browser:
    ...
```

### Fijar campos de huella digital específicos

Por defecto, todo proviene de `seed`. Para forzar valores específicos mientras el resto permanece derivado de la semilla:

```python
with InvisiblePlaywright(
    seed=42,
    pin={
        "gpu.renderer": "ANGLE (AMD, Radeon R9 200 Series Direct3D11 vs_5_0 ps_5_0, D3D11)",
        "gpu.vendor":   "Google Inc. (AMD)",
        "screen.width":  2560,
        "screen.height": 1440,
        "hardware.concurrency": 16,
    },
) as browser:
    ...
```

Un pin de GPU selecciona una de las personas validadas en lugar de establecer una cadena libre, porque los ~81 valores de `getParameter` y la lista de extensiones viajan con el nombre del renderizador y un detector los verifica de forma cruzada contra él. Un nombre que el pool no contiene genera un error, y el error enumera los que sí contiene.

La lista completa de claves fijables, cómo interactúa el pinning con el muestreador bayesiano y los patrones comunes están en **[docs/pinning.md](https://github.com/feder-cr/invisible_playwright/blob/main/docs/pinning.md)**.

---

## CLI

El comando instalado es `invisible-playwright`, con un guion. `python -m
invisible_playwright` funciona de forma idéntica y no necesita nada en el PATH.

```bash
invisible-playwright fetch    # download the engine if missing, check every cached
                              # one against the seal, print the path
invisible-playwright version  # wrapper, core and engine versions, and where the
                              # engine is cached
```

## Documentación, guías y comparativas

**Si prefiere usar prompts en lugar de scripts.** Esta página es el motor, como una biblioteca de Python. Dos formas de usarlo sin escribir código, ambas en una sola línea: desde un cliente MCP que ya tenga (Claude Code, Claude Desktop, Cursor), `claude mcp add stealth -- uvx aihawk`, consulte [la página del servidor MCP](https://github.com/feder-cr/AIHawk/wiki/mcp-server); o con una interfaz y un modelo incluido, que solo necesita una clave de OpenRouter, `uvx aihawk ui --openrouter-key sk-or-...`, consulte [AIHawk](https://github.com/feder-cr/AIHawk). El mismo motor por debajo, y el segundo es un cliente del primero.

Todo se lee mejor, y es buscable, en **[la wiki](https://github.com/feder-cr/invisible_playwright/wiki)**, organizada en cuatro secciones en lugar de una lista plana:

- **[Documentación](https://github.com/feder-cr/invisible_playwright/blob/main/docs/documentation.md)** - instalación, el cambio de dos líneas desde Playwright simple, configuración de proxy/zona horaria, fijación de campos específicos, la CLI.
- **[Guías](https://github.com/feder-cr/invisible_playwright/blob/main/docs/guides.md)** - cómo funciona realmente la detección, en siete grupos: identidad del navegador, canvas/WebGL/fuentes/audio, red y WebRTC, la capa de automatización, agentes de IA, los propios detectores explicados desde el código fuente, y pruebas.
- **[Comparaciones](https://github.com/feder-cr/invisible_playwright/blob/main/docs/comparisons.md)** - frente a Camoufox, Patchright, nodriver y playwright-stealth, y el argumento a favor de Firefox sobre Chromium en general.
- **[Integraciones](https://github.com/feder-cr/invisible_playwright/blob/main/docs/integrations)** - Scrapy, Crawlee, Robot Framework, CodeceptJS, ejecutores de pruebas, Playwright MCP, y los frameworks con los que no encaja, por nombre.

Si no sabe por dónde empezar: [Tres formas de hacer que Playwright no sea detectado](https://github.com/feder-cr/invisible_playwright/blob/main/docs/playwright-stealth-levels.md) es el mapa al que enlazan la mayoría de las demás páginas, [Playwright detectado como bot en un sitio](https://github.com/feder-cr/invisible_playwright/blob/main/docs/playwright-detected-as-bot.md) es el orden de resolución de problemas, y [navigator.webdriver no es la señal que cree que es](https://github.com/feder-cr/invisible_playwright/blob/main/docs/navigator-webdriver-explained.md) explica la propiedad más famosa de este ámbito y por qué parchearla por sí sola casi no le aporta nada.

La sección de detectores ahora cubre los productos comerciales anti-bot por nombre, cada uno leído desde su propia documentación o desde ingeniería inversa confirmada: [Cloudflare Bot Management](https://github.com/feder-cr/invisible_playwright/blob/main/docs/cloudflare-bot-management-explained.md) y [Turnstile](https://github.com/feder-cr/invisible_playwright/blob/main/docs/cloudflare-turnstile-explained.md), [DataDome](https://github.com/feder-cr/invisible_playwright/blob/main/docs/datadome-explained.md), [Kasada](https://github.com/feder-cr/invisible_playwright/blob/main/docs/kasada-explained.md), [Akamai Bot Manager](https://github.com/feder-cr/invisible_playwright/blob/main/docs/akamai-bot-manager-explained.md), [PerimeterX](https://github.com/feder-cr/invisible_playwright/blob/main/docs/perimeterx-explained.md), [hCaptcha](https://github.com/feder-cr/invisible_playwright/blob/main/docs/hcaptcha-explained.md), [Imperva](https://github.com/feder-cr/invisible_playwright/blob/main/docs/imperva-incapsula-explained.md), y [el resto del conjunto](https://github.com/feder-cr/invisible_playwright/blob/main/docs/guides-detectors-explained.md).

## Proyectos relacionados

**Las otras piezas de este.** El motor es el del medio de tres, y los dos que lo rodean son cómo la mayoría de la gente llega a él:

- **[invisible_core](https://github.com/feder-cr/invisible_core)** - semilla a huella digital a preferencias, además de proxy y geolocalización. Este paquete lo fija.
- **[AIHawk](https://github.com/feder-cr/AIHawk)** - este motor como servidor MCP (`uvx aihawk`, para cualquier cliente que traiga su propio modelo) y, en el mismo paquete, una interfaz con un modelo incluido, desde un solo comando. La interfaz es un cliente del servidor, sin ruta privada al navegador.

**Los vecinos de código abierto.** Cuál encaja depende de la capa en la que esté su problema, y de si necesita Firefox o Chromium: [tres formas de hacer que Playwright no sea detectado](https://github.com/feder-cr/invisible_playwright/blob/main/docs/playwright-stealth-levels.md) analiza qué puede alcanzar cada capa, y [agentes de navegador de IA y stealth](https://github.com/feder-cr/invisible_playwright/blob/main/docs/ai-browser-agents-stealth.md) cubre los frameworks que eligen Chromium sobre CDP por usted.

**En el lado de Firefox**

- **[Camoufox](https://github.com/daijro/camoufox)** - también parchea C++, una superficie más amplia, e incluye una base de datos de huellas digitales en lugar de derivarla de una semilla. [Comparación](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-camoufox.md).
- **[LibreWolf](https://librewolf.net)** - un Firefox con privacidad por defecto para navegar, no para automatizar.
- **[arkenfox/user.js](https://github.com/arkenfox/user.js)** - endurecimiento mediante preferencias. Donde una preferencia sea suficiente, úsala.

**En el lado de Chromium**

- **[Patchright](https://github.com/Kaliiiiiiiiii-Vinyzu/patchright)** - un fork parcheado de Playwright: el trabajo se realiza en el driver, no en el binario. [Comparación](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-patchright.md).
- **[nodriver](https://github.com/ultrafunkamsterdam/nodriver)** - sucesor de `undetected-chromedriver`, que controla Chrome a través de CDP. [Comparación](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-nodriver.md).
- **[rebrowser-patches](https://github.com/rebrowser/rebrowser-patches)** - corrige la fuga de CDP `Runtime.enable`. [Comparación](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-rebrowser-patches.md).
- **[fingerprint-suite](https://github.com/apify/fingerprint-suite)** - un generador de huellas dactilares bayesiano, que luego se inyecta en la página. [Comparación](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-fingerprint-suite.md).
- **[playwright-with-fingerprints](https://github.com/bablosoft/playwright-with-fingerprints)** - valores de un servicio remoto de pago, solo para Windows. [Comparación](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-playwright-with-fingerprints.md).
- **[playwright-stealth](https://github.com/Mattwmaster58/playwright_stealth)** - un parche de script de inicialización; su mantenedor lo describe como una prueba de concepto. [Comparación](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-playwright-stealth.md).
- **[puppeteer-extra-plugin-stealth](https://github.com/berstend/puppeteer-extra)** - el original de ese linaje, último commit sustancial a mediados de 2024. [Qué significa eso](https://github.com/feder-cr/invisible_playwright/blob/main/docs/puppeteer-extra-stealth-unmaintained.md).
- **[selenium-stealth](https://github.com/diprajpatra/selenium-stealth)** - el mismo enfoque sobre Selenium, último commit en diciembre de 2021. [Qué significa eso](https://github.com/feder-cr/invisible_playwright/blob/main/docs/selenium-stealth-unmaintained.md).
- **[pyppeteer](https://github.com/pyppeteer/pyppeteer)** - sin mantenimiento según su propio README, que remite a `playwright-python`. [De qué trata esa recomendación](https://github.com/feder-cr/invisible_playwright/blob/main/docs/pyppeteer-unmaintained-playwright.md).

---

## Qué se parchea en el motor

Dos reglas se aplican a todo lo que sigue. Cada valor se decide **antes de que una página pueda
preguntar**, dentro del navegador, por lo que no hay ningún shim de JavaScript que encontrar. Y cada valor
proviene de **un único perfil**, por lo que no hay dos superficies que se contradigan entre sí, que es como
normalmente se detecta un navegador falsificado. Fuente:
[feder-cr/firefox_antidetect_patch](https://github.com/feder-cr/firefox_antidetect_patch).

**Identidad**
- `navigator`, el user agent y los client hints se derivan juntos, por lo que no pueden contradecirse: [does Playwright set navigator.webdriver](https://github.com/feder-cr/invisible_playwright/blob/main/docs/does-playwright-set-navigator-webdriver.md), [client hints and Sec-Fetch](https://github.com/feder-cr/invisible_playwright/blob/main/docs/client-hints-sec-fetch.md).
- `navigator.languages` y la cabecera `Accept-Language` son la misma declaración, enviada y leída: [Accept-Language and navigator.languages](https://github.com/feder-cr/invisible_playwright/blob/main/docs/accept-language-navigator-languages.md).
- La geometría de pantalla, `devicePixelRatio` y las media queries que lo exponen se declaran, no se leen del host: [devicePixelRatio and the Firefox pref](https://github.com/feder-cr/invisible_playwright/blob/main/docs/devicepixelratio-firefox-pref.md), [CSS media query fingerprinting](https://github.com/feder-cr/invisible_playwright/blob/main/docs/css-media-query-fingerprinting.md).

**Renderizado**
- La lectura de Canvas es determinista por semilla y mantiene la forma real, en lugar de estar bloqueada o con ruido: [canvas fingerprint noise](https://github.com/feder-cr/invisible_playwright/blob/main/docs/canvas-fingerprint-noise.md), [why a canvas fingerprint changes every run](https://github.com/feder-cr/invisible_playwright/blob/main/docs/canvas-fingerprint-changes-every-run.md).
- WebGL reporta una persona de GPU coherente: el proveedor, el renderizador y los límites de parámetros se verifican de forma cruzada, no se establecen uno a la vez: [WebGL renderer strings](https://github.com/feder-cr/invisible_playwright/blob/main/docs/webgl-renderer-strings.md), [WebGL parameters are identical](https://github.com/feder-cr/invisible_playwright/blob/main/docs/webgl-parameters-are-identical.md).
- Las fuentes se incluyen con el navegador, por lo que las mismas caras existen en cada host y el motor de fuentes de la plataforma ya no elige: [bundled fonts across platforms](https://github.com/feder-cr/invisible_playwright/blob/main/docs/bundled-fonts-cross-platform.md), [why headless browsers render different fonts](https://github.com/feder-cr/invisible_playwright/blob/main/docs/headless-fonts-differ.md), [detecting installed fonts from JavaScript](https://github.com/feder-cr/invisible_playwright/blob/main/docs/detect-installed-fonts-javascript.md).
- Las métricas de texto siguen esas fuentes: `measureText` devuelve más de diez números en una sola llamada, sin solicitud de permiso: [measureText and TextMetrics](https://github.com/feder-cr/invisible_playwright/blob/main/docs/measuretext-textmetrics-fingerprinting.md).
- Canvas y WebGL coinciden entre sistemas operativos para la misma semilla: [cross-platform consistency](https://github.com/feder-cr/invisible_playwright/blob/main/docs/canvas-webgl-cross-platform-consistency.md), [canvas differs across operating systems](https://github.com/feder-cr/invisible_playwright/blob/main/docs/canvas-differs-across-operating-systems.md).

**Audio y medios**
- La pila de audio responde desde el perfil en lugar de desde el dispositivo host: [AudioContext fingerprinting](https://github.com/feder-cr/invisible_playwright/blob/main/docs/audiocontext-fingerprinting.md), [sample rate and latency](https://github.com/feder-cr/invisible_playwright/blob/main/docs/audiocontext-samplerate-latency-fingerprint.md).
- La tabla de códecs está declarada, por lo que un host Linux no responde a una pregunta de Windows con soporte de Linux: [codec fingerprinting](https://github.com/feder-cr/invisible_playwright/blob/main/docs/codec-fingerprinting.md).

**Red**
- WebRTC ofrece un candidato sintético que transporta la salida del proxy, en lugar de filtrar la dirección real u ofrecer ninguno, lo cual es en sí mismo un indicio revelador: [WebRTC ICE candidate spoofing](https://github.com/feder-cr/invisible_playwright/blob/main/docs/webrtc-ice-candidate-spoofing.md), [does the WebRTC IP match the proxy exit](https://github.com/feder-cr/invisible_playwright/blob/main/docs/webrtc-ip-match-proxy-exit.md).
- DNS resuelve a través del proxy, incluso cuando el proxy no está en las preferencias: [does a proxy leak DNS](https://github.com/feder-cr/invisible_playwright/blob/main/docs/does-a-proxy-leak-dns-doh-explained.md), [how to check for a proxy IP leak](https://github.com/feder-cr/invisible_playwright/blob/main/docs/how-to-check-proxy-ip-leak.md).
- La zona horaria proviene de la IP de salida, resuelta sin conexión, por lo que coincide con la salida: [timezone and proxy mismatch](https://github.com/feder-cr/invisible_playwright/blob/main/docs/timezone-proxy-mismatch.md), [offline GeoIP timezone](https://github.com/feder-cr/invisible_playwright/blob/main/docs/offline-geoip-timezone-proxy.md).

**La capa de automatización**
- Los eventos de entrada provienen de la ruta de entrada real, por lo que `isTrusted` es verdadero porque lo es: [Playwright clicks and isTrusted](https://github.com/feder-cr/invisible_playwright/blob/main/docs/playwright-clicks-istrusted.md).
- El puntero sigue una ruta y una cadencia humanas, a un ritmo que un dispositivo real podría producir: [human mouse movement](https://github.com/feder-cr/invisible_playwright/blob/main/docs/human-mouse-movement.md), [mouse dynamics as behavioural biometrics](https://github.com/feder-cr/invisible_playwright/blob/main/docs/mouse-dynamics-behavioural-biometrics.md).
- La superficie del depurador no responde a las preguntas de temporización que delatan a un navegador controlado: [debugger timing detection](https://github.com/feder-cr/invisible_playwright/blob/main/docs/debugger-timing-detection.md).
- Las raíces shadow en modo cerrado son accesibles, algo que Playwright estándar no puede hacer en ninguno de los dos motores, mientras la página sigue leyendo `null`: [closed shadow roots](https://github.com/feder-cr/invisible_playwright/blob/main/docs/closed-shadow-root-playwright.md).

---

## Licencia

MIT - consulte [LICENSE](https://github.com/feder-cr/invisible_playwright/blob/main/LICENSE). El binario parcheado de Firefox se distribuye bajo la MPL-2.0 (licencia upstream de Firefox). Los parches de C++ contra mozilla-central que producen ese binario están en [feder-cr/firefox_antidetect_patch](https://github.com/feder-cr/firefox_antidetect_patch).

---

## Descargo de responsabilidad

Este proyecto es solo para fines educativos. Se proporciona tal cual, sin garantías. No asumo ninguna responsabilidad por cómo se utilice. Úselo bajo su propio riesgo y en cumplimiento de las leyes de su jurisdicción.

---

<p align="center">
  Creado por <a href="https://it.linkedin.com/in/federico-elia-5199951b6">Federico Elia</a>
  &nbsp;<a href="https://it.linkedin.com/in/federico-elia-5199951b6"><img src="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/badges/linkedin.svg" alt="LinkedIn"></a>
</p>

<p align="center">
  <a href="https://github.com/feder-cr/invisible_playwright/actions/workflows/tests.yml"><img src="https://github.com/feder-cr/invisible_playwright/actions/workflows/tests.yml/badge.svg" alt="tests"></a>
  <a href="https://github.com/feder-cr/invisible_playwright/blob/main/LICENSE"><img src="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/badges/license.svg" alt="License: MIT"></a>
  <a href="https://www.python.org/downloads/"><img src="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/badges/python.svg" alt="Python 3.11+"></a>
  <a href="https://github.com/feder-cr/firefox_antidetect_patch/releases"><img src="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/badges/firefox.svg" alt="Firefox 151.0"></a>
  <img src="https://raw.githubusercontent.com/feder-cr/invisible_playwright/badges/docs/badges/launches.svg" alt="browser launches">
  <a href="https://github.com/feder-cr/invisible_playwright/stargazers"><img src="https://raw.githubusercontent.com/feder-cr/invisible_playwright/badges/docs/badges/stars.svg" alt="GitHub stars"></a>
</p>
Descargar herramienta