调用Appium Driver的quit方法时偶现Connection refused错误原因咨询
Hey,我碰到过不少这类偶发的WebDriver连接拒绝问题,给你梳理下最常见的几个原因,帮你定位排查:
WebDriver驱动进程提前崩溃
这是最常见的原因之一。比如chromedriver、geckodriver这类驱动进程,可能因为测试用例执行了大量资源密集型操作(比如打开几十个标签页、处理大文件上传),导致系统内存/CPU耗尽,驱动进程被系统强制终止;或者因为浏览器版本和驱动版本不兼容,运行中出现隐性崩溃。当你调用driver.quit()时,客户端已经找不到对应的驱动进程,自然就会抛出Connection refused异常。本地端口通信冲突或延迟
WebDriver客户端和驱动进程是通过本地端口(比如默认的9515)进行通信的。如果你的测试脚本短时间内频繁启动/关闭驱动,可能出现端口还没被系统完全释放就被重新占用的情况;或者系统网络栈因为负载过高,导致quit()的关闭请求无法及时送达驱动进程,此时驱动进程可能已经处于不可响应状态,进而触发连接拒绝。资源释放顺序不当
如果你在调用driver.quit()之前,手动调用了driver.close()关闭当前窗口,或者通过页面元素触发了浏览器窗口关闭,此时驱动进程可能已经进入半关闭状态,但客户端还持有驱动实例。这时候再调用quit(),就可能因为无法和驱动进程建立有效连接而报错。另外,多线程场景下如果没有做好WebDriver实例的同步管理,也会偶发这类问题。系统级别的外部干扰
比如系统防火墙、杀毒软件误拦截了本地端口的通信;或者Linux系统的OOM Killer(内存耗尽时自动杀进程)在后台杀死了驱动进程;甚至是系统的进程管理工具(比如Windows的任务管理器)意外终止了驱动进程。这些外部因素导致的驱动进程消失,都会让quit()请求找不到目标,抛出连接拒绝异常。
一些排查小建议
- 每次测试执行后,通过系统命令(比如
ps、任务管理器)检查驱动进程是否还存在,确认是不是在quit()前就已经终止; - 严格匹配浏览器和WebDriver驱动的版本,比如Chrome版本必须和ChromeDriver版本完全对应;
- 在测试代码中添加日志,记录
quit()前后的系统内存、CPU使用情况,以及驱动进程的PID状态; - 尽量让
driver.quit()统一处理浏览器和驱动的资源释放,避免手动关闭窗口后再调用quit()。
内容的提问来源于stack exchange,提问作者the_prole

