Zum Inhalt springen

Chrome-Erweiterungen

Laden Sie entpackte Erweiterungen beim Start mit extensions. Manifest V2 und V3 laufen beide, headed wie headless, unter Windows und Linux.

Eine Erweiterung laden

Übergeben Sie eine Liste entpackter Erweiterungsverzeichnisse – jeweils ein Ordner mit einer manifest.json – an launch(), launch_persistent_context() oder serve() (.NET: Extensions = new[] { ... }). Sie werden in das Profil des Browsers geladen; nur die Inkognito-Starts können sie daher nicht aufnehmen (ephemeral_profile=False, launch() der Async-API, .NET LaunchAsync). Erweiterungen sind für Browser gedacht, die Sie mit dem SDK starten; gehostete Browser laden sie nicht.

python
from clearcote import launch_persistent_context

ctx = launch_persistent_context(
    "./profile",
    extensions=["./ext/ublock", "./ext/my-helper"],   # unpacked directories
)
page = ctx.pages[0] if ctx.pages else ctx.new_page()
page.goto("https://example.com")
javascript
import { launchPersistentContext } from "clearcote";

const ctx = await launchPersistentContext("./profile", {
  extensions: ["./ext/ublock", "./ext/my-helper"],
});

Das SDK setzt --load-extension und --disable-extensions-except gemeinsam für Sie. Auf diese Kombination kommt es an: Für sich allein wird --load-extension unter Automatisierung ignoriert – der übliche Grund, warum eine Erweiterung kommentarlos nicht auftaucht.

So kommen Sie an ein entpacktes Verzeichnis

Clearcote lädt Ordner, keine .crx-Dateien. Eine .crx ist ein ZIP mit Signatur-Header; entpacken Sie sie, erhalten Sie ein ladbares Verzeichnis:

bash
unzip extension.crx -d ./ext/extension

Clearcote kann Erweiterungen weder aus dem Chrome Web Store installieren noch von dort aktualisieren – die Privacy-Patches von Upstream entfernen diese Integration. Liefern Sie das entpackte Verzeichnis mit Ihrer Automatisierung aus und aktualisieren Sie es selbst: Auf diese Weise geladene Erweiterungen aktualisieren sich nie von allein. Playwright und Puppeteer verfahren nach demselben Modell.

Manifest V2 funktioniert weiterhin

Standard-Chrome führt keine Manifest-V2-Erweiterungen mehr aus. Clearcote schon, weil das Privacy-Patch-Set von Upstream diese Unterstützung wiederherstellt – Content-Blocker, die nur mit MV2 laufen, und ältere interne Tools funktionieren hier also weiter, nachdem sie in Chrome ihren Dienst eingestellt haben.

python
# both of these load and run
ctx = launch_persistent_context("./profile", extensions=["./ext/mv2-tool", "./ext/mv3-tool"])

Headless

Erweiterungen laden im Headless-Modus genauso wie im Headed-Modus. Keine zusätzlichen Flags, und Sie brauchen auch keinen Display-Server, nur damit eine Erweiterung funktioniert.

python
ctx = launch_persistent_context("./profile", extensions=["./ext/my-helper"], headless=True)

Was das für den Fingerprint bedeutet

Eine Erweiterung ist Ihr Code, der in Ihrem Profil läuft, und Clearcote versteckt sie nicht. Daraus folgen zwei Dinge, und über beide sollten Sie bewusst entscheiden, statt sie später zu entdecken.

  • Erweiterungen sind beobachtbar. Ein Content-Script, das das DOM umschreibt, Styles injiziert oder Requests blockiert, verändert, was eine Seite misst. Eine Website, die ihr eigenes Markup mit dem vergleicht, was sie ausgeliefert hat, kann erkennen, dass etwas die Seite verändert hat. Das gilt für jeden Browser mit Erweiterungen und ist kein Clearcote-spezifisches Signal – aber eben ein Signal.
  • Web-Accessible Resources lassen sich abfragen. Deklariert eine Erweiterung web_accessible_resources, kann jede Seite versuchen, chrome-extension://<id>/<file> abzurufen, und so erfahren, dass die Erweiterung vorhanden ist. Bevorzugen Sie Erweiterungen, die keine deklarieren, und denken Sie bei denen, die es müssen, an use_dynamic_url.

Wenn es Ihnen ums Blockieren von Requests geht und nicht um eine UI, bietet es sich an, das in der Automatisierungsschicht mit CDP Network.setBlockedURLs zu erledigen – das blockiert nach URL-Muster, fügt keine Erweiterungs-Oberfläche hinzu und behält den Browser-Cache bei (Playwrights page.route() funktioniert auch, schaltet den Cache aber ab). Das allgemeine Prinzip steht unter Empfohlene Einstellungen: Spoofen Sie nur, was Sie brauchen, und fügen Sie nur Oberfläche hinzu, die ihren Platz verdient.

Fehlerbehebung

  • Nichts passiert. Prüfen Sie, ob der Pfad auf den Ordner mit der manifest.json zeigt – nicht auf den übergeordneten Ordner und nicht auf eine .crx.
  • Das Content-Script läuft nie. Stellen Sie sicher, dass das matches-Muster die aufgerufene URL abdeckt – http://localhost/* passt nicht auf http://127.0.0.1:8080/.
  • Headed funktioniert es, headless nicht. Das sollte mit diesem Build nicht vorkommen; beides funktioniert. Falls es Ihnen doch passiert, eröffnen Sie bitte ein Issue mit dem Manifest.