 # 🤖 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



 

   

 **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.

 

 

 

  

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 &amp;&amp; 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: () =&gt; 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 &amp;&amp; !navigator.mimeTypes.length); // Check for missing chrome.runtime const hasChromeRuntime = window.chrome &amp;&amp; window.chrome.runtime; // Check permissions API navigator.permissions.query({ name: 'notifications' }).then(result =&gt; { 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); 

 

 

 

 





${test.status.toUpperCase()}

${String(test.value)}

${test.description}

 `; grid.appendChild(item); }); } // Toggle accordion - now handled by Bootstrap 4 collapse (see \_tools.js) // Run tests on page load document.addEventListener('DOMContentLoaded', () =&gt; { runDetectionTests(); });