同步模式适合单用例调试、ci冒烟测试或pytest简单集成;异步模式适合高并发集成测试,但需pytest-asyncio插件并加@ pytest.mark.asyncio标记,且必须await所有异步操作。

能直接跑通的集成测试脚本,核心不在写多少断言,而在启动方式、上下文隔离和资源清理这三步是否闭环。Playwright 的 sync_playwright() 或 async_playwright() 不是装饰,是必须包裹的执行边界。
怎么选同步还是异步模式?
同步模式适合单用例调试、CI 中的冒烟测试或与 pytest 集成的简单场景;异步模式更适合高并发集成测试(比如同时验证 5 个用户会话状态),但需注意 pytest 默认不原生支持 async test 函数——得配合 pytest-asyncio 插件,并在测试函数上加 @pytest.mark.asyncio。
- 同步脚本里混用
await会直接报RuntimeWarning: coroutine 'xxx' was never awaited - 异步脚本里调用
page.click()等方法必须加await,否则返回的是 coroutine 对象,不是实际动作 - 浏览器复用:同步模式下每次
p.chromium.launch()启动新进程;异步模式下可复用同一browser实例创建多个context,节省开销
为什么测试总是卡在权限弹窗或 iframe 里?
Playwright 默认不自动处理摄像头/麦克风请求,也不自动切入 iframe 内部上下文——这不是 bug,是设计选择。必须显式声明。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 媒体权限:用
browser.new_context(permissions=["camera", "microphone"]),而不是在 page 上调用grant_permissions()(后者仅对当前页面生效,且不保证时机) - iframe 定位:别用
page.frame("name")这种易失效的旧方式;改用page.frame_locator("iframe[title='video-call']").get_by_role("button", name="Join"),它支持嵌套定位且自动等待 iframe 加载完成 - 跨域 iframe:若 iframe src 是不同域名,需确保上下文启用
ignore_https_errors=True,否则可能因证书拦截失败
如何避免测试间状态污染?
Playwright 的 context 是隔离单元,但很多人误把 browser 当作隔离点——这是最大误区。一个 browser 可以开多个 context,每个 context 拥有独立 cookies、localStorage、viewport 和网络拦截规则。
- 不要在测试函数外复用同一个
context;pytest 中应使用 fixture 创建新 context,scope 设为"function" - 若需预置登录态,用
context.add_cookies()而非手动 login,避免密码硬编码和验证码绕过逻辑 - 清理动作必须显式:即使用了
with语句,也要在teardown阶段调用context.clear_cookies()和context.storage_state()重置,尤其当测试涉及 JWT 刷新或 OAuth token 续期时
真正难的不是写 click 或 assert,而是判断某个操作该放在 context 层、page 层还是 locator 层——locator 只管找元素,page 管生命周期,context 管状态边界。越早厘清这个分层,越少掉进“为什么上一个测试的 cookie 影响了下一个”的坑里。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










