pinetops

pinetops

Wallabidi - Concurrent browser testing for Elixir over WebDriver BiDi/CDP, a fork of Wallaby

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.1 — Documentation
Hex: wallabidi | Hex

Most Liked

felix-starman

felix-starman

I have been following your releases on hex for a little bit after I found it accidentally when checking that the docs rendered properly for bibbidi.

I have a version 0.4 of bibbidi coming out and a higher level bobbidi library and am planning to get an adapter built for wallabidi mainly to test the interface and process reaping.

I’m excited to see wallabidi progress :heart::heart::heart:

Where Next?

Popular in Announcing Top

tmbb
I’ve published the first version of my Makeup library. It’s a syntax highlighter for Elixir in the spirit of Pygments, Currently it highl...
New
OvermindDL1
I created a new library (rather I pulled out a couple files from my big project), it manages an operating system PID file for the BEAM. ...
New
tmbb
PhoenixWS - Websockets over Phoenix Channels Source code on Github here: GitHub - tmbb/phoenix_ws: Websockets implemented over Phoenix Ch...
New
seancribbs
Today I released a new dialyzer Mix task as the dialyzex package! At the time we started writing this task, the existing dialyzer integra...
New
maltoe
Hello! Came here to announce ChromicPDF, a pet project PDF generator I’ve been working on for the past few months. Why another PDF gener...
New
cjen07
parameterized pipe in elixir: |n> edit: negative index in |n> and mixed usage with |> are supported example: use ParamPipe ...
New
archan937
It is a well-know topic within the Elixir community: “To mock or not to mock? :)” Every alchemist probably has his / her own opinion con...
New
tmbb
I’ve decided to create this topic to discuss optimization possibilities for something like Phoenix LiveView. I’ve created this topic unde...
144 10483 141
New
wfgilman
I’ve cleaned up and open sourced three financial libraries I was using for my company. They are bindings for the APIs of these three comp...
New
mattludwigs
Grizzly is a library for working with Z-Wave devices. Z-Wave is a low-frequency radio protocol for controlling smart home devices on a me...
New

Other popular topics Top

malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
josevalim
Hi everyone, One of the features added to Elixir early on to help integration with Erlang code was the idea of overridable function defi...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39523 209
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36432 110
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

We're in Beta

About us Mission Statement