Skip to content

ftes/phoenix_test_playwright

ftes /

Read-only mirror — pushes are disabled.

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog.

[0.16.0] 2026-08-27

Added

  • Support phoenix_test v0.12.1:
    • Target links, buttons, form controls, and assertions via aria-label and single-reference aria-labelledby using Playwright's native locators.

Changed

  • Document where Playwright's accessible-name and label-locator semantics intentionally differ from PhoenixTest's HTML parser.
  • Document that select(..., exact_option: false) is unsupported because Playwright selects option labels exactly.
  • Isolate Playwright-specific tests with test-local markup instead of a shared LiveView fixture.

Fixed

  • Eliminate compiler warnings under Elixir 1.20.
  • Match PhoenixTest assertion semantics for label exactness, one-based at positions, title refutations, and Phoenix.HTML.Safe text and values.
  • Fix for assert_has(selector, text: ...) failing when a hidden text match precedes a visible one in DOM order (#194)
  • Make click(selector, text) click the selector element containing visible text without hidden duplicate text descendants causing a strictness failure (#220)
  • Wait for browser contexts and browsers to close during graceful ExUnit and application shutdown, closing pooled browsers concurrently (#205)

[0.15.0] 2026-06-19

Added

  • assert_screenshot/3: visual regression testing. Commit 18353cc, [@Wigny], #181

Changed

  • Validate keyword options instead of silently ignoring unknown keys. Commit aacc30c, #180
  • visit/3: Accept all supported options for goto. Commit 7f126e0, [@s3cur3], #171
  • assert_has/3, refute_has/3: Honour options checked, selected. Commit 43c689e, #179

Fixed

  • submit/1: submit form properly if last interacted input was a 'select' (don't submit via 'Enter' press due to varying OS behaviour). Commit [d85dfc8], #165

[0.14.0] 2026-05-05

Added

  • Support phoenix_test v0.11.1. Commit f60d668
    • Add assert_download/2. Commit 244a0f5
  • PhoenixTest.Playwright.evaluate/3-4: support function expressions via is_function: true and pass arguments via arg. Commit 2730ab5
  • Support multiple sessions in async: false suites. Commit 270d1c2, [@rubysolo]

[0.13.0] 2026-03-06

Added

  • Support phoenix_test v0.10.0
    • Add reload_page/2

[0.12.1] 2026-02-23

Added

  • Recommend browser_pool: false when using ws_endpoint (remote server has a single pre-launched browser). Commit 60f4b6f

Changed

  • Use browser_pool: false (instead of nil) to disable browser pooling. Commit 74eb3a7

Fixed

  • Case.new_session/2: 'already allowed' error (regression in v0.12.0, commit 0a8538c). Commit 281d71a

[0.12.0] 2026-02-22

Added

  • PhoenixTest.Playwright.evaluate/2-4: evaluate JavaScript snippets in the browser. Commit eead742
  • usage-rules.md for LLM coding agents (via usage_rules). Commit 80eb40c
  • timeout option for custom Playwright public functions (evaluate, step, click, etc.). Commit 0799600
  • drag/3: pass additional options through to Playwright. Commit fc3f15c

Fixed

  • assert_path/refute_path now work after LiveView patches and navigations (push_patch, push_navigate, etc.). Commit 2fdd358
  • Restore helpful error message when browser_launch_timeout is too small (lost during browser pool introduction). Commit 596f938

[0.11.1] 2026-02-10

Fixed

  • Fix regression: Config validation error if browser_pools not set. Commit 987828e
  • Fix regression: Don't rely on package-lock.json for bun. Commit 8b342a8

[0.11.0] 2026-02-09

Added

Changed

  • Browser pools: Fall back to global options (headless, slow_mo etc). Commit 72b9799

[0.10.1] 2026-01-30

Added

  • PhoenixTest.Playwright.step/3: label groups of actions in a trace with automatic source file and line. Commit 3eaeb5a, [@nathanl]

[0.10.0] 2025-12-24

Fixed

  • Correctly handle custom options via browser_context_opts and browser_page_opts config. Commit 2b80c87, [@melucasleite]

Added

  • Support timeout opt in PhoenixTest.Playwright.visit/3. Commit 7073add, [@s3cur3]

Removed

  • runner config: Don't fequired npm or bun, invoke cli.js directly. Commit 1605dce

[0.10.0-rc.0] 2025-11-19

Breaking changes

  • Use browser pool by default, instead of starting new browser per test suite. Commit 095e216
    # test_helper.exs
    + {:ok, _} = PhoenixTest.Playwright.Supervisor.start_link()
    Application.put_env(:phoenix_test, :base_url, MyAppWeb.Endpoint.url())
  • Changes required if internals (beyond PhoenixTest and PhoenixTest.Playwright modules) were used. Phoenix-agnostic modules moved to PlaywrightEx, with slight API changes. Example:
    - |> unwrap(& {:ok, _} = PhoenixTest.Playwright.Frame.click(&1.frame_id, selector))
    + |> unwrap(& {:ok, _} = PlaywrightEx.Frame.click(&1.frame_id, selector: selector, timeout: timeout())

Changed

  • Ecto sandbox ownership: Use a separate sandbox owner process instead of the test process. This reduces ownership errors when LiveViews continue to use database connections after the test terminates. Commit 3b54699

Added

  • Config option ecto_sandbox_stop_owner_delay: Delay in milliseconds before shutting down the Ecto sandbox owner. Use when LiveViews or other processes need time to stop using the connections. Commit 2f4a8cf

[0.9.1] 2025-10-29

Added

  • Browser pooling (opt-in): Reduced memory, higher speed. Commit 00e75c6

[0.9.0] 2025-10-26

Fixed

  • assert_has/refute_has: don't raise if multiple nodes found when using value option (playwright strict mode). Commit 73ebf10

Changed

  • Return result tuples from all playwright channel functions for consistency and to surface errors early. Commit ae63989
    • Most notably may affect callers of Frame.evaluate/3

Added

  • Register custom selector engines via new config option selector_engines. Commit 73ebf10
  • Import click/2 in Playwright.Case. Commit 968d5cd
  • Add drag and drop: drag(source, to: target). Commit f4161bd

[0.8.0] 2025-09-17

Removed

  • Config option cli. Use assets_dir instead. Commit 9e95e54, [@Wigny]

Added

  • Support bunx JS runner. Added config options runner and assets_dir. Commit 9e95e54, [@Wigny]
  • Support missing assert_has/refute_has options: label and value. Commit 2e92cbe
  • Support phoenix_test 0.8 (lazy_html). Commit 1074cde

Changed

  • Include source location when logging javascript errors and browser console logs. Commit 6b148f, [@tomfarm]
  • Only consider visible inputs for fill_in etc. Commit 86c2e3d
  • Speed up refute_has: Use playwright browser internal retry. Commit aac0497

[0.7.1] 2025-07-01

Added

  • Config option executable_path: allow using existing browser executable instead of bundled browser (e.g. on NixOS). Commit 15df46

Fixed

  • refute_has/3 add retry, don't fail if element initially found. Commit 7bd49b

[0.7.0] 2025-06-16

Added

  • Dialog handling. Commit 4eadea
    • Config option accept_dialogs (default: true)
    • PhoenixTest.Playwright.with_dialog/3 for conditional handling

Removed

  • Connection.received/1. Commit 4eadea
    • Use EventRecorder instead

[0.6.3] 2025-05-05

Added

  • Add locale to avoid console warnings. Commit [becf5e6], [@peaceful-james]

Fixed

  • Trigger phx-change event for input with phx-debounce="blur". Commit 72edd9

[0.6.2] 2025-04-24

Changed

  • Frame.evaluate/3: Don't transform map keys in return value. Example: js {camelCase: {a: 1}} -> ex %{"camelCase": %{"a": 1}}. Previously attempted to underscore and atom-ize keys, which led to issue #24. Commit 5ff530

[0.6.1] 2025-04-02

Added

  • Support relevant phoenix_test 0.6 features
    • ✅ Deprecate select with :from in favor of :option (handled by PhoenixTest)
    • ✅ Allow nesting of within/3
    • ✅ Allow calling visit/2 sequentially (was already supported)
    • ❌ Raise error when visiting a defined route: In a feature test, we assert on the rendered page, not the status code.

[0.6.0] 2025-03-18

Added

  • Add and remove cookies: add_cookies/2, add_session_cookie/3, clear_cookies/{1,2} [@peaceful-james]
  • Add option browser_launch_timeout for more fine-grained control (is typically a lot slower than other actions) [@s3cur3]

[0.5.0] 2025-02-14

Added

  • Docs: Document and validate global and per-test configuration
  • Docs: Document non-standard driver functions (click/4, click_button/4 etc.). Also, exclude standard driver functions from docs.
  • Config: Override config via Case opts, e.g. use PhoenixTest.Playwright.Case, headless: false
  • Keyboard simulation: type/{3,4} and press/{3,4}

Changed

  • Renamed: PheonixTest.Case to PhoenixTest.Playwright.Case
    defmodule MyTest do
    - use PhoenixTest.Case, async: true
    + use PhoenixTest.Playwright.Case, async: true
    - @moduletag :playwright

[0.4.0] 2025-02-03

Added

  • Screenshots: screenshot/{2,3} function and screenshot: true config for auto-capture [@s3cur3]

Changed

  • Config: flattened list (remove nested browser config), override via top-level ExUnit @tag ...s (remove nested @tag playwright: [...])
    # config/test.exs
    config :phoenix_test,
    playwright: [
    - browser: [browser: :chromium, headless: false, slow_mo: 0]
    + browser: :chromium,
    + headless: false,
    + slow_mo: 0

[0.3.0] 2025-01-26

Changed

  • Auto-convert case of playwright messages keys (snake_case to camelCase)

[0.2.1] 2025-01-17

Added

  • Add more config options (browser, JS console) [@s3cur3]

Changed

  • Improve error messages [@s3cur3]
  • Improve setup and docs for contributors [@s3cur3]

[0.2.0] 2025-01-09

Added

  • support phoenix_test@0.5, elixir@1.18, phoenix_live_view@1.0

[0.1.5] 2024-12-15

Added

  • @tag trace: :open to auto open recorded Playwright trace in viewer

[@melucasleite]: https://github.com/melucasleite [@s3cur3]: https://github.com/s3cur3 [@Wigny]: https://github.com/Wigny [@tomfarm]: https://github.com/tomfarm [@peaceful-james]: https://github.com/peaceful-james [@nathanl]: https://github.com/nathanl [@carsoncall]: https://github.com/carsoncall [@rubysolo]: https://github.com/rubysolo