Playwright-Rust Development Roadmap

May 24, 2026 · View on GitHub

Vision: Provide production-quality Rust bindings for Microsoft Playwright that match the API and quality of official language bindings (Python, Java, .NET), enabling broad community adoption.

Architecture: JSON-RPC communication with Playwright Node.js server (same as all official bindings)

Status: Version 0.13.0 code complete on main ([Unreleased]); dogfooding before tag cut. Version 0.12.0 shipped 2026-04-19.


Overview

This roadmap outlines the path to a production-ready playwright-rust library. Each version builds incrementally toward feature parity with playwright-python while maintaining strict API compatibility and comprehensive testing.

Key Milestones:

  • v0.1.0 - Protocol Foundation complete
  • v0.2.0 - Browser API complete
  • v0.3.0 - Page Interactions complete
  • v0.4.0 - Options & ElementHandles complete
  • v0.5.0 - Advanced Testing Features complete - 2025-11-09
  • v0.6.0 - Production Hardening complete - 2025-11-12
  • v0.7.0 - Single-Crate Architecture complete - 2025-11-16
  • v0.7.1 - Script & Style Injection APIs complete - 2025-12-24
  • v0.7.2 - Community Features & Fixes complete - 2025-12-24
  • v0.8.0 - Typed Evaluate API complete - 2025-12-30
  • v0.8.1 - Persistent Contexts & App Mode complete - 2026-01-04
  • v0.8.x through v0.12.0 - Full Python API parity + agent integration complete (2026-04-19)
  • v0.13.0 - Playwright 1.59 completeness + agent codegen + companion crates - 2026-05-23
  • 🚧 v1.0.0 - Real-World Validation & Final Polish
  • 🔮 v1.1.0 - Future enhancements

Version 0.1: Protocol Foundation ✅ Complete

Goal: Establish JSON-RPC communication with Playwright server and provide access to browser types.

Status: ✅ Complete - See v0.1-protocol-foundation.md and Technical Summary

Key Deliverables:

  • Playwright server download and lifecycle management
  • Stdio pipe transport with length-prefixed JSON messages
  • JSON-RPC connection layer with request/response correlation
  • Protocol object factory (GUID-based object instantiation)
  • Entry point: Playwright::launch().await?
  • Access to chromium(), firefox(), webkit() browser types

Version 0.2: Browser API ✅ Complete

Goal: Implement browser launching and page lifecycle management.

Status: Complete - See v0.2-browser-api.md

Delivered:

  • Browser launching (BrowserType::launch())
  • Context management (Browser::new_context())
  • Page creation (BrowserContext::new_page(), Browser::new_page())
  • Lifecycle cleanup (close methods)
  • Cross-browser testing (Chromium, Firefox, WebKit)

Version 0.3: Page Interactions ✅ Complete

Goal: Implement core page interactions (navigation, locators, actions) matching playwright-python API.

Status: ✅ Complete - See v0.3-page-interactions.md

Delivered:

  • Navigation: page.goto(), page.reload(), page.title(), URL tracking
  • Locators: page.locator(selector) with auto-waiting and chaining
  • Actions: click(), dblclick(), fill(), clear(), press(), check(), uncheck(), hover()
  • Select and upload: select_option(), set_input_files()
  • Queries: text_content(), inner_text(), inner_html(), get_attribute(), input_value()
  • State queries: is_visible(), is_enabled(), is_checked(), is_editable()
  • Locator chaining: first(), last(), nth(), count()
  • Keyboard API: keyboard.type_text(), keyboard.press(), keyboard.down(), keyboard.up(), keyboard.insert_text()
  • Mouse API: mouse.move_to(), mouse.click(), mouse.dblclick(), mouse.down(), mouse.up(), mouse.wheel()
  • Screenshots: page.screenshot(), page.screenshot_to_file() (PNG format)
  • Cross-browser testing: All features verified on Chromium, Firefox, WebKit
  • Test infrastructure: Test server with custom HTML pages for deterministic testing

