The Koko SDK public API is modeled after Playwright. Most scripts change only the import and connection line.
Connection
| Playwright | Koko SDK |
chromium.connectOverCDP(url) | Browser.connect(url) |
chromium.launch() | Browser.launch({ profile }) |
Core API map
| Playwright | Koko SDK | Notes |
browser.newContext() | browser.newContext() | Client-side grouping |
context.newPage() | context.newPage() | |
page.goto() | page.goto() | + waitUntil: "done" |
page.locator() | page.locator() | CSS selector |
page.getByRole() | page.getByRole() | DOM heuristics |
locator.click() | locator.click() | |
page.evaluate() | page.evaluate() | |
page.screenshot() | page.screenshot() | PNG/JPEG via CDP |
page.pdf() | page.pdf() | |
page.waitForSelector() | page.waitForSelector() | Uses performSearch |
Koko-only additions
| API | Description |
page.markdown() | Token-efficient page text |
page.semanticTree() | Pruned a11y DOM |
page.findElement() | Role/name → backendNodeId |
page.node() | NodeHandle actions |
page.searchGoogle() | SERP extract + block detect |
page.armDialog() | Pre-arm JS dialogs |
page.extract() | Crawler-optimized extract |
captureSessionState() | Cookies + storage snapshot |
Not in SDK (use CDP or MCP)
expect() assertions — use Vitest, Node assert, etc.
page.route() / request interception
frameLocator() / iframe switching
keyboard / mouse standalone objects
browser.newBrowserCDPSession() tracing APIs
- Full
getByRole accessibility tree parity
Migration checklist
- Replace
import { chromium } with import { Browser }
- Start Koko CDP server or use
Browser.launch()
- Swap
connectOverCDP → Browser.connect
- Optionally adopt
waitUntil: "done" for stricter navigation
- Replace brittle selectors with
NodeHandle for agent flows