🤖 Automation Detection Tool

scrapfly.io · 2026-06-12 · by Long Nguyen ·generic
Detect if your browser is automated with Selenium, Puppeteer, Playwright or other automation tools. Test navigator.webdriver, CDP detection, headless mode indicators and runtime manipulation.

🤖 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
  • 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 && 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);

scrapfly.io · 7 images · 85 links

Comments (0)

No comments yet