Version 0.4: Options & ElementHandles ✅ Complete

Goal: Implement options pattern for actions/screenshots and ElementHandle protocol support (all deferred from Version 0.3).

Status: ✅ Complete (2025-11-08) - See v0.4-advanced-features.md

Delivered:

  • ElementHandle protocol support with ChannelOwner implementation
  • Element screenshots: locator.screenshot() via ElementHandles
  • Screenshot options: ScreenshotType (Png, Jpeg), quality, full_page, clip, omit_background
  • ClickOptions with builder pattern: button, modifiers, position, force, trial, timeout
  • Action options: FillOptions, PressOptions, CheckOptions, HoverOptions, SelectOptions
  • SelectOption variants: select by value, label, or index
  • Navigation error handling and timeout tests
  • Keyboard/Mouse options: delay, button, click_count, steps
  • All Version 0.3 deferrals addressed and implemented
  • Comprehensive cross-browser testing (Chromium, Firefox, WebKit)

Version 0.5: Advanced Testing Features ✅ Complete

Goal: Implement advanced testing features including assertions, network interception, and testing utilities.

Status: ✅ Complete (2025-11-09) - See v0.5-advanced-testing.md

Delivered:

  • Assertions: expect(locator).to_be_visible() with auto-retry (5s default timeout, 100ms polling)
  • Text assertions: to_have_text(), to_contain_text() with regex pattern support
  • Value assertions: to_have_value() with regex pattern support
  • State assertions: to_be_enabled(), to_be_disabled(), to_be_checked(), to_be_unchecked(), to_be_editable()
  • Negation support: .not() for all assertions
  • Custom timeouts: .with_timeout() configuration
  • Network interception: page.route() with async closure handlers
  • Route handling: route.abort(), route.continue(), route.fulfill()
  • Response mocking: Custom status, headers, body (works for API/fetch, main document needs investigation)
  • JSON helpers: .json() for automatic serialization
  • Glob pattern matching: **/*.png, **/*, etc.
  • Request data access: route.request().url(), method()
  • Downloads: Event handling, save functionality, metadata access
  • Dialogs: Alert/confirm/prompt handling with accept/dismiss
  • Convenience methods: locator.set_checked() for boolean-based check/uncheck
  • Cross-browser testing: All features verified on Chromium, Firefox, WebKit

Version 0.6: Production Hardening ✅ Complete

Goal: Polish for v0.6.0 release, address deferred items, comprehensive documentation.

Status: ✅ Complete (2025-11-12) - See v0.6-production-hardening.md

Delivered:

  • Windows support (stdio cleanup fix, CI stability flags)
  • Complete assertion API (to_be_focused)
  • Main document fulfillment investigation (Playwright server limitation documented)
  • Documentation completeness (rustdoc 100% coverage for all public APIs)
  • Performance optimization (benchmark suite, GUID Arc optimization, chunked reading)
  • Test suite optimization (cargo-nextest integration, test combining)
  • Stability testing (memory leaks, resource cleanup, error handling)
  • Low-priority enhancements (FilePayload, BrowserContext options, route continue overrides)
  • v0.6.0 published to crates.io

Version 0.7: Real-World Integration & Single Crate ✅ Complete

Goal: Consolidate architecture and implement critical features for real-world integration.

Status: ✅ Complete (Final release: v0.7.2) - See v0.7-single-crate.md

Delivered:

  • v0.7.0: Single Crate Architecture - Consolidated playwright-core into playwright-rs
  • v0.7.1: Script & Style Injection APIs - Community contribution by @douglasob
    • BrowserContext.add_init_script(), Page.add_init_script(), Page.add_style_tag()
  • v0.7.2: Community Features & Fixes - Storage state, debugging, logging improvements
    • Storage state support (cookies, localStorage persistence)
    • Page::pause() for debugging with Playwright Inspector
    • Consistent tracing initialization

