Bot Arena

About this demo

Bot Arena is a deliberately-obvious target for browser automation. It has 13 sign-in pages organised into two sections — every page is built so a stock Playwright test (getByLabel('Email').fill(...), click Sign in, expect "Access granted") fails for a different, named reason.

The site does not run any automation itself. It is designed to be a target you point your own tool at. The Detection Log panel on every page shows, in real time, every signal the page captured — passed signals in green, failed signals in red — so you can see exactly which checks your tool tripped.

The two sections

Section 1 — Bot detection (5 levels)

The site detects automation through fingerprinting, behavioural signals, or third-party challenge. Levels:

  1. The honest tell — webdriver flags, plugins, UA hints.
  2. CDP attached — browser-chrome shape, missing Chrome surface, taskbar.
  3. Mouse trajectory — mousemove density and curvature.
  4. Fingerprint battery — canvas, audio, WebGL, fonts.
  5. Cloudflare Turnstile — real managed-mode widget.

Section 2 — Selector resistance (8 levels)

The DOM that selector-based automation depends on is absent, randomised, sealed, in a different frame, or unreachable without vision. Levels:

  1. Canvas-rendered login — no DOM form; just pixels.
  2. Dynamic selectors — every id/name/class rerolls per request.
  3. Closed Shadow DOM — form sealed inside a Web Component.
  4. Iframe-embedded form — form in a child frame.
  5. Slider verification — drag-to-align CAPTCHA.
  6. Image-only labels — every label rendered as a graphic.
  7. Cross-origin iframe — Stripe/Auth0-style isolation.
  8. Virtual scrolling — 1,000-row list, off-screen rows not in DOM.

Reading the Detection Log

The failure report

The failure report at /report is a static dashboard with one card per level. Each card includes:

Running the test suite

A Playwright test suite at playwright/levels.spec.ts in the repo runs one sign-in test per level against the live site. All 13 tests fail by design — that is the demo. To run it locally:

git clone https://github.com/vaclavnovotny/bot-arena
cd bot-arena
npm install
npx playwright install chromium
npx playwright test

A test passing in the future means a detection technique stopped working, or browser changes lifted a selector-resistance restriction.

Hosting & stack

No tracking

The site stores nothing about your visit. The Detection Log lives in browser memory and resets when you reload. The one server endpoint (Level 5's Turnstile verification) calls Cloudflare's siteverify API and immediately discards the token. No analytics, no cookies beyond what Turnstile itself sets.

Source: github.com/vaclavnovotny/bot-arena — companion to the AIVA automation product at Y Soft.