引言
使用 Selenium、Selenium Grid、DrissionPage、cdp4j、Puppeteer、Playwright 等自动化测试浏览器的时候,在 Windows 11 可能会出现无法连接浏览器、或出现错误提示:Unable to connect to the chrome remote debugging server localhost 9222。通常表示客户端尝试连接 Chrome 浏览器的远程调试端口 (通常是 9222),但未能成功连接。这可能有几种原因:
- Chrome 未启动或未能:Chrome 浏览器可能没有启动,或者没有以启用远程调试模式启动。
- 端口未开放:Chrome 可能没有监听端口 9222 或者被防火墙阻止。
- 其他进程占用端口:端口 9222 可能被其他进程占用。
- 网络问题:网络配置或本地主机名解析问题。
- 其他:检查一下浏览器继续后台运行是否关闭,例如:Chrome 在 设置 - 系统 - 关闭 Google Chrome 后继续运行后台应用;Edge 是在 设置 - 系统和性能 - 在 Microsoft Edge 关闭后继续运行后台扩展和应用。关闭该设置之后,在任务管理器里面结束该任务。
该问题检查到天亮,重装了 Python、Pycharm、Chrome,降级了 Python、Chrome,我以为我解决了,没想到是天亮了……
公众号:人生只不过是一场投资
原理
本文不讲原理,只提供方案。
本文探讨的是端口占用的情况,正文开始。
使用 cmd 判断该端口是否被占用
netstat -ano | findstr "9222"
TCP 127.0.0.1:9222 0.0.0.0:0 LISTENING 23928
TCP 127.0.0.1:62671 127.0.0.1:9222 TIME_WAIT 0
TCP 127.0.0.1:62695 127.0.0.1:9222 TIME_WAIT 0
TCP 127.0.0.1:62697 127.0.0.1:9222 TIME_WAIT 0
如该返回代码所示,端口号在进程 id 为 23928 的进程 LISTENING(监听或者使用)中,这时候,我们可以使用 win + x 放开之后按 T 打开任务管理器(如果这个步骤你不是任务管理器,请使用 Ctrl + Alt + Delete(或者小键盘的点 .
)),接下来跟着我的步骤找对应的进程:(找到后是否结束任务?请根据自己实际情况来)
注意:手动查找的时候要注意逐层翻查,因为有可能是子进程的占用,而非主进程:
Python 解决方案
手动查找太麻烦了,人生苦短,我用 Python
import psutil
def get_process_using_port(port):
for conn in psutil.net_connections(kind='inet'):
if conn.laddr.port == port:
process = psutil.Process(conn.pid)
return process
return None
def main(port=9222, name="chrome.exe"):
process = get_process_using_port(port)
if process:
process_name = process.name().lower()
print(f"Port {port} is being used by {process_name}")
if process_name != name:
print(f"Killing process {process_name} (PID: {process.pid})")
process.kill()
else:
print(f"Port {port} is not in use.")
if __name__ == "__main__":
main()
只要关闭了 “关闭后继续运行后台扩展和应用” 这个功能,使用 Python 判断对应的进程是否是要查找的进程名,不是就直接关闭。