The table compares Fluffy's Phoenix and Playwright backends within the boundaries described below.

  • equivalent — matching behavior verified against Playwright;
  • structural subset — supports HTML-represented state, with browser-only behavior excluded;
  • - — unavailable or not applicable.
FeaturePhoenixPlaywright
Documented CSS locator subsetequivalentequivalent
Text, label, and attribute locatorsequivalentequivalent
Structural role and accessible-name subsetstructural subsetequivalent
DOM assertions and strictnessequivalentequivalent
Page title assertionsequivalentequivalent
Indeterminate checkbox/radio DOM property-equivalent
Structural element actionsstructural subsetequivalent
Visits, reloads, links, redirects, cookies, and HTTP formsequivalentequivalent
Phoenix.HTML data-method/data-to actionsstructural subsetequivalent
LiveView events, patches, navigation, and structural action retryequivalentequivalent
LiveView form-change delivery and timingstructural subsetequivalent
Declarative LiveView keyboard eventsstructural subsetequivalent
Supported mutable form state and ordered submissionequivalentequivalent
Structural Enter implicit form submissionstructural subsetequivalent
Native constraint validation-equivalent
Specialized scalar input valuesstructural subsetequivalent
Computed style, layout, and browser accessibility tree-equivalent
Downloadsequivalentequivalent
Named pages and new tabs-equivalent
Dialogs and browser request/response events-equivalent
Active-page JavaScript evaluation-equivalent
JavaScript-owned DOM and default actions-equivalent
Native invalid, submit, and formdata event ordering-equivalent
Hard-wrapped textarea, object, and custom-element entries-equivalent
Per-test sessions, cleanup, and Ecto sandbox propagationequivalentequivalent
Regex URL matchingequivalentequivalent
Structured path, query, and fragment URL matchingequivalentequivalent
Typed file selection and supported upload lifecycleequivalentequivalent
Script-opened file chooser events-equivalent

Boundaries

When to choose Playwright

Use Playwright for computed style, layout, browser accessibility, native validation, arbitrary JavaScript, and browser network events. Phoenix operates on parsed HTML and mutable form state.

LiveView timing and keyboard events

LiveView eagerly dispatches each applicable form-control phx-change and ignores phx-debounce/phx-throttle scheduling. Use Playwright for delay, blur-only delivery, coalescing, cancellation, and throttle suppression.

For Enter, Space, and Tab, LiveView dispatches the supported direct and window phx-keydown/phx-keyup bindings, filters phx-key, preserves phx-target, and orders events around the structural default action. Application-defined LiveSocket metadata, modifiers and chords, repeats, browser timing, inline listeners, and client-side JS commands remain Playwright-only.

LiveView document and patch boundaries

LiveView locators and actions see the current Phoenix.LiveViewTest.View, not the surrounding dead layout. Use Phoenix.ConnTest for initial outer-layout HTML assertions or Playwright for full-document interactions. LiveView unwrap/2 receives only the View.

Browser baseline

Fluffy verifies compatibility against pinned Chromium. Firefox and WebKit are available through Playwright but are not covered by Fluffy's conformance suite.

Phoenix.HTML actions and dialogs

For a Static or LiveView target with data-confirm, click/2 ignores the attribute and continues with the normal structural action. It does not create, inspect, accept, or dismiss a browser dialog; use Playwright whenever the prompt or its cancellation path is part of the assertion. Both in-process drivers model the pinned Phoenix.HTML data-method/data-to hidden-form action for plain elements, including links and buttons. Custom phoenix.link.click listeners, cancellation, and competing LiveView actions remain browser-only.

Forms and files

Static and LiveView bypass native validation and retain specialized scalar input values as supplied strings. Use Playwright for validation events and blocking, browser sanitization/defaults, and custom or form-associated elements.

File selection supports bounded local paths and typed in-memory payloads, ordered multiple selection, clearing, and ordinary multipart forms, including empty-file entries. Managed LiveView uploads support validation, progress, cancellation, replacement, auto-upload, and submission.

Native picker UI, external uploaders, directories, drag-and-drop, and arbitrary FileList mutation are unsupported. Event.file_chooser/2 requires Playwright because application JavaScript opens the chooser.

Native escape hatch

Fluffy.unwrap/2 exposes driver-specific APIs: Plug.Conn, Phoenix.LiveViewTest.View, or Fluffy.Playwright.Handle. Use the shared event and page APIs for lifecycle operations. See Native escape hatch for callback behavior.