Elixir client for Playwright. Automate Chromium, Firefox and WebKit: end-to-end tests, web scraping, agentic AI.
PlaywrightEx is a 1:1 port of the official JavaScript client. Its API is generated from
Playwright's docs, so the docs at playwright.dev apply. The driver (Node.js and playwright-core)
is pinned and installed by Mix, no npm needed. This release drives Playwright 1.65.
def deps do
[
{:playwright_ex, "~> 0.17.0-rc.5"}
]
endmix deps.get
mix playwright_ex.installalias PlaywrightEx.{Browser, BrowserType, Expect, Locator, Page, Playwright}
{:ok, _} = PlaywrightEx.Supervisor.start_link()
browser = BrowserType.launch!(Playwright.chromium(PlaywrightEx.playwright()))
page = Browser.new_page!(browser)
Page.goto!(page, "https://elixir-lang.org/")
Page.get_by_role(page, :link, name: "Install") |> Locator.click!()
Expect.to_have_title!(page, ~r/Install/)
# Closes the browser and waits for the driver to exit before the VM halts.
Supervisor.stop(PlaywrightEx)timeout: 0 means no timeout. As in Playwright JS, it waits forever instead of failing at
once. :infinity is the same and reads better in Elixir.
The Python docs are the closest read, since the
names match Python's: snake_case, keyword options, expect_popup, eval_on_selector.
page.get_by_role("button").click() is Page.get_by_role(page, :button) |> Locator.click!().
- Getting started: install, the driver, a first script.
- From playwright.dev to Elixir: how a JS call reads in Elixir.
- Cheatsheet: frequent calls, JS next to Elixir.
- Testing with ExUnit: a browser case template, assertions, failures.
- Events and waiting, Network, Debugging and CI.
- Concurrency: listeners, promises and processes.
- Migrating from 0.16.
Feedback of any shape and size is welcome: get in touch.
mix setupinstalls dependencies, the pinned Playwright driver and Chromium.mix test, ormix checkfor everything CI runs.- Porting rules:
PORTING.md; the why behind the design:docs/architecture.md.