Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
invisible_playwright — Playwright que les anti-bots ne peuvent pas voir, donc pas de captchas : même API, Firefox headless furtif anti-détection, empreinte indétectable, contournement de la détection de bots, scraping web et automatisation de navigateur en Python. | Kitploit
Outils/GitHubGitHub/feder-cr/invisible_playwright
Évasion IDS/IPSOutils d'ImpersonationSécurité WebAnti-BotUsurpation d'Empreinte NumériqueContournement de CAPTCHA
GitHubfeder-cr/invisible_playwright

invisible_playwright

Playwright que les anti-bots ne peuvent pas voir, donc pas de captchas : même API, Firefox headless furtif anti-détection, empreinte indétectable, contournement de la détection de bots, scraping web et automatisation de navigateur en Python.

Voir le dépôt
1.8k201307il y a 3 joursVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
<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 sur un Firefox anti-détection. Une animation : le commutateur à deux lignes depuis Playwright, l'empreinte définie à l'intérieur du moteur, une souris qui bouge comme une main, et les tests anti-bots qu'il réussit." src="https://raw.githubusercontent.com/feder-cr/invisible_playwright/main/docs/banner-light.gif" width="100%">
</picture>
<h3 align="center">Playwright se fait repérer par les anti-bots et les captchas.<br>
Celui-ci fonctionne sur un Firefox anti-détection doté d'une empreinte indétectable, compatible avec votre code Playwright existant.</h3>
</div>

