adding getCdpUrl and playwright examlpe
This commit is contained in:
@@ -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()
|
||||||
|
```
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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 +1,2 @@
|
|||||||
export * from './extension/cdp-relay.js'
|
export * from './extension/cdp-relay.js'
|
||||||
|
export * from './utils.js'
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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}`
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user