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

咸吃萝卜淡操心 · 2025年02月18日 · 最后由 dubda 回复于 2025年02月27日 · 5052 次阅读

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

直接 使用

 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 这个插件异步运行的用例

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册