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()
额外注意事项
- 会话级(
sessionscope)的上下文会在所有测试用例中复用,如果测试用例之间需要隔离状态(比如不同的扩展登录信息),建议将夹具的scope改为function,但会增加整体测试耗时。 - 确保加载的扩展包结构完整无损坏,部分扩展在自动化环境下可能需要提前完成授权、初始化等操作,可在夹具中添加对应的处理逻辑。
内容的提问来源于stack exchange,提问作者blnk.off
相关产品推荐
相关产品推荐

