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

Python下Selenium4使用Remote WebDriver配置Chrome DevTools报错排查

问题根源

1. 异步运行时不兼容

第一个RuntimeError: must be called from async context报错的核心原因是:Selenium 4.1版本的CDP/BiDi实现底层依赖trio异步运行时,无法直接在asyncio上下文中运行,和你写的协程逻辑无关,属于框架底层依赖不匹配。

2. Grid节点CDP地址配置错误

切换为trio运行后出现的连接失败报错,是因为Selenium Grid的Node节点默认返回的CDP websocket地址是0.0.0.0,这个地址仅支持本地访问,远程调用时无法正常连通。


解决步骤

步骤1:调整异步运行时为trio

将代码入口的asyncio.run替换为trio.run即可,trio完全兼容原生async/await语法,无需修改其他协程逻辑:

# 先安装依赖:pip install trio trio-websocket
import trio

# 替换原来的入口代码
if __name__ == "__main__":
    trio.run(main)

步骤2:修改Selenium Node启动参数

启动Chrome Node节点时,新增参数指定对外可访问的地址:

  • --hostname:填写Node节点的实际可访问IP/域名(即你Remote连接的D5365900对应的地址)
  • --port:填写Node节点的实际端口
    示例启动命令:
java -jar selenium-server-4.0.0.jar node --hostname D5365900 --port 5555 --detect-drivers true

临时验证方案

如果暂时不想调整Grid配置,可以在获取连接前手动修正websocket地址:

async with driver.bidi_connection() as session:
    # 手动把默认返回的0.0.0.0替换为实际的Node节点地址
    session.ws_url = session.ws_url.replace("0.0.0.0", "D5365900")
    cdp_session = session.session
    await cdp_session.execute(devtools.emulation.set_geolocation_override(latitude=41.8781, longitude=-87.6298, accuracy=100))

额外优化建议

可以将Selenium版本升级到4.3及以上,新版本优化了CDP对asyncio运行时的兼容,同时修复了Grid节点CDP地址自动识别的问题,能减少很多兼容错误。

内容的提问来源于stack exchange,提问作者josh42

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:06:03