Selenium 3.12/Java 10.0.1随机抛SocketException:Permission denied: connect求助
解决Selenium每隔2小时触发SocketException的问题
一、先明确:你没执行driver.quit()就是核心原因!
每次测试后不调用driver.quit(),会导致Geckodriver、Firefox进程残留,大量TCP连接处于未释放状态。Win7的系统端口资源是有限的,大概2小时左右就会被耗尽,自然就会弹出Permission denied: connect的错误——这完全符合你遇到的现象。
二、不用重启电脑的应急修复方法
如果现在已经触发错误,按下面步骤操作就能快速恢复:
- 打开任务管理器,找到所有
firefox.exe和geckodriver.exe进程,全部强制结束(别漏了,有时候会有多个后台残留进程) - 以管理员身份打开命令提示符,执行两条命令重置TCP/IP栈:
netsh int ip reset resetlog.txt netsh winsock reset - 等待1-2分钟让系统完成重置,再重新运行你的代码,问题就能暂时解决
三、从代码层面根治问题(避免再复发)
要彻底杜绝这个问题,必须保证WebDriver实例被正确关闭,哪怕代码执行出错也要执行关闭操作:
- 用
try-finally块包裹你的测试逻辑,确保driver.quit()一定会被调用:WebDriver driver = new FirefoxDriver(); try { // 这里写你的测试操作代码 } finally { if (driver != null) { driver.quit(); // 划重点:必须用quit,不是close!close只会关窗口,不会杀进程 } }补充:如果只是想查看浏览器内容,可以在测试逻辑末尾加个等待(比如
Thread.sleep(10000)),等你看完再让代码执行driver.quit(),这样既不影响调试,也不会残留资源
四、额外优化建议(让系统更“扛造”)
- 考虑把Geckodriver升级到适配Firefox60的最新小版本(虽然0.20.1是兼容的,但后续小版本可能修复了资源泄漏的细节问题)
- 调整Win7的TCP参数,提升系统的连接上限(这一步只需要做一次):
- 按下Win+R输入
regedit打开注册表编辑器 - 定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 右键新建DWORD(32位)值,分别设置:
MaxUserPort:数值数据填65534(这是系统能用到的最大端口数)TcpTimedWaitDelay:数值数据填30(把TIME_WAIT状态的连接等待时间从默认240秒缩短到30秒,加快资源释放)
- 设置完成后重启一次电脑,之后系统的连接资源管理会更高效
- 按下Win+R输入
内容的提问来源于stack exchange,提问作者Joe Stoner
相关产品推荐
相关产品推荐

