Python 求教使用 playwright + pytest 的时候遇到 await page.goto 一直阻塞

咸吃萝卜淡操心 · February 18, 2025 · Last by dubda replied at February 27, 2025 · 5054 hits

确认没有网络问题和环境问题,

直接 使用

 from playwright.async_api import async_playwright, Playwright
@pytest.mark.asyncio
async def test_home_page_loading22():
    p = await async_playwright().start()
# browser = await p.chromium.launch(headless=False, devtools=True)
    chromium = p.chromium # or "firefox" or "webkit".
    browser = await chromium.launch()
    page = await browser.new_page()
    await page.goto("https://www.baidu.com")
# other actions...
    await browser.close()

这个 case 可以执行成功,await page.goto("https://www.baidu.com") 可以正常完成

但是 在 conftest.py 简单封一层 fixture

@pytest.fixture(scope="session")
async def browser():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False)  # 可根据需要配置启动参数
        yield browser
        await browser.close()

@pytest.fixture
async def page(browser) -> AsyncGenerator:
    context = await browser.new_context()
    page = await context.new_page()
    yield page
    await context.close()

在 test_home.py

@pytest.mark.asyncio
async def test_home_page_loading(page):
    """测试首页加载"""
    await page.goto("https://www.baidu.com/")

这里 await page.goto("https://www.baidu.com") 代码就一直阻塞在这里,但是实际情况是已经执行完成了,这个在 UI 操作上是可以看到的。
问了 DS GPT. 都没能解答,自己感觉问题可能就在 yield 但是 就是没能想明白😂 😂 😂

共收到 5 条回复 时间 点赞

之前我写 demo 的时候是使用的 pytest.anyio 声明为异步方式运行的,你可以试试

dubda 回复

跟 pytest.mark.asyncio 结果是一样的

我复制了你的代码,运行没问题😅

dubda 回复

你有没有涉及到 asyncio_default_fixture_loop_scope 这个参数的配置? 我发现是这个配置成 function 并且 fixture 也改成 function 就可以正常跑,但是 asyncio_default_fixture_loop_scope 设置 session 就不行,或者说 fixture browser 设置成 session 其他事 function,就不行。应为我的目的是想要在 case 运行周期就启动一次浏览器,所有 case 都通过 context 创建 page 来实现。

这个参数没用过,我也没用过 pytest.mark,asyncio 这个插件,我是看 fastapi 用的 anyio 这个插件异步运行的用例

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up