Wallabidi is a concurrent browser testing for Elixir. You write a test once and it runs on the cheapest driver that supports it — from an in-process LiveView render up to a full real browser — in a single mix test run.
It’s a fork of Wallaby, whose Browser/Query/Element/Feature/DSL APIs it keeps close to (migration is largely a find-and-replace). Wallaby is excellent; we forked because the changes we wanted — replacing the whole transport layer, dropping Selenium and the HTTP-polling model, and adding LiveView-aware waiting — were too invasive to land upstream without breaking existing users.
Four drivers, one suite:
- Liveview (In-process via Phoenix.ConnTest, no browser) - runs untagged tests
- Lightpanda (Headless JS browser over CDP) - runs @tag :headless
- Chrome (CDP) (Full browser via Chrome DevTools Protocol) - @tag :browser
- Chrome (BiDi) (Full browser via WebDriver Bidi) - not used by default
Each test declares its minimum capability with a tag; wallabidi routes it to the cheapest driver that satisfies it, with sensible zero-config defaults. No chromedriver, no Selenium server — drivers are spoken to directly over WebSocket.
What’s different from Wallaby:
- LiveView-aware waiting on every interaction. visit, click, fill_in, and assert_has automatically wait for the right thing — the LiveSocket to connect, the DOM patch to land, the async update to arrive — by hooking LiveView’s onPatchEnd
and a MutationObserver, never polling. No manual sleep/retry loops. - Direct CDP/BiDi transport over WebSocket — event-driven log/error capture, request interception, lower latency, no chromedriver process to manage.
- Test isolation built in. Integrates with sandbox_case and sandbox_shim to propagate Ecto/Cachex/FunWithFlags/Mimic/Mox sandboxes to every server-side process a browser triggers — across all remote drivers.
- Removed: the Selenium driver and the HTTPoison/Hackney dependency stack.
Concurrency. LiveView, Lightpanda, and Chrome CDP all run well at ExUnit’s default --max-cases; only the BiDi driver currently benefits from a cap (–max-cases 8).
Requires Elixir 1.18+, OTP 28+. Firefox via GeckoDriver is architecturally possible (it also speaks BiDi) but not yet implemented. If you need the Selenium/Java server, stay on Wallaby.
Docs: wallabidi v0.4.0 — Documentation
Hex: wallabidi | Hex






















