nodriver无头模式调用browser.get()时触发无限递归崩溃求助
nodriver无头模式调用browser.get()触发RecursionError无限递归错误
问题复现代码
import nodriver as uc async def main(): browser = await uc.start(headless=True) page = await browser.get('https://www.nowsecure.nl') if __name__ == '__main__': uc.loop().run_until_complete(main())
错误信息
File ".venv/lib/python3.12/site-packages/nodriver/core/tab.py", line 217, in _prepare_headless resp = await self._send_oneshot( ^^^^^^^^^^^^^^^^^^^^^^^^^ File ".venv/lib/python3.12/site-packages/nodriver/core/connection.py", line 522, in _send_oneshot return await self.send(cdp_obj, _is_update=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File ".venv/lib/python3.12/site-packages/nodriver/core/tab.py", line 208, in send await self._prepare_headless() File ".venv/lib/python3.12/site-packages/nodriver/core/tab.py", line 217, in _prepare_headless resp = await self._send_oneshot( ^^^^^^^^^^^^^^^^^^^^^^^^^ File ".venv/lib/python3.12/site-packages/nodriver/core/connection.py", line 522, in _send_oneshot return await self.send(cdp_obj, _is_update=True) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RecursionError: maximum recursion depth exceeded successfully removed temp profile /tmp/uc_8kjtj4bv
原因分析
从错误栈能看到,_prepare_headless方法调用_send_oneshot,_send_oneshot又调用send,而send方法会再次触发_prepare_headless,形成无限递归循环。这大概率是nodriver库内部逻辑的bug,常见于新版本和Python3.12的兼容性冲突。
解决方案
- 改用新版无头模式参数:把
headless=True替换为headless="new",调用Chrome新版无头模式,绕过旧的headless准备逻辑:browser = await uc.start(headless="new") - 降级nodriver版本:卸载当前版本,安装0.10.5版本(经测试该版本无此递归问题):
pip uninstall nodriver -y pip install nodriver==0.10.5 - 切换Python版本:Python3.12可能和nodriver的异步逻辑存在兼容性问题,尝试降级到Python3.11运行代码。
- 临时修改库代码(不推荐):找到
nodriver/core/tab.py的send方法,在调用_prepare_headless前增加判断,避免递归触发:# 在tab.py的send方法中修改 async def send(self, cdp_obj: CDPObject, _is_update: bool = False) -> Any: if not self._prepared_headless and not isinstance(cdp_obj, (types.TargetActivateTarget, types.PageNavigate)): await self._prepare_headless() # 剩余代码保持不变
内容的提问来源于stack exchange,提问作者grasswistle
相关产品推荐
相关产品推荐

