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
相关产品推荐
相关产品推荐

