Browser Commander Feature Parity

August 2, 2026 ยท View on GitHub

This matrix tracks the shared API surface across the maintained language implementations. "Supported" means the public helper exists and is covered by unit tests or adapter tests in that language. "Bridge" means the Rust API is implemented by delegating to the official Node.js engine package.

Engine Matrix

EngineJavaScriptRustNotes
PlaywrightSupported through the official Node.js packageBridge through Node.jsPlaywright's official language list covers JavaScript/TypeScript, Python, Java, and .NET. Browser Commander uses Node for Rust Playwright execution.
PuppeteerSupported through the official Node.js packageBridge through Node.jsPuppeteer documents itself as a JavaScript library for driving Chrome/Firefox over CDP or WebDriver BiDi.
ChromiumoxideNot applicableNative RustRust CDP backend.
FantocciniNot applicableEngine type preservedManaged launch is not implemented; keep the variant for compatibility and future WebDriver support.
SeleniumNot applicableNot implemented in RustPython-specific backend today.

API Matrix

CapabilityJavaScript PlaywrightJavaScript PuppeteerRust ChromiumoxideRust Playwright bridgeRust Puppeteer bridge
Launch browserSupportedSupportedSupportedSupportedSupported
Connect to running browser over CDPSupportedSupportedSupportedBridgeBridge
Persistent user data directorySupportedSupportedSupportedSupportedSupported
Portable cookie/localStorage stateSupportedSupportedNot implementedNot implementedNot implemented
Custom Chrome argsSupportedSupportedSupportedSupportedSupported
Headless launchSupportedSupportedSupportedSupportedSupported
Color scheme at launchSupportedSupportedSupportedSupportedSupported
Navigate / current URLSupportedSupportedSupportedSupportedSupported
Query selectors / countSupportedSupportedSupportedSupportedSupported
Visibility / enabled checksSupportedSupportedSupportedSupportedSupported
Text content / input value / attributesSupportedSupportedSupportedSupportedSupported
Click / fill / type textSupportedSupportedSupportedSupportedSupported
Scroll into viewSupportedSupportedSupportedSupportedSupported
Evaluate JavaScriptSupportedSupportedSupportedSupportedSupported
ScreenshotSupportedSupportedSupportedSupportedSupported
PDFSupportedSupportedSupportedSupportedSupported
Keyboard press/type/down/upSupportedSupportedSupportedSupportedSupported
Bring page to frontSupportedSupportedSupportedSupportedSupported
Wait for navigationSupportedSupportedSupportedSupportedSupported

Documentation Outputs

OutputCommandCI/CD
JavaScript API docscd js && npm run docs:apiBuilt by .github/workflows/docs.yml
Rust API docscd rust && cargo doc --no-deps --all-featuresBuilt by .github/workflows/docs.yml
Combined Pages artifactGenerated from both outputsUploaded on PRs and deployed from main

Real-Browser Lifecycle Parity

CapabilityJavaScriptRustPython
Attach to an existing CDP endpointPlaywright, PuppeteerChromiumoxide, Playwright, PuppeteerPlaywright, Selenium
Discover an installed Chrome-family appLinux, macOS, WindowsLinux, macOS, WindowsLinux, macOS, Windows
Launch with a dedicated profilelaunchRealBrowser()launch_real_browser()launch_real_browser()
Loopback-only CDP readiness probeSupportedSupportedSupported
Seed cookies after connectionSupportedSupportedSupported
Return browser and page handlesRaw engine handlesShared EngineAdapterRaw engine handles
CapabilityJavaScriptRustPython
Discover Chrome, Edge, Brave, Chromium, and Firefox profilesSupportedSupportedSupported
Read Playwright-compatible cookie fieldsSupportedSupportedSupported
Filter by domain and choose a named profileSupportedSupportedSupported
Chromium version-24 host-hash validation and timestamp conversionSupportedSupportedSupported
macOS Keychain + AES-128-CBCSupportedSupportedSupported
Linux libsecret/KWallet + AES-128-CBCSupportedSupportedSupported
Windows DPAPI key + legacy AES-256-GCMSupportedSupportedSupported
Firefox cookies.sqliteSupportedSupportedSupported
Owner-only derived-key/result cache with TTL and refresh controlsSupportedSupportedSupported
Cross-process credential-read lockSupportedSupportedSupported

Current Windows Chromium app-bound v20 values require Chromium's privileged service and are intentionally reported as unsupported for ordinary external processes. All three APIs can skip those individual values when partial import is acceptable. The shared derived-key cache uses one schema and lock identity, so JavaScript, Rust, and Python processes do not independently prompt within a TTL window. Cache directories/files use 0700/0600 modes on POSIX; on Windows they remove inherited ACL entries and grant access only to the current user.

Automation-Friendly Launch Defaults

launchBrowser()/launch_browser() and the real-browser launch helpers add the following Chromium-family arguments unless the caller opts out. The defaults are the same on Linux, macOS, and Windows and apply when launching Chrome, Edge, Brave, or Chromium:

Default argumentWhy it is applied
--password-store=basicUses the isolated profile's built-in password backend instead of opening an OS Keychain/libsecret credential dialog.
--no-first-runSkips the first-run setup flow that can cover or redirect the first page.
--no-default-browser-checkPrevents a default-browser prompt from interrupting automation.
--disable-infobarsSuppresses browser information bars that can obstruct page UI.
--disable-session-crashed-bubblePrevents a killed automation session from offering to restore tabs.
--hide-crash-restore-bubbleHides the crash-restore surface on browser variants that honor this switch.
--disable-crash-restorePrevents stale tabs from being restored into the isolated profile.

The real-browser helpers additionally manage --remote-debugging-address=127.0.0.1, --remote-debugging-port=<port>, and --user-data-dir=<dedicated profile>. These three arguments cannot be overridden or ignored: CDP stays on loopback, and Chrome 136+ refuses remote debugging on its default profile. Headless mode is opt-in and emits --headless=new.

Use extraArgs and ignoreDefaultArgs in JavaScript, extra_args and ignore_default_args in Python, or the corresponding Rust builder methods to append arguments or omit individual Browser Commander defaults. Existing args/with_args() calls remain supported. Opting out of --password-store=basic can restore operating-system credential prompts.

connectBrowser()/connect_browser() only attaches to an existing process; it cannot change that process's command line. Start an externally managed browser with the defaults above and a dedicated remote-debugging profile, or use the real-browser launch helper to have Browser Commander apply them.

Compatibility Notes

  • Existing Rust aliases remain compatible: chromiumoxide and cdp parse as EngineType::Chromiumoxide; fantoccini and webdriver parse as EngineType::Fantoccini.
  • playwright and puppeteer now parse as distinct Rust engine types instead of silently mapping to a different backend.
  • Rust Playwright/Puppeteer support requires Node.js plus the matching package in node_working_dir or normal Node module resolution.
  • Python exposes the same CDP attach operation as connect_browser() for its Playwright and Selenium engines.
  • Chrome 136 and newer require a non-default user data directory before honoring remote-debugging switches.