Note: Version closed early due to significant community contribution warranting v0.8.0. Planned items (Remote Connection, Critical Gaps, API Polish) moved to v0.8.


Version 0.8: Typed Evaluate & Continued Integration

Goal: Implement typed evaluate API and continue real-world integration features.

Status: ✅ Complete through v0.12.0 - See v0.8-real-world-integration.md

Milestones:

  • ✅ v0.8.0: Typed Evaluate API (2025-12-30) - Community contribution by @douglasob
  • ✅ v0.8.1: Persistent Contexts & App Mode (2026-01-04) - Addressed Issue #9 (App Mode)
  • ✅ v0.8.2: Remote Connection (BrowserType::connect)
  • ✅ v0.8.x: Full implementation of Android, Electron, Tracing, APIRequestContext, LocalUtils
  • ✅ v0.8.2: Critical Feature Gaps (WebSocket Events, Locator Audit)
  • ✅ v0.8.2: API Polish

Delivered in v0.8.0:

  • Typed Evaluate API - Generic Page::evaluate() with argument serialization and typed results
    • Page::evaluate<T: Serialize, U: DeserializeOwned>(expression, arg) - Fully typed JavaScript evaluation
    • Argument serialization: Pass any Serialize type to JavaScript
    • Result deserialization: Receive typed results with compile-time validation
    • Comprehensive serialization module with Playwright protocol support
    • Backward compatible with original methods

Version 0.13: Playwright 1.59 Completeness + Agent Codegen

Goal: Catch up to Playwright 1.59 (screencast, debugger, picker, CDP events, aria-snapshot options), ship the agent-codegen surfaces (programmatic locator picking, trace-file consumption from Rust), and trim the default dep tree for leaner cold builds.

Status: ✅ Shipped 2026-05-23. playwright-rs 0.13.0, playwright-rs-macros 0.1.0, and playwright-rs-trace 0.1.0 published to crates.io. See crates/playwright/CHANGELOG.md for the full list of additions, changes, and breaking changes.

