Start · Sprachen · JavaScript · Referenz · Navigator.webdriver

Navigator.webdriver

Eigenschaft

Schreibgeschützte Eigenschaft, die angibt, ob der Browser gerade durch Automatisierung (WebDriver, Puppeteer, Playwright u. a.) gesteuert wird.

seit JavaScript Baseline: alle modernen Browser (Chrome 89+, Firef Kategorie: webapi

Signatur

Navigator.webdriver

Beschreibung

Die schreibgeschützte Eigenschaft navigator.webdriver liefert einen booleschen Wert. Ist sie true, wird der User-Agent gerade von einem Automatisierungswerkzeug gesteuert. Das ist in der W3C-WebDriver-Spezifikation festgelegt. Typische Auslöser sind Selenium/WebDriver, Chrome mit --enable-automation oder --remote-debugging-port in Kombination mit Automatisierung (Puppeteer, Playwright) sowie Firefox mit gesetzter Einstellung marionette.enabled bzw. dem Flag --marionette.

Die Eigenschaft soll Websites einen standardisierten Weg geben, automatisierte Sitzungen zu erkennen. Anwendungsfälle sind etwa: Analytics-Daten von Testläufen bereinigen, in End-to-End-Tests Animationen, Tracking oder Cookie-Banner abschalten, oder als ein Signal unter vielen in der Bot-Erkennung.

In einer normalen, von Menschen bedienten Browsersitzung ist der Wert false. Die Eigenschaft ist auch in Web Workern über WorkerNavigator.webdriver verfügbar.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn der Browser durch Automatisierung gesteuert wird, sonst false.

Beispiele

Einfache Abfrage

if (navigator.webdriver) {
  console.log('Automatisierte Sitzung erkannt');
} else {
  console.log('Normale Browsersitzung');
}
Normale Browsersitzung

Analytics in Testläufen deaktivieren

const initAnalytics = () => {
  // Keine Tracking-Daten aus E2E-Tests (Playwright, Selenium …) sammeln
  if (navigator.webdriver === true) {
    console.info('Analytics übersprungen: Automatisierung aktiv');
    return;
  }
  const script = document.createElement('script');
  script.src = 'https://example.com/analytics.js';
  script.async = true;
  document.head.append(script);
};

initAnalytics();
Analytics übersprungen: Automatisierung aktiv (nur in automatisierten Sitzungen)

Animationen für stabile E2E-Tests abschalten

// Unter Automatisierung Übergänge deaktivieren, damit Screenshots reproduzierbar sind
if (navigator.webdriver) {
  document.documentElement.classList.add('no-animations');
}

// Im CSS: .no-animations * { transition: none !important; animation: none !important; }
console.log(document.documentElement.classList.contains('no-animations'));
true (in einer WebDriver-Sitzung)

Wert zusammen mit weiteren Signalen an den Server senden

const collectClientSignals = () => ({
  webdriver: navigator.webdriver ?? null, // null in sehr alten Browsern
  languages: navigator.languages,
  hardwareConcurrency: navigator.hardwareConcurrency,
});

const sendSignals = async () => {
  await fetch('/api/client-signals', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(collectClientSignals()),
  });
};

sendSignals();

// Wichtig · Fallstricke

  • Kein Sicherheitsmerkmal: Die Eigenschaft lässt sich leicht fälschen. Chrome mit --disable-blink-features=AutomationControlled, Stealth-Plugins oder ein einfaches Object.defineProperty(Navigator.prototype, 'webdriver', { get: () => false }) setzen sie auf false. Für Bot-Abwehr nur als ein Signal unter vielen verwenden und immer serverseitig absichern (Rate-Limiting, CAPTCHA usw.).
  • Umgekehrt kann auch ein legitimer Nutzer mit Hilfstechnik oder Testwerkzeugen true melden. Nutzer deshalb nicht allein wegen dieses Werts aussperren.
  • Ältere Browser (z. B. Chrome vor Version 63) kennen die Eigenschaft nicht und liefern undefined. Deshalb gezielt auf === true prüfen.
  • Chrome setzt den Wert erst seit Version 89 auch im Headless-Modus zuverlässig. Sonst hängt er von den Startflags ab.
  • Die Eigenschaft ist schreibgeschützt: Eine Zuweisung wie navigator.webdriver = false wird ignoriert (im Strict Mode gibt es einen TypeError).