![invisible_playwright - 5/5 suites de détection réussies](https://assets.kitploit.com/production/public/readmes/7462/e23d5b9ad68fbaf1e80c3e7f70118a4e135514dc069f0b6d27076f6af3e23051.gif)

## Fonctionnement

Les anti-bots posent deux questions, et reCAPTCHA, hCaptcha et Cloudflare Turnstile notent les réponses. invisible_playwright répond oui aux deux.

**1. S'agit-il d'un vrai navigateur ?** Oui. C'est Firefox, patché au niveau du code source C++.

- L'empreinte du navigateur est définie à l'intérieur du moteur, et non injectée dans la page : navigator, screen, GPU/WebGL, canvas, polices, audio, WebRTC, fuseau horaire, réseau. En mode headless ou headed, les mêmes valeurs dans les deux cas.
- Aucun shim JS, aucune surcharge, aucune couture à lire.

**2. Une vraie personne l'utilise-t-elle ?** Oui. Les actions sont humanisées dans le driver.

- Chaque clic, survol et glisser suit une trajectoire de souris naturelle avec un timing humain, sans curseur qui se téléporte.
- Chaque entrée est identique octet pour octet à une vraie souris : source d'entrée réelle, pression, événements de confiance.

---

## Installation

Windows, dans 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
```

Plateformes prises en charge : **Windows x86_64**, **Linux x86_64 / arm64**.

Enregistrez ensuite l'un des exemples ci-dessous sous le nom `main.py` dans `my-project` et exécutez-le avec `uv run main.py`.

---

## Utilisation
### Empreinte aléatoire par session
**L'API de Playwright, sync et async, sans aucune modification de code.** Les mêmes objets, les mêmes appels, les mêmes valeurs de retour. Quelques surfaces sont hors périmètre - le tracing, HAR, CDP, le contexte de requête API - et chacune refuse avec une phrase expliquant pourquoi plutôt que de mal se comporter silencieusement. Si vous utilisez déjà Playwright, la bascule se fait en deux lignes :

```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:
```

Chaque session obtient une empreinte distincte (GPU, audio, polices, écran, ~200 champs) et un mouvement de souris en courbe de Bézier.

**Synchronisation**
```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
```

**Asynchrone**
```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")
```

L'objet `browser` est un `playwright.sync_api.Browser` / `playwright.async_api.Browser` - chaque méthode Playwright fonctionne telle quelle.

Journalisez la graine pour rejouer une exécution :

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

### Empreinte reproductible

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

### Proxys

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

Schémas pris en charge : `socks5`, `socks4`, `http`, `https`. Le DNS est routé via le proxy par défaut, sans fuite locale.

### Fuseau horaire

Le fuseau horaire du navigateur suit `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:
    ...
```

### Épingler des champs d'empreinte spécifiques

Par défaut, tout provient de `seed`. Pour forcer des valeurs spécifiques tandis que le reste reste dérivé de la seed :

```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 GPU sélectionne l'une des personas validées plutôt que de définir une chaîne libre, car les ~81 valeurs `getParameter` et la liste des extensions voyagent avec le nom du renderer et un détecteur les recoupe avec celui-ci. Un nom que le pool ne contient pas lève une erreur, et l'erreur liste ceux qu'il contient.

La liste complète des clés épinglables, la façon dont l'épinglage interagit avec l'échantillonneur bayésien, et les patrons courants se trouvent dans **[docs/pinning.md](https://github.com/feder-cr/invisible_playwright/blob/main/docs/pinning.md)**.

---

## CLI

La commande installée est `invisible-playwright`, avec un trait d'union. `python -m
invisible_playwright` fonctionne de manière identique et ne nécessite rien dans le 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
```

## Documentation, guides and comparisons

**Si vous préférez un prompt à un script.** Cette page est le moteur, sous forme de bibliothèque
Python. Deux façons de l'utiliser sans écrire de code, toutes deux en une ligne : depuis un client MCP
que vous avez déjà (Claude Code, Claude Desktop, Cursor),
`claude mcp add stealth -- uvx aihawk`, voir
[la page du serveur MCP](https://github.com/feder-cr/AIHawk/wiki/mcp-server) ; ou avec une
interface et un modèle inclus, ne nécessitant qu'une clé OpenRouter,
`uvx aihawk ui --openrouter-key sk-or-...`, voir
[AIHawk](https://github.com/feder-cr/AIHawk). Le même moteur en dessous, et le second
est un client du premier.

L'ensemble se lit mieux, et est consultable par recherche, dans
**[le wiki](https://github.com/feder-cr/invisible_playwright/wiki)**,
organisé en quatre sections au lieu d'une liste plate :

- **[Documentation](https://github.com/feder-cr/invisible_playwright/blob/main/docs/documentation.md)** -
  installation, la bascule en deux lignes depuis Playwright standard, configuration du proxy/fuseau
  horaire, épinglage de champs spécifiques, la CLI.
- **[Guides](https://github.com/feder-cr/invisible_playwright/blob/main/docs/guides.md)** - comment
  la détection fonctionne réellement, en sept groupes : identité du navigateur, canvas/WebGL/polices/
  audio, réseau et WebRTC, la couche d'automatisation, les agents IA, les détecteurs eux-mêmes
  expliqués depuis le code source, et les tests.
- **[Comparaisons](https://github.com/feder-cr/invisible_playwright/blob/main/docs/comparisons.md)** -
  face à Camoufox, Patchright, nodriver et playwright-stealth, et l'argument en faveur de
  Firefox plutôt que Chromium en général.
- **[Intégrations](https://github.com/feder-cr/invisible_playwright/blob/main/docs/integrations)** -
  Scrapy, Crawlee, Robot Framework, CodeceptJS, les lanceurs de tests, Playwright MCP, et les
  frameworks auxquels il ne s'adapte pas, nommément.

Si vous ne savez pas par où commencer : [Trois façons de rendre Playwright indétectable](https://github.com/feder-cr/invisible_playwright/blob/main/docs/playwright-stealth-levels.md)
est la carte vers laquelle la plupart des autres pages renvoient, [Playwright détecté comme bot sur un site](https://github.com/feder-cr/invisible_playwright/blob/main/docs/playwright-detected-as-bot.md)
est l'ordre de dépannage, et [navigator.webdriver n'est pas l'indice que vous croyez](https://github.com/feder-cr/invisible_playwright/blob/main/docs/navigator-webdriver-explained.md)
explique la propriété la plus célèbre de ce domaine et pourquoi la corriger seule ne vous apporte
presque rien.

La section des détecteurs couvre désormais les produits anti-bot commerciaux par leur nom, chacun
étudié à partir de sa propre documentation ou d'une rétro-ingénierie confirmée :
[Cloudflare Bot Management](https://github.com/feder-cr/invisible_playwright/blob/main/docs/cloudflare-bot-management-explained.md) et
[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), et
[le reste de l'ensemble](https://github.com/feder-cr/invisible_playwright/blob/main/docs/guides-detectors-explained.md).

## Projets liés

**Les autres pièces de celui-ci.** Le moteur est celui du milieu parmi trois, et les
deux qui l'entourent sont la façon dont la plupart des gens y accèdent :

- **[invisible_core](https://github.com/feder-cr/invisible_core)** - de la graine à
  l'empreinte en passant par les préférences, plus le proxy et la géolocalisation. Ce paquet l'épingle.
- **[AIHawk](https://github.com/feder-cr/AIHawk)** - ce moteur en tant que serveur
  MCP (`uvx aihawk`, pour tout client qui apporte son propre
  modèle) et, dans le même paquet, une interface avec un modèle inclus, à partir d'une
  seule commande. L'interface est un client du serveur, sans chemin privé
  vers le navigateur.

**Les voisins open source.** Lequel convient dépend de la couche où se situe votre problème,
et de si vous avez besoin de Firefox ou de Chromium :
[trois façons de rendre Playwright indétectable](https://github.com/feder-cr/invisible_playwright/blob/main/docs/playwright-stealth-levels.md) examine
ce que chaque couche peut atteindre, et [agents de navigateur IA et furtivité](https://github.com/feder-cr/invisible_playwright/blob/main/docs/ai-browser-agents-stealth.md)
couvre les frameworks qui choisissent Chromium plutôt que CDP pour vous.

**Du côté de Firefox**

- **[Camoufox](https://github.com/daijro/camoufox)** - corrige aussi le C++, surface plus large, fournit une base de données d'empreintes au lieu d'en dériver une à partir d'une graine. [Comparaison](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-camoufox.md).
- **[LibreWolf](https://librewolf.net)** - un Firefox axé sur la confidentialité par défaut, pour naviguer, pas pour automatiser.
- **[arkenfox/user.js](https://github.com/arkenfox/user.js)** - durcissement via les préférences. Là où une préférence suffit, utilisez-la.

**Du côté de Chromium**

- **[Patchright](https://github.com/Kaliiiiiiiiii-Vinyzu/patchright)** - un fork patché de Playwright : le travail se fait dans le driver, pas dans le binaire. [Comparaison](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-patchright.md).
- **[nodriver](https://github.com/ultrafunkamsterdam/nodriver)** - successeur de `undetected-chromedriver`, pilotant Chrome via CDP. [Comparaison](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-nodriver.md).
- **[rebrowser-patches](https://github.com/rebrowser/rebrowser-patches)** - corrige la fuite CDP `Runtime.enable`. [Comparaison](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-rebrowser-patches.md).
- **[fingerprint-suite](https://github.com/apify/fingerprint-suite)** - un générateur d'empreintes bayésien, ensuite injecté dans la page. [Comparaison](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-fingerprint-suite.md).
- **[playwright-with-fingerprints](https://github.com/bablosoft/playwright-with-fingerprints)** - valeurs issues d'un service distant payant, Windows uniquement. [Comparaison](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-playwright-with-fingerprints.md).
- **[playwright-stealth](https://github.com/Mattwmaster58/playwright_stealth)** - un patch par script d'initialisation ; son mainteneur le qualifie de preuve de concept. [Comparaison](https://github.com/feder-cr/invisible_playwright/blob/main/docs/vs-playwright-stealth.md).
- **[puppeteer-extra-plugin-stealth](https://github.com/berstend/puppeteer-extra)** - l'original de cette lignée, dernier commit substantiel mi-2024. [Ce que cela signifie](https://github.com/feder-cr/invisible_playwright/blob/main/docs/puppeteer-extra-stealth-unmaintained.md).
- **[selenium-stealth](https://github.com/diprajpatra/selenium-stealth)** - la même approche sur Selenium, dernier commit en décembre 2021. [Ce que cela signifie](https://github.com/feder-cr/invisible_playwright/blob/main/docs/selenium-stealth-unmaintained.md).
- **[pyppeteer](https://github.com/pyppeteer/pyppeteer)** - non maintenu d'après son propre README, qui renvoie vers `playwright-python`. [Ce que signifie cette recommandation](https://github.com/feder-cr/invisible_playwright/blob/main/docs/pyppeteer-unmaintained-playwright.md).

---

## Ce qui est patché dans le moteur

Deux règles s'appliquent à tout ce qui suit. Chaque valeur est décidée **avant qu'une page puisse la demander**, à l'intérieur du navigateur, il n'y a donc aucun shim JavaScript à trouver. Et chaque valeur provient d'**un seul profil**, ainsi aucune paire de surfaces ne se contredit, ce qui est justement la façon dont un navigateur usurpé est habituellement détecté. Source :
[feder-cr/firefox_antidetect_patch](https://github.com/feder-cr/firefox_antidetect_patch).

**Identité**
- `navigator`, le user agent et les client hints sont dérivés ensemble, ils ne peuvent donc pas se contredire : [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` et l'en-tête `Accept-Language` sont la même déclaration, envoyée et lue : [Accept-Language and navigator.languages](https://github.com/feder-cr/invisible_playwright/blob/main/docs/accept-language-navigator-languages.md).
- La géométrie de l'écran, `devicePixelRatio` et les media queries qui l'exposent sont déclarés, et non lus depuis l'hôte : [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).

**Rendu**
- La lecture du canvas est déterministe selon la graine et conserve la forme réelle, plutôt que bloquée ou bruitée : [bruit d'empreinte canvas](https://github.com/feder-cr/invisible_playwright/blob/main/docs/canvas-fingerprint-noise.md), [pourquoi une empreinte canvas change à chaque exécution](https://github.com/feder-cr/invisible_playwright/blob/main/docs/canvas-fingerprint-changes-every-run.md).
- WebGL rapporte un persona GPU cohérent : le fournisseur, le moteur de rendu et les limites de paramètres sont recoupés, et non définis un par un : [chaînes de rendu WebGL](https://github.com/feder-cr/invisible_playwright/blob/main/docs/webgl-renderer-strings.md), [les paramètres WebGL sont identiques](https://github.com/feder-cr/invisible_playwright/blob/main/docs/webgl-parameters-are-identical.md).
- Les polices sont fournies avec le navigateur, de sorte que les mêmes fontes existent sur chaque hôte et que le moteur de polices de la plateforme ne choisit plus : [polices embarquées sur toutes les plateformes](https://github.com/feder-cr/invisible_playwright/blob/main/docs/bundled-fonts-cross-platform.md), [pourquoi les navigateurs headless rendent des polices différentes](https://github.com/feder-cr/invisible_playwright/blob/main/docs/headless-fonts-differ.md), [détecter les polices installées depuis JavaScript](https://github.com/feder-cr/invisible_playwright/blob/main/docs/detect-installed-fonts-javascript.md).
- Les métriques de texte suivent ces polices : `measureText` renvoie plus de dix nombres en un seul appel, sans invite d'autorisation : [measureText et TextMetrics](https://github.com/feder-cr/invisible_playwright/blob/main/docs/measuretext-textmetrics-fingerprinting.md).
- Canvas et WebGL concordent entre systèmes d'exploitation pour une même graine : [cohérence multiplateforme](https://github.com/feder-cr/invisible_playwright/blob/main/docs/canvas-webgl-cross-platform-consistency.md), [le canvas diffère selon les systèmes d'exploitation](https://github.com/feder-cr/invisible_playwright/blob/main/docs/canvas-differs-across-operating-systems.md).

**Audio et médias**
- La pile audio répond à partir du profil plutôt que de l'appareil hôte : [empreinte AudioContext](https://github.com/feder-cr/invisible_playwright/blob/main/docs/audiocontext-fingerprinting.md), [fréquence d'échantillonnage et latence](https://github.com/feder-cr/invisible_playwright/blob/main/docs/audiocontext-samplerate-latency-fingerprint.md).
- La table des codecs est déclarée, de sorte qu'un hôte Linux ne répond pas à une question Windows avec le support Linux : [empreinte des codecs](https://github.com/feder-cr/invisible_playwright/blob/main/docs/codec-fingerprinting.md).

**Réseau**
- WebRTC propose un candidat synthétique portant la sortie du proxy, au lieu de divulguer l'adresse réelle ou de n'en proposer aucun, ce qui est en soi un indice : [usurpation de candidat ICE WebRTC](https://github.com/feder-cr/invisible_playwright/blob/main/docs/webrtc-ice-candidate-spoofing.md), [l'IP WebRTC correspond-elle à la sortie du proxy](https://github.com/feder-cr/invisible_playwright/blob/main/docs/webrtc-ip-match-proxy-exit.md).
- Le DNS résout via le proxy, y compris lorsque le proxy n'est pas dans les préférences : [un proxy fuit-il le DNS](https://github.com/feder-cr/invisible_playwright/blob/main/docs/does-a-proxy-leak-dns-doh-explained.md), [comment vérifier une fuite d'IP de proxy](https://github.com/feder-cr/invisible_playwright/blob/main/docs/how-to-check-proxy-ip-leak.md).
- Le fuseau horaire provient de l'IP de sortie, résolue hors ligne, de sorte qu'il correspond à la sortie : [incohérence entre fuseau horaire et proxy](https://github.com/feder-cr/invisible_playwright/blob/main/docs/timezone-proxy-mismatch.md), [fuseau horaire GeoIP hors ligne](https://github.com/feder-cr/invisible_playwright/blob/main/docs/offline-geoip-timezone-proxy.md).

**La couche d'automatisation**
- Les événements d'entrée proviennent du chemin d'entrée réel, donc `isTrusted` est vrai parce qu'il l'est : [clics Playwright et isTrusted](https://github.com/feder-cr/invisible_playwright/blob/main/docs/playwright-clicks-istrusted.md).
- Le pointeur suit un trajet et un timing humains, à une cadence qu'un appareil réel pourrait produire : [mouvement de souris humain](https://github.com/feder-cr/invisible_playwright/blob/main/docs/human-mouse-movement.md), [la dynamique de la souris comme biométrie comportementale](https://github.com/feder-cr/invisible_playwright/blob/main/docs/mouse-dynamics-behavioural-biometrics.md).
- La surface du débogueur ne répond pas aux questions de timing qui trahissent un navigateur piloté : [détection du timing du débogueur](https://github.com/feder-cr/invisible_playwright/blob/main/docs/debugger-timing-detection.md).
- Les shadow roots en mode fermé sont accessibles, ce que Playwright standard ne peut faire dans aucun des deux moteurs, tandis que la page lit toujours `null` : [shadow roots fermés](https://github.com/feder-cr/invisible_playwright/blob/main/docs/closed-shadow-root-playwright.md).

---

## Licence

MIT - voir [LICENSE](https://github.com/feder-cr/invisible_playwright/blob/main/LICENSE). Le binaire Firefox patché est distribué sous la MPL-2.0 (licence amont de Firefox). Les patches C++ contre mozilla-central qui produisent ce binaire sont disponibles sur [feder-cr/firefox_antidetect_patch](https://github.com/feder-cr/firefox_antidetect_patch).

---

## Avertissement

Ce projet est destiné à des fins éducatives uniquement. Il est fourni tel quel, sans aucune garantie. Je décline toute responsabilité quant à son utilisation. Utilisez-le à vos propres risques et en conformité avec les lois de votre juridiction.

---

<p align="center">
  Créé par <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>
Télécharger l’outil