You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:32:39