You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Playwright通过WebSocket连接后无法获取上下文问题求助

问题原因与解决方案

核心问题

你遇到的问题根源是Playwright的会话隔离机制:

  1. 服务端启动browserServer后,又调用chromium.connect连接自己的服务,这相当于创建了一个独立的客户端会话,你在这个会话里创建的Context仅属于该会话。
  2. Python客户端的WebSocket连接是另一个完全独立的会话,browser.contexts()只会返回当前会话自己创建的Context,因此看不到服务端会话里的活跃Context。
  3. 服务端代码里的chromium.connect完全是多余的,反而会造成会话隔离。

解决方案1:通过Context ID跨会话获取(推荐)

修改服务端代码(TypeScript)

直接使用browserServer关联的浏览器实例创建Context,避免额外会话,并打印Context ID供客户端使用:

import { chromium } from 'playwright';

const browserServer = await chromium.launchServer({ headless: false });
const wsEndpoint = browserServer.wsEndpoint();

console.log('wsEndpoint: ', wsEndpoint);

// 直接使用browserServer自带的浏览器实例,无需重新connect
const browser = await browserServer.browser();
const context = await browser.newContext();
const page = await context.newPage();

await page.goto('https://some.example.com');

// 打印Context的唯一ID,客户端将用这个ID获取Context
console.log('Target Context ID:', context.id());
console.log('Active contexts in server:', browser.contexts());

修改客户端代码(Python)

通过服务端输出的Context ID直接获取目标Context:

from playwright.async_api import async_playwright  

ws_endpoint='你的WS端点地址'
target_context_id='服务端打印的Context ID'

playwright = await async_playwright().start() 
browser = await playwright.chromium.connect(ws_endpoint=ws_endpoint) 

# 通过ID直接定位服务端创建的Context
target_context = await browser.context(target_context_id)
# 验证结果:打印该Context下的页面数量
print(f"获取到的Context包含页面数: {len(target_context.pages)}")

补充说明

  • 不要在服务端启动browserServer后再调用chromium.connect,这会创建不必要的隔离会话,导致Context无法跨会话被感知。
  • Playwright的browser.contexts()仅返回当前连接会话内创建的Context,这是设计上的会话隔离,用于避免不同客户端的操作互相干扰。

内容的提问来源于stack exchange,提问作者jzw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:43:11