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/> <br/>
</div> </div>
## Comparison ## Comparison
### BrowserMCP ### BrowserMCP
@@ -34,3 +36,28 @@ Navigation:
- `browsermcp_browser_press_key` - Press a key on the keyboard - `browsermcp_browser_press_key` - Press a key on the keyboard
Utilities: Utilities:
- `browsermcp_browser_wait` - Wait for a specified time in seconds - `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": "", "description": "",
"version": "0.0.5", "version": "0.0.5",
"type": "module", "type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"repository": "https://github.com/remorses/playwriter", "repository": "https://github.com/remorses/playwriter",
"scripts": { "scripts": {
"build": "rm -rf dist *.tsbuildinfo && mkdir dist && cp src/resource.md src/prompt.md dist/ && tsc", "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 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 connectedTargets = new Map<string, ConnectedTarget>()
const playwrightClients = new Map<string, PlaywrightClient>() 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) injectWebSocket(server)
const wsHost = `ws://localhost:${port}` const wsHost = `ws://${host}:${port}`
const cdpEndpoint = `${wsHost}/cdp` const cdpEndpoint = `${wsHost}/cdp`
const extensionEndpoint = `${wsHost}/extension` const extensionEndpoint = `${wsHost}/extension`
logger.log('CDP relay server started') logger.log('CDP relay server started')
logger.log('Host:', host)
logger.log('Port:', port)
logger.log('Extension endpoint:', extensionEndpoint) logger.log('Extension endpoint:', extensionEndpoint)
logger.log('CDP endpoint:', cdpEndpoint) logger.log('CDP endpoint:', cdpEndpoint)
return { return {
cdpEndpoint,
extensionEndpoint,
close() { close() {
for (const client of playwrightClients.values()) { for (const client of playwrightClients.values()) {
client.ws.close(1000, 'Server stopped') client.ws.close(1000, 'Server stopped')
+1
View File
@@ -1 +1,2 @@
export * from './extension/cdp-relay.js' 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 { spawn } from 'node:child_process'
import { createRequire } from 'node:module' import { createRequire } from 'node:module'
import vm from 'node:vm' import vm from 'node:vm'
import { getCdpUrl } from './utils.js'
const require = createRequire(import.meta.url) const require = createRequire(import.meta.url)
@@ -67,7 +68,7 @@ async function ensureConnection(): Promise<{ browser: Browser; page: Page }> {
await ensureRelayServer() await ensureRelayServer()
const cdpEndpoint = `ws://localhost:${RELAY_PORT}/cdp/${Date.now()}` const cdpEndpoint = getCdpUrl({ port: RELAY_PORT })
const browser = await chromium.connectOverCDP(cdpEndpoint) const browser = await chromium.connectOverCDP(cdpEndpoint)
const contexts = browser.contexts() 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}`
}