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

Playwright中BrowserContext的new_page方法非预期阻塞问题求助

Playwright+pytest加载扩展后new_page协程无限等待的解决方法

问题场景

使用Playwright结合pytest做自动化测试,加载浏览器扩展后:

  • 在conftest.py的context_use_args_async夹具中调用BrowserContext.new_page()一切正常
  • 但在测试用例(如test_sign_up)中调用该方法时,页面能正常打开,但协程陷入无限等待,更换Chrome/Chromium浏览器后问题仍存在

原因分析

当通过--load-extension参数启动Chromium/Chrome时,浏览器会自动为每个扩展创建后台页面,并且默认生成一个包含扩展的上下文。此时如果手动调用browser.new_context()创建新上下文,这个新上下文与扩展所在的上下文完全隔离,新上下文的new_page操作会因为扩展相关的进程阻塞,导致协程挂起无法继续执行。

解决方案

直接复用浏览器启动时自动创建的默认上下文,而非手动创建新上下文。修改conftest.py中的context_use_args_async夹具:

@pytest_asyncio.fixture(scope='session')
async def context_use_args_async(browser_use_args_async):
    # 获取浏览器自动创建的默认上下文(已包含加载的扩展)
    contexts = browser_use_args_async.contexts
    if contexts:
        context = contexts[0]
    else:
        # 兜底逻辑,避免无上下文时抛出异常
        context = await browser_use_args_async.new_context()
    yield context
    await context.close()

额外注意事项

  1. 会话级(session scope)的上下文会在所有测试用例中复用,如果测试用例之间需要隔离状态(比如不同的扩展登录信息),建议将夹具的scope改为function,但会增加整体测试耗时。
  2. 确保加载的扩展包结构完整无损坏,部分扩展在自动化环境下可能需要提前完成授权、初始化等操作,可在夹具中添加对应的处理逻辑。

内容的提问来源于stack exchange,提问作者blnk.off

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 12:23:12