Milestones (all landed):

  • ✅ Playwright 1.59 parity — Page::screencast, Debugger + BrowserContext::debugger(), Page::pick_locator(), CDPSession::on(method, handler) event side, AriaSnapshotOptions, Tracing.start({live: true}), Page::aria_snapshot(), Locator::normalize(), LaunchOptions::artifacts_dir, Page::clear_console_messages() / clear_page_errors() (closed: #69, #70, #71, #72, #73, #74, #75, #76, #79; umbrella #55)
  • ✅ Tracing instrumentation across the public async surface — #[tracing::instrument] on every public method on Browser, Page, Frame, Locator, ElementHandle, Tracing, CDPSession, Debugger, Screencast, etc., with cardinality-bounded span fields (#84, #91)
  • ✅ Companion crate playwright-rs-macros 0.1.0 — compile-time-validated locator!() macro
  • ✅ Companion crate playwright-rs-trace 0.1.0 — programmatic trace-file consumption (independently versioned, tag prefix trace-v*)
  • ✅ Dep trim — image behind opt-in screenshot-diff feature, reqwestureq in build script, mime_guess → hand-rolled, narrowed tokio features (closed: #62, #63, #64, #65, #66, #67)
  • ✅ Build-script driver location moved to Cargo's $OUT_DIR (was workspace-relative drivers/, which broke for downstream git-dep consumers because Cargo's CI caches don't preserve ~/.cargo/git/checkouts/)
  • ✅ New playwright-rs [[bin]] (feature cli) — bootstrap installer for the bundled driver into a stable cross-build user cache, for downstream binaries distributed via cargo install
  • ✅ Debug-build runtime-binding assertion on Browser (#90), Page::set_url_fragment / clear_url_fragment helpers (#89)

Release prep: Tracked on #86. All pre-release plumbing verified during dogfooding — cargo publish --dry-run clean for playwright-rs-macros and playwright-rs-trace; release.yml already handles all three tag prefixes; the release-process skill captures the macros first-publish gotcha ([policy.<crate>] audit-as-crates-io = true must be added after the first publish, not before).


Version 1.0: Real-World Validation & Final Polish

Goal: Real-world testing in t2t, incorporate user feedback, final polish before v1.0.0.

Status: 🚧 Next milestone - See v1.0-real-world-validation.md

Milestones by Slice:

  • Slice 0: Single-crate architecture consolidation (Completed in v0.7)
  • Slice 1: t2t integration & dogfooding
  • Slice 2: Community feedback analysis
  • Slice 3: Examples and documentation (informed by feedback)
  • Slice 4: Performance optimization (data-driven)
  • Slice 5: API polish (Moved to v0.7)
  • Slice 6: v1.0.0 release preparation

Version 1.1: WebSocket Support

Goal: Implement full WebSocket support to match Playwright API parity.

Status: 🔮 Planned

Scope:

  • WebSocket protocol object
  • WebSocketRoute for interception and mocking
  • Event handling (on_close, on_frame_received, etc.)
  • Integration with Page and BrowserContext

Post-1.1: Future Enhancements

Potential enhancements include:

  • Protocol Code Generation - Auto-generate Rust types from protocol.yml
  • Sync API Wrapper - Optional blocking API for non-async codebases
  • Advanced Tracing - Playwright inspector integration
  • Custom Browser Builds - Support for custom Chromium/Firefox builds
  • Performance Optimization - Connection pooling, caching
  • WebDriver BiDi Support - When Playwright adds BiDi support
  • Component Testing - Playwright component testing for Rust web frameworks
  • Visual Regression Testing - Built-in visual diff capabilities

Guiding Principles

Throughout all versions, we maintain:

  1. API Consistency - Match playwright-python/JS/Java exactly
  2. Cross-Browser Parity - All features work on Chromium, Firefox, WebKit
  3. Test-Driven Development - Write tests first, comprehensive coverage
  4. Incremental Delivery - Ship working code at end of each version
  5. Production Quality - Code quality suitable for broad adoption
  6. Documentation First - Every feature documented with examples
  7. Community Focused - Responsive to feedback, clear contribution path

Release Strategy

Version Numbering

  • 0.x.y - Pre-1.0, API may change between minor versions
  • 1.0.0 - Stable API, ready for production
  • 1.x.y - Minor versions add features, maintain backward compatibility
  • 2.0.0+ - Major versions may break API (avoid if possible)

Publishing Cadence

  • Version completions - Publish to crates.io as 0.x.0
  • Bug fixes - Patch releases as 0.x.y
  • Version 0.6 complete - Publish v0.6.0 for early adopter feedback and real-world testing
  • Version 1.0 complete - Publish v1.0.0 after t2t integration and user validation

Communication

  • GitHub Releases - Release notes for each version
  • Changelog - Detailed change log in CHANGELOG.md
  • Community Updates - Regular progress updates

How to Use This Roadmap

For Contributors:

  • See current version for what's being worked on
  • Check "Planned" versions for future opportunities
  • Read implementation plans for detailed task breakdowns

For Users:

  • Check version status to see what features are available
  • Use version numbers to understand stability
  • Follow GitHub releases for updates

For Planning:

  • Roadmap is updated after each version completion
  • Implementation plans created just-in-time (not all upfront)
  • Versions may be adjusted based on learnings

Just-In-Time Planning Approach:

This roadmap provides high-level direction, but detailed implementation plans are created only when needed:

  1. Avoid over-planning - Details will change as you learn
  2. Stay agile - Respond to discoveries during implementation
  3. Focus on current work - Don't spend time planning Version 0.3 when Version 0.1 isn't done
  4. Learn and adapt - Each version informs the next

Implementation plans are created when the previous version is ~80% complete, allowing learnings to inform the next version's approach.


Last Updated: 2026-04-19