🤖 Automation Detection Tool
🤖 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
13
Safe Signals
1
Suspicious Signals
14
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
false
Set to true when browser is controlled by automation
Chrome DevTools Protocol (CDP)
Missing
Chrome runtime API - should be present in Chrome/Chromium browsers (Edge excluded)
prompt
Permissions API returns standard states (prompt/denied/granted)
Headless Browser Indicators
Normal
User-Agent contains "HeadlessChrome"
5
Normal browsers have plugins, headless browsers often have 0
2
Normal browsers have MIME types, headless browsers often have 0
4
Empty languages array is a strong automation signal
Runtime Manipulation
Native
Checks if Function.toString has been tampered with
Present
Checks if webdriver property descriptor has been modified
Automation Framework Markers
Not found
Selenium IDE Recorder variable
Not found
Selenium IDE Recorder variable
Not found
ChromeDriver property injection
Not found
PhantomJS marker
Not found
PhantomJS marker
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
- `window._selenium`, `window._Selenium_IDE_Recorder` `document.$cdc_` properties
- `navigator.webdriver === true` Chromedriver adds `window.cdc_` variables
- `navigator.webdriver === true` (unless patched)
- Chrome DevTools Protocol detection via Runtime.enable
- Missing `chrome.runtime` in headless mode
- Permissions API inconsistencies
- `navigator.webdriver === true`
- CDP artifacts similar to Puppeteer
- `navigator.plugins.length === 0` in headless
- User-Agent inconsistencies with platform
Modern anti-bot systems like DataDome, PerimeterX, and Cloudflare combine these signals with behavioral analysis to detect bots with high accuracy.
Each automation framework leaves unique markers:
##### Selenium
##### Puppeteer
##### Playwright
// 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'); }
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)
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);
