Signatur
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
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');
}
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();
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'));
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 einfachesObject.defineProperty(Navigator.prototype, 'webdriver', { get: () => false })setzen sie auffalse. 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
truemelden. 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=== trueprü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 = falsewird ignoriert (im Strict Mode gibt es einenTypeError).