Ruby+Selenium附加已启动的Edge浏览器时脚本冻结并抛出Net::ReadTimeout错误的问题求助
嘿,我来分享几个我碰到过的类似问题的排查方向,你可以一个个试试:
1. 先检查Edge启动的用户数据目录是否冲突
你用的是Edge默认的User Data目录,但如果在启动带调试参数的Edge之前,已经有其他Edge进程在后台运行(比如任务管理器里的msedge.exe),这个目录会被占用,导致你新启动的Edge实例其实没有真正启用远程调试功能——相当于端口9111根本没在监听,脚本自然连不上就超时卡住了。
解决办法:换一个全新的临时目录作为调试用的用户数据目录,比如:
msedge.exe --remote-debugging-port=9111 --no-first-run --no-default-browser-check --user-data-dir="C:\Temp\EdgeDebugProfile"
启动前记得杀掉所有Edge进程,确保没有残留。
2. 确认9111端口真的在被Edge监听
打开命令提示符,运行:
netstat -ano | findstr :9111
看看输出里有没有对应的TCP连接,并且PID对应的进程是不是你刚启动的Edge。如果没有任何输出,说明你的Edge启动命令有问题,远程调试端口没开起来;如果PID不对,说明是其他进程占了这个端口,换个端口试试(比如9222)。
3. 检查Selenium驱动和Edge版本是否完全匹配
这是Selenium调试最容易踩的坑!msedgedriver的版本必须和你安装的Edge浏览器大版本完全一致(小版本尽量接近)。比如你Edge是126.x,那msedgedriver也得是126.x的版本。
怎么查:在Edge地址栏输edge://version看浏览器版本,然后下载对应版本的msedgedriver,确保它在系统PATH里,或者在脚本里指定驱动路径(比如Selenium::WebDriver::Edge.driver_path = 'C:\path\to\msedgedriver.exe')。
4. 调整Ruby Selenium的Options初始化写法
不同版本的Ruby Selenium对Edge Options的初始化写法可能有差异,你试试把Options的创建代码改成这样:
options = Selenium::WebDriver::Edge::Options.new options.debugger_address = '127.0.0.1:9111'
有些版本用Selenium::WebDriver::Options.edge可能会有隐性的初始化问题,换成上面的写法更稳妥。
5. 排除防火墙/安全软件的拦截
有时候Windows防火墙或者第三方杀毒软件会拦截本地进程之间的TCP通信(也就是Ruby脚本和Edge的调试端口通信),你可以临时关闭防火墙试试,如果脚本能正常运行了,就把Ruby和Edge加入防火墙的信任列表。
先从第1、2点开始排查,这两个是最常见的原因,我之前碰到的类似问题都是用户数据目录冲突导致的,换个临时目录就好了!




