What Is the Playwright-Style Facade Surface in ego-browser?
The Playwright-style facade surface in ego-browser is a high-level, familiar API that wraps Chrome DevTools Protocol (CDP) calls, letting agent scripts write automation code that looks and behaves like standard Playwright without directly managing low-level browser internals.
The ego-browser package—part of the closed-source ego-lite runtime—exposes this facade to bridge the gap between developer ergonomics and protocol-level control. Built in helperContext() within src/helpers.ts, the facade translates Playwright-style method signatures into CDP messages, handles auto-retry logic, and returns strongly-typed promises.
How the Facade Is Constructed
The facade surface is instantiated through helperContext() in [src/helpers.ts](https://github.com/citrolabs/ego-lite/blob/main/package/ego-browser/src/helpers.ts#L810-L819). This function assembles multiple facade objects that each mirror a Playwright counterpart, providing a cohesive automation environment for agent scripts.
Each facade is a thin, typed wrapper around the internal CDP driver found in browser-runtime.ts and the driver/* modules. They abstract away connection management, message serialization, and response handling.
Core Facade Objects
The Playwright-style facade surface comprises six primary objects:
page — Page Automation
Mirrors Playwright's Page with auto-waiting, asynchronous methods for navigation and interaction:
url(),goto()locator(),getByText(),getByLabel()setDefaultTimeout()waitForEvent(),waitForLoadState(),waitForURL(),waitForRequest(),waitForResponse()evaluate()screenshot(),screencast.start()/screencast.stop()keyboard.press(),keyboard.type()mouse.click()
locator — Element Targeting
Mirrors Playwright's Locator for strict, retry-enabled element selection:
locator(),getByRole()first(),nth()— chaining for multiple matchesclick(),hover(),dragTo(),scrollIntoViewIfNeeded()fill(),clear(),press()check(),selectOption()textContent(),innerText(),isVisible(),getAttribute()screenshot(),evaluate(),evaluateAll(),waitFor()
Implementation resides in [src/driver/locator.ts](https://github.com/citrolabs/ego-lite/blob/main/package/ego-browser/src/driver/locator.ts).
browser — Tab Management
Mirrors Playwright's Browser for multi-tab orchestration:
listTabs(),currentTab(),switchTab()openOrReuseTab(),closeTab()
taskSpaces — Task-Space Handling
Provides Playwright-style APIs for managing agent task lifecycles:
useOrCreate(),claim(),switch()complete(), hand-off utilities, and agent control wait conditions
site — Site-Skill Integration
Exposes learned site skills and context:
- Access site-specific automation patterns
- Run site-trained tools
- Fetch learning context for adaptive behavior
fetch — Network Requests
Dual-environment network facade:
fetch.server()— Node-side HTTP requestsfetch.browser()— in-pagefetchexecution viapage.evaluate()style injection
Practical Code Examples
Basic Navigation and Element Interaction
await page.goto('https://example.com');
const loginBtn = page.locator('button[data-test="login"]');
await loginBtn.click();
await page.waitForURL(/dashboard/);
Keyboard and Mouse Input
await page.keyboard.type('hello world');
await page.mouse.click(400, 300); // coordinates are (x, y)
Event-Driven Download Handling
const [download] = await Promise.all([
page.waitForEvent('download'),
loginBtn.click(),
]);
await download.saveAs('login-report.pdf');
Task Space Lifecycle
const ts = await taskSpaces.useOrCreate('my-task');
await ts.claim('my-task');
await ts.switch('my-task');
// …automation actions execute here…
await ts.complete('my-task', { keep: true });
Key Implementation Files
| File | Purpose |
|---|---|
src/helpers.ts |
Defines helperContext() and facade metadata (FACADE_HELP) |
src/driver/locator.ts |
Implements Locator-equivalent selection and interaction |
src/driver/waits.ts |
Provides waitFor* utilities for requests, responses, and events |
src/browser-runtime.ts |
Core CDP transport layer that facades delegate to |
src/cdp-eval.ts |
Executes page.evaluate()-style JavaScript in page context |
Summary
- The Playwright-style facade surface in ego-browser wraps CDP complexity in a familiar, high-level API
- Six facade objects (
page,locator,browser,taskSpaces,site,fetch) provide comprehensive automation coverage - All methods are asynchronous and auto-waiting, matching Playwright's behavioral contract
- Implementation spans
src/helpers.ts,src/driver/locator.ts,src/driver/waits.ts, and supporting runtime files - Agents write standard-looking Playwright code while the runtime handles CDP translation, retry logic, and type safety
Frequently Asked Questions
What problem does the Playwright-style facade solve in ego-browser?
The facade eliminates the need for agent scripts to manage raw Chrome DevTools Protocol messages. According to the citrolabs/ego-lite source code, it provides ergonomic, retry-enabled, typed wrappers that let developers use well-documented Playwright patterns instead of learning CDP internals.
How does locator() differ from standard Playwright usage?
The ego-browser locator facade in src/driver/locator.ts implements the same strictness and auto-waiting semantics as Playwright's Locator, but delegates to CDP-based element resolution. Methods like dragTo(), scrollIntoViewIfNeeded(), and evaluateAll() are available with identical signatures.
Can I use standard Playwright documentation with ego-browser?
Yes—method names, parameter patterns, and behavioral semantics intentionally mirror Playwright. However, the underlying implementation in browser-runtime.ts and cdp-eval.ts uses CDP, so some Playwright-specific configuration options may not translate directly.
Where are wait conditions implemented in the facade?
Playwright-style wait utilities including waitForURL(), waitForRequest(), waitForResponse(), and waitForEvent() are defined in src/driver/waits.ts. These wrap CDP event listeners and polling logic to match Playwright's timeout and retry behavior.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →