近期因个人需要接触playwright,由于playwright新接触,想用jupyter进行API测试学习。刚开始使用sync_playwright,在playwright的Conda运行环境中,以console模式和单文件直接运行模式,都能正常运行。但是进入jupyter中后,sync_playwright就无法运行了。会出现如下提示:

Error: It looks like you are using Playwright Sync API inside the asyncio loop.
Please use the Async API instead.

在网上找到(如何在 Jupyter 笔记本中使用 Playwright 库而不是使用常规 .py 脚本(在 Windows 上) - python - SO中文参考 - www.soinside.com)这篇文章,才知道“Jupyter Notebook 使用 asyncio 事件循环,因此您应该使用 async api”。

于是将sync_playwright改成 async_playwright。然后又面临上述文章中的同样问题。

Not Implemented error

按照上述文章所说,更改jupyter核心运行库:

1、导航到 Python 目录中的 Lib/site-packages/ipykernel/kernelapp.py

2、将该文件中的一行代码注释掉

if sys.platform.startswith("win") and sys.version_info >= (3, 8):
    import asyncio

    try:
        from asyncio import WindowsProactorEventLoopPolicy, WindowsSelectorEventLoopPolicy
    except ImportError:
        pass
        # not affected
    else:
        if type(asyncio.get_event_loop_policy()) is WindowsProactorEventLoopPolicy:
            # WindowsProactorEventLoopPolicy is not compatible with tornado 6
            # fallback to the pre-3.8 default of Selector
            # 注释掉此行:asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())
            print(f'do not change to Selector Event Loop') #加入一行提示

则下述代码运行通过:

from playwright.async_api import async_playwright

playwright = await async_playwright().start()
browser = await playwright.chromium.launch(headless = False,)

c=await browser.new_context(viewport={'width':1024,'height':768})

page = await c.new_page()

await page.goto("http://image.baidu.com")

await page.locator("#kw").fill("XXX...")

await page.locator("#homeSearchForm > span.s_btn_wr > input").click()

async with  page.expect_popup() as page1_info:
     await page.locator("#imgid > div > ul > li:nth-child(6)").click()
page1 = await page1_info.value

await browser.close()
await playwright.stop()

此问题产生的原因,在这篇文章中有所描述:(Running Playwright in JupyterLab Notebook Problem - Not implemented Error - #2 by fomightez - JupyterLab - Jupyter Community Forum

目前microsoft在github playwright的bug回复里,这个问题并没有得到解决。所以这只能是一时之选。

11-15 09:35