Playwright中Page间无法直接共享数据,需通过BrowserContext层中转或外部协调器;轻量同步可用localStorage+wait_for_load_state(),但须手动清理过期数据。

Playwright本身不提供跨Page数据同步机制
Playwright的每个Page对象是独立的JavaScript执行环境,彼此隔离。你不能直接在page1里读取page2的window.localStorage或变量值——这不是缺陷,而是设计使然:它模拟真实用户多标签行为,各页互不干扰。
需要同步时,必须通过BrowserContext共享层中转
真正能被多个Page共用的数据,只存在于BrowserContext级别(如Cookie、HTTP缓存、权限设置),但不包括运行时内存变量。所以同步只能靠“写入→读取”两步走:
- 用
context.add_init_script()向所有新页面注入初始化逻辑(比如预设全局window.__sharedData) - 把数据序列化后存到
localStorage或sessionStorage,再由目标页主动读取 - 如果涉及复杂状态,建议改用外部协调器(如Redis、本地文件、内存字典),由各
Page通过page.evaluate()调用Python端函数存取
常见错误:误以为page.evaluate()能跨页通信
以下写法无效:page1.evaluate("window.otherPageData = 'hello'")page2.evaluate("console.log(window.otherPageData)") // undefined
因为两个evaluate()分别在不同上下文执行,彼此无引用关系。容易踩的坑包括:
- 试图用
page1.locator().dispatch_event()触发page2事件——无效,事件不跨页传播 - 依赖
page.url或page.title()做状态判断,却没等page.wait_for_load_state(),导致读到旧值 - 在
context.pages遍历时修改列表(如page.close()),引发RuntimeError: list changed size during iteration
轻量同步推荐方案:localStorage + 显式轮询
适合传递简单字符串或JSON片段,例如登录态令牌或跳转参数:
await page1.evaluate("localStorage.setItem('sync_token', JSON.stringify({ts: Date.now(), value: 'abc'}))")
# 等待page2加载完成
await page2.wait_for_load_state("networkidle")
token = await page2.evaluate("JSON.parse(localStorage.getItem('sync_token') || '{}')")
注意:不要省略wait_for_load_state(),否则localStorage可能尚未初始化;也不要用setTimeout轮询,Playwright的page.wait_for_function()更可靠。
真正的难点不在“怎么传”,而在于“谁负责清理”。localStorage不会自动过期,多个标签页反复写入容易堆积脏数据——这点常被忽略。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











