This project tests various browser automation frameworks against CreepJS fingerprinting detection. It includes Docker configurations for Puppeteer, Playwright, Selenium, Golang chromedp, and Camoufox.
creepjs/
├── docker-compose.yml
├── Dockerfile.puppeteer
├── Dockerfile.playwright
├── Dockerfile.selenium
├── Dockerfile.golang
├── Dockerfile.camoufox
├── package.json
├── requirements.txt
├── requirements-camoufox.txt
├── go.mod
├── go.sum
├── src/
│ ├── puppeteer-scraper.js
│ ├── playwright-scraper.js
│ ├── selenium-scraper.py
│ ├── golang-scraper.go
│ └── camoufox-scraper.py
├── data/ # Screenshots will be saved here
└── README.md
- Docker
- Docker Compose V2 (comes with Docker Desktop)
To test all frameworks at once:
# Run each framework individually
docker compose up puppeteer-scraper
docker compose up playwright-scraper
docker compose up selenium-scraper
docker compose up golang-chromedp-scraper
docker compose up camoufox-scraperPuppeteer:
docker compose up puppeteer-scraperPlaywright:
docker compose up playwright-scraperSelenium:
docker compose up selenium-scraperGolang chromedp:
docker compose up golang-chromedp-scraperCamoufox:
docker compose up camoufox-scraperAfter running tests, screenshots will be saved in the ./data/ directory:
puppeteer-stealth-headless.png- Puppeteer with stealth (headless mode)puppeteer-stealth-xvfb.png- Puppeteer with stealth + Xvfbplaywright-stealth-headless.png- Playwright with stealth (headless mode)playwright-stealth-xvfb.png- Playwright with stealth + Xvfbselenium-stealth-headless.png- Selenium with UC (headless mode)selenium-stealth-xvfb.png- Selenium with UC + Xvfbgolang-stealth-headless.png- Golang chromedp (headless mode)golang-stealth-xvfb.png- Golang chromedp + Xvfbcamoufox-basic.png- Basic Firefox (no stealth)camoufox-stealth.png- Camoufox with all features + Xvfb
- Language: Node.js
- Stealth Plugin: puppeteer-extra-plugin-stealth
- Best Use Case: Node.js projects, large ecosystem
- Language: Node.js
- Stealth Plugin: puppeteer-extra-plugin-stealth (via playwright-extra)
- Best Use Case: Multi-browser support, modern API
- Language: Python
- Stealth Library: undetected-chromedriver
- Best Use Case: Python projects, mature ecosystem
- Language: Golang
- Stealth Approach: Chrome flags
- Best Use Case: High-performance, production-scale scraping
- Language: Python
- Stealth Approach: Firefox with built-in anti-fingerprinting
- Best Use Case: Maximum stealth, privacy-focused scraping
If you encounter build errors, try rebuilding without cache:
docker compose build --no-cache puppeteer-scraperIf you have permission issues with the data directory:
chmod -R 755 ./dataThe Dockerfiles handle Chrome/Chromium installation. If you see errors, ensure Docker has enough resources allocated (at least 2GB RAM).
Edit the source files and change the sleep/timeout duration:
// JavaScript (Puppeteer/Playwright)
await page.waitForTimeout(10000); // Change 10000 to desired milliseconds# Python (Selenium/Camoufox)
time.sleep(10) # Change 10 to desired seconds// Golang
chromedp.Sleep(10*time.Second), // Change 10 to desired secondsModify the target URL in each scraper file:
await page.goto('https://your-target-url.com/', { waitUntil: 'networkidle2' });To remove all containers and images:
docker compose down
docker system prune -aTo clean up only the data directory:
rm -rf ./data/*Feel free to submit issues or pull requests to improve the testing setup.
MIT
For a detailed explanation of these tests and results, read the full blog post: How to Bypass CreepJS Browser Fingerprinting in 2025