🤖 Automation Detection Tool

Detect if your browser is automated with Selenium, Puppeteer, Playwright or other automation frameworks. Test for navigator.webdriver, Chrome DevTools Protocol detection, headless mode indicators, and runtime manipulation.

Running Detection Tests...

Checking for automation signals

Not Automated

This browser shows no signs of automation

0
Detected Signals
0
Safe Signals
0
Suspicious Signals
0
Total Tests
Privacy Notice

Anti-bot systems use these signals to detect automated browsers and web scrapers. Each detected signal makes your browser more identifiable. If you're building a web scraper, you should spoof or hide these signals.

Navigator.webdriver Detection

Chrome DevTools Protocol (CDP)

Headless Browser Indicators

Runtime Manipulation

Automation Framework Markers

What is Automation Detection?

Automation detection is the process of identifying whether a browser is controlled by automation tools like Selenium, Puppeteer, Playwright, or other web scraping frameworks. Anti-bot systems use dozens of signals to detect automated browsers:

  • navigator.webdriver - Set to true when browser is automated
  • CDP detection - Chrome DevTools Protocol leaves traces
  • Headless mode - Missing window/screen properties
  • Runtime manipulation - Overridden native functions
  • Permission inconsistencies - Permissions API behaves differently
  • Object property mismatches - toString() and prototype chains

Modern anti-bot systems like DataDome, PerimeterX, and Cloudflare combine these signals with behavioral analysis to detect bots with high accuracy.

Automation Framework Detection

Each automation framework leaves unique markers:

Selenium
  • window._selenium, window._Selenium_IDE_Recorder
  • document.$cdc_* properties
  • navigator.webdriver === true
  • Chromedriver adds window.cdc_* variables
Puppeteer
  • navigator.webdriver === true (unless patched)
  • Chrome DevTools Protocol detection via Runtime.enable
  • Missing chrome.runtime in headless mode
  • Permissions API inconsistencies
Playwright
  • navigator.webdriver === true
  • CDP artifacts similar to Puppeteer
  • navigator.plugins.length === 0 in headless
  • User-Agent inconsistencies with platform
// Example: Detecting Selenium if (navigator.webdriver) { console.log('Selenium detected: navigator.webdriver'); } // Example: Detecting Puppeteer/Playwright via CDP if (window.chrome && window.chrome.runtime) { console.log('Chrome runtime exists - likely not headless'); } else { console.log('Suspicious: Missing chrome.runtime'); }

How to Bypass Automation Detection

To make your automated browser undetectable:

1. Patch navigator.webdriver
// Selenium/Puppeteer patch Object.defineProperty(navigator, 'webdriver', { get: () => undefined });
2. Use Undetected ChromeDriver (Python)
import undetected_chromedriver as uc driver = uc.Chrome() driver.get('https://example.com')
3. Use Playwright Stealth Plugin
const { chromium } = require('playwright-extra'); const stealth = require('puppeteer-extra-plugin-stealth')(); chromium.use(stealth); const browser = await chromium.launch();
4. Disable Headless Detection
// Run in headed mode (slower but less detectable) const browser = await puppeteer.launch({ headless: false }); // Or use the new headless mode (Chrome 112+) const browser = await puppeteer.launch({ headless: 'new' // Uses --headless=new flag });
5. Use Scrapfly API (Recommended)

Scrapfly handles all anti-bot bypass automatically, including automation detection evasion. No need to maintain stealth scripts or worry about detection:

from scrapfly import ScrapflyClient, ScrapeConfig client = ScrapflyClient(key='YOUR_KEY') result = client.scrape(ScrapeConfig( url='https://example.com', asp=True, # Anti Scraping Protection bypass render_js=True )) print(result.content)

Programmatic Detection (JavaScript API)

You can run these detection tests programmatically in your own scripts:

// Check navigator.webdriver const isWebdriverDetected = navigator.webdriver === true; // Check for Selenium variables const hasSeleniumVars = window._selenium || window._Selenium_IDE_Recorder || document.$cdc_asdjflasutopfhvcZLmcfl_; // Check for headless Chrome const isChromeHeadless = navigator.userAgent.includes('HeadlessChrome') || (!navigator.plugins.length && !navigator.mimeTypes.length); // Check for missing chrome.runtime const hasChromeRuntime = window.chrome && window.chrome.runtime; // Check permissions API navigator.permissions.query({ name: 'notifications' }).then(result => { console.log('Notifications permission:', result.state); }); // Full detection result const automationResult = { webdriver: isWebdriverDetected, selenium: hasSeleniumVars, headless: isChromeHeadless, chromeRuntime: hasChromeRuntime, automated: isWebdriverDetected || hasSeleniumVars || isChromeHeadless }; console.log('Automation Detection:', automationResult);