playwright在vscode+jupyter中出现NotImplementedError问题

近期因个人需要接触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)

It appears that the problem is specific to Windows Platform and as identified in the original question as the use of SelectorEventLoopPolicy rather than ProactorEventloopPolicy in JupyterLabs is the source of the issue.

Since SelectorEventLoopPolicy does not support Pipes the Not implemented error occurs when Playwright first tries to open a pipe.

...

#asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())

Comment out that line,

Not sure if this will have any adverse effects on other operations, but it does cause the original code to execute in JupyterLab.
似乎这个问题是特定于Windows平台的,并且在原始问题中确定为在JupyterLabs中使用SelectorEventLoopPolicy而不是ProactorEventloopPolicy是问题的根源。

由于SelectorEventLoopPolicy不支持管道,当playwright第一次尝试打开管道时,会出现not implemented错误。

#asyncio.set_event_loop_policy(WindowsSelectorEventLoopPolicy())

注释掉这行代码,

不确定这是否会对其他操作产生任何不利影响,但它确实会导致原始代码在JupyterLab中执行。

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

相关推荐
爱上纯净的蓝天4 小时前
不用云做 RAG:一个本地笔记问答工具的取舍与坑
python·开源·大模型·rag·本地部署
cspttty5 小时前
2027风险管理岗准备路线:数学与应用数学如何补齐金融、SQL与Python
开发语言·python·金融
用户8356290780515 小时前
如何使用 Python 格式化 Excel 单元格中的长文本
后端·python
我命由我123455 小时前
Python 开发 - Python 的 pathlib
java·开发语言·后端·python·学习·java-ee·学习方法
严谨的麻辣烫6 小时前
Python HTTP 连接池怎么用?从连接复用到请求异常排查
开发语言·python·http·requests·网络排查
摇滚侠6 小时前
《Java并发编程之美》第 4 章 Java 并发包中原子操作类原理剖析 阅读笔记 7
java·笔记·python
用户8356290780516 小时前
如何使用 Python 在 Word 文档中创建和格式化列表
后端·python
GIoT80106 小时前
网络出口如何选择?固定 IP 与 IP 轮换的原理及实践
python
羡林i6 小时前
ProcessPoolExecutor 传参踩坑实测:pickle 失败的四种写法
python
Dmz丶6 小时前
前端转 AI 100 天 Day 30:正式上线——从零部署一个完整服务(含 30 天复盘)
python