Running browser-based tests in parallel is one of the biggest bottlenecks in CI/CD pipelines. Commercial solutions like BrowserStack and Sauce Labs charge per parallel slot, and costs quickly spiral for teams with large test suites. Self-hosting a browser testing grid gives you unlimited parallel execution, full data privacy, and zero per-minute charges — but only if you pick the right tool.
This guide compares the three most capable self-hosted browser grid solutions in 2026: Selenoid, Moon (by Aerokube), and the official Selenium Grid. We cover architecture, Docker Compose setups, scaling strategies, and real-world performance characteristics so you can choose the best fit for your infrastructure.
Architecture Overview
Selenoid
Selenoid is a lightweight Selenium Hub replacement written in Go. Instead of running a central hub with registered nodes, Selenoid launches a fresh browser container for every test session and destroys it when the session ends. This immutable approach eliminates the stale-node problem that plagues traditional Selenium Grid setups.
Key characteristics:
- Single binary (~15 MB), no Java dependency
- Spins up Docker containers on-demand per session
- Supports Chrome, Firefox, Edge, Opera, and Android emulators
- Built-in VNC, video recording, and log capture
- Horizontal scaling via Selenoid UI and multiple instances
Moon
Moon is Aerokube’s enterprise-grade successor to Selenoid, designed specifically for Kubernetes and OpenShift environments. It extends the Selenoid model with advanced scheduling, resource quotas, and multi-cluster support.
Key characteristics:
- Kubernetes-native, uses Custom Resource Definitions (CRDs)
- Supports Selenium, Playwright, Puppeteer, and Cypress protocols
- Automatic pod scheduling with resource limits per test
- Built-in queue management for handling peak loads
- Enterprise features: RBAC, audit logging, SSO integration
Selenium Grid
The official Selenium Grid (version 4+) provides a distributed testing architecture with a router, session map, distributor, and node components. It uses a hub-and-node model where nodes register with the hub and receive session requests.
Key characteristics:
- Official Selenium project, widest browser and driver compatibility
- Docker-based deployment via docker-selenium images
- Grid UI for monitoring active sessions and node health
- Supports Chrome, Firefox, Edge, and Safari (on macOS nodes)
- Native integration with Selenium WebDriver and language bindings
Feature Comparison
| Feature | Selenoid | Moon | Selenium Grid |
|---|---|---|---|
| Architecture | Container-per-session | Kubernetes CRDs | Hub-and-node |
| Language | Go | Go | Java |
| Binary Size | ~15 MB | ~20 MB | ~60 MB (JAR) |
| Kubernetes Native | No (runs on Docker) | Yes | Partial (Helm charts) |
| Playwright Support | Limited | Native | No |
| Puppeteer Support | No | Native | No |
| Cypress Support | No | Native | No |
| Video Recording | Built-in | Built-in | Via external tools |
| VNC Access | Built-in | Built-in | Via VNC images |
| Session Queue | Basic | Advanced (with priorities) | Basic |
| Max Parallel | Host-limited | Cluster-limited | Node-limited |
| License | Apache 2.0 | Commercial (free tier) | Apache 2.0 |
| Stars (GitHub) | 2,650+ | 270+ | 8,600+ (docker-selenium) |
| Last Active | Dec 2024 | Apr 2026 | Apr 2026 |
Docker Compose Setup
Selenoid Quick Start
Selenoid uses a single binary and a browsers.json configuration file. The easiest way to deploy is via the CM (Configuration Manager) tool:
| |
For a manual Docker Compose deployment:
| |
The browsers.json file in ./config/ defines available browser versions:
| |
Moon Kubernetes Deployment
Moon requires Kubernetes and deploys via Helm:
| |
A Moon configuration (moon.conf.yaml) defines browser quotas and pool sizes:
| |
Moon also requires a browser image registry. Official images are available for Chrome, Firefox, and Edge:
| |
Selenium Grid Docker Compose
Selenium Grid 4 uses a multi-container architecture:
| |
Scale nodes independently based on test load:
| |
Performance Comparison
In real-world benchmarks running 500 parallel WebDriver sessions:
| Metric | Selenoid | Moon | Selenium Grid |
|---|---|---|---|
| Startup Time (per session) | ~2s | ~3s (K8s pod scheduling) | ~5s (node registration) |
| Memory per Browser | ~300 MB | ~250 MB (shared K8s pool) | ~400 MB |
| Max Sessions (4-core host) | 15-20 | 30+ (cluster-scaled) | 10-15 |
| Session Cleanup | Automatic (container kill) | Automatic (pod deletion) | Manual/stale risk |
| Resource Overhead | Low (Go binary) | Medium (K8s control plane) | High (JVM) |
Selenoid’s container-per-session model is the most resource-efficient on bare-metal hosts. Moon excels in Kubernetes environments where it can leverage cluster-wide resource pooling. Selenium Grid has the highest overhead but benefits from official Selenium project support and widest compatibility.
CI/CD Integration
GitHub Actions with Selenoid
| |
GitLab CI with Selenium Grid
| |
Choosing the Right Tool
Choose Selenoid if:
- You need a lightweight, single-binary solution on Docker hosts
- You want the fastest session startup times
- You need built-in video recording and VNC without extra configuration
- Your team runs 5-20 parallel sessions on a single host
Choose Moon if:
- You already run Kubernetes or OpenShift
- You need Playwright, Puppeteer, or Cypress support alongside Selenium
- You require advanced queue management with priority scheduling
- You need enterprise features like RBAC and audit logging
Choose Selenium Grid if:
- You want official Selenium project compatibility and support
- You need the widest browser and OS combination support
- You are migrating from an existing Selenium Grid 3 setup
- Your team values community support and extensive documentation
Why Self-Host Your Browser Testing Grid?
Commercial browser testing platforms like BrowserStack, Sauce Labs, and LambdaTest have become prohibitively expensive for teams with large test suites. A BrowserStack automate plan starts at $149/month for 1 parallel session and scales to $599/month for 3 parallel sessions. For a team running hundreds of tests across multiple browsers, the cost can easily exceed $2,000-3,000 per month.
Self-hosting a browser testing grid eliminates these costs entirely:
- Unlimited parallel sessions — scale to your hardware capacity, not a subscription tier
- No per-minute billing — run as many tests as needed without metering
- Complete test data privacy — your application URLs, credentials, and test data never leave your infrastructure
- Custom browser configurations — install specific extensions, configure proxy settings, or test against internal staging environments that external services cannot reach
- Faster feedback loops — running tests on your own hardware eliminates network latency to commercial cloud data centers
- No vendor lock-in — all three tools use the standard WebDriver protocol, so switching between them requires minimal test code changes
For teams running chaos testing or container virtualization workloads, having a local browser testing grid integrates seamlessly with existing self-hosted CI/CD infrastructure.
FAQ
Can Selenoid run Playwright tests?
Selenoid has limited Playwright support through its CDP (Chrome DevTools Protocol) endpoint, but it is not a native Playwright grid. Moon, by contrast, has first-class Playwright support and can run Playwright scripts directly. For pure Playwright workflows, Moon is the better choice.
How many parallel sessions can a single host handle?
On a typical 4-core, 16 GB RAM server, you can run approximately 15-20 Chrome or Firefox sessions with Selenoid. Each browser container consumes roughly 300 MB of RAM. Selenium Grid nodes typically handle 4-5 sessions per node container due to higher JVM overhead. Moon can schedule more sessions by distributing across multiple Kubernetes nodes.
Does Selenoid support Safari browser testing?
No. Safari requires macOS, and Selenoid’s Docker-based model cannot run macOS containers. If you need Safari testing, you must run a physical Mac with Selenium Grid nodes or use a commercial service for that specific browser.
Can I use Selenoid with Cypress?
Cypress does not use the WebDriver protocol and cannot directly connect to Selenoid or Selenium Grid. Moon is the only tool in this comparison with native Cypress support, running Cypress tests inside Kubernetes pods.
How do I scale Selenoid horizontally?
Run multiple Selenoid instances behind a load balancer (HAProxy, Nginx, or Traefik). Each instance manages its own Docker daemon. The Selenoid UI can aggregate session views from multiple instances for monitoring.
What is the difference between Moon free and paid tiers?
Moon’s free tier supports up to 3 concurrent users and basic browser pools. The paid tier adds RBAC, audit logging, SSO integration, priority queues, and multi-cluster scheduling. For small teams, the free tier is sufficient for most testing needs.
How do I record test videos in Selenium Grid?
Selenium Grid does not have built-in video recording. You need to use VNC-enabled Docker images (selenium/video:chrome_124.0) and run a separate video recording container, or integrate with tools like Selenoid’s video recorder. Moon and Selenoid both include video recording out of the box.
Can I run mobile browser tests on these platforms?
Selenoid supports Android browser testing via Android emulator containers. Moon supports mobile testing through its Kubernetes device plugins. Selenium Grid does not natively support mobile emulators — you need Appium nodes for mobile testing.