adding getCdpUrl and playwright examlpe

This commit is contained in:
Tommy D. Rossi
2025-11-16 12:26:06 +01:00
parent 3a1de6d9c7
commit b5d48296b5
6 changed files with 41 additions and 6 deletions
+27
View File
@@ -7,6 +7,8 @@
<br/>
</div>
## Comparison
### BrowserMCP
@@ -34,3 +36,28 @@ Navigation:
- `browsermcp_browser_press_key` - Press a key on the keyboard
Utilities:
- `browsermcp_browser_wait` - Wait for a specified time in seconds
### Using with Playwright
You can use playwriter programmatically with playwright-core:
```typescript
import { chromium } from 'playwright-core'
import { startPlayWriterCDPRelayServer, getCdpUrl } from 'playwriter'
const port = 19987
const server = await startPlayWriterCDPRelayServer({ port })
const browser = await chromium.connectOverCDP(getCdpUrl({ port }))
const context = browser.contexts()[0]
const page = context.pages()[0]
await page.goto('https://example.com')
await page.screenshot({ path: 'screenshot.png' })
await browser.close()
server.close()
```
+2
View File
@@ -3,6 +3,8 @@
"description": "",
"version": "0.0.5",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"repository": "https://github.com/remorses/playwriter",
"scripts": {
"build": "rm -rf dist *.tsbuildinfo && mkdir dist && cp src/resource.md src/prompt.md dist/ && tsc",
+5 -5
View File
@@ -20,7 +20,7 @@ type PlaywrightClient = {
ws: WSContext
}
export async function startPlayWriterCDPRelayServer({ port = 19988, logger = console }: { port?: number; logger?: { log(...args: any[]): void; error(...args: any[]): void } } = {}) {
export async function startPlayWriterCDPRelayServer({ port = 19988, host = '127.0.0.1', logger = console }: { port?: number; host?: string; logger?: { log(...args: any[]): void; error(...args: any[]): void } } = {}) {
const connectedTargets = new Map<string, ConnectedTarget>()
const playwrightClients = new Map<string, PlaywrightClient>()
@@ -461,20 +461,20 @@ export async function startPlayWriterCDPRelayServer({ port = 19988, logger = con
}
}))
const server = serve({ fetch: app.fetch, port })
const server = serve({ fetch: app.fetch, port, hostname: host })
injectWebSocket(server)
const wsHost = `ws://localhost:${port}`
const wsHost = `ws://${host}:${port}`
const cdpEndpoint = `${wsHost}/cdp`
const extensionEndpoint = `${wsHost}/extension`
logger.log('CDP relay server started')
logger.log('Host:', host)
logger.log('Port:', port)
logger.log('Extension endpoint:', extensionEndpoint)
logger.log('CDP endpoint:', cdpEndpoint)
return {
cdpEndpoint,
extensionEndpoint,
close() {
for (const client of playwrightClients.values()) {
client.ws.close(1000, 'Server stopped')
+1
View File
@@ -1 +1,2 @@
export * from './extension/cdp-relay.js'
export * from './utils.js'
+2 -1
View File
@@ -7,6 +7,7 @@ import path from 'node:path'
import { spawn } from 'node:child_process'
import { createRequire } from 'node:module'
import vm from 'node:vm'
import { getCdpUrl } from './utils.js'
const require = createRequire(import.meta.url)
@@ -67,7 +68,7 @@ async function ensureConnection(): Promise<{ browser: Browser; page: Page }> {
await ensureRelayServer()
const cdpEndpoint = `ws://localhost:${RELAY_PORT}/cdp/${Date.now()}`
const cdpEndpoint = getCdpUrl({ port: RELAY_PORT })
const browser = await chromium.connectOverCDP(cdpEndpoint)
const contexts = browser.contexts()
+4
View File
@@ -0,0 +1,4 @@
export function getCdpUrl({ port = 19988, host = '127.0.0.1', clientId }: { port?: number; host?: string; clientId?: string } = {}) {
const id = clientId || Date.now().toString()
return `ws://${host}:${port}/cdp/${id}`
}