一、连接不上
当使用 chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
连接 Chrome 调试器时,调试一次后就连不上,可能由以下几种原因导致:
1. Chrome 实例关闭
- 原因:在调试过程结束后,如果 Chrome 实例被意外关闭,那么监听在
127.0.0.1:9222
端口的调试服务也会随之停止。当下次再尝试连接该端口时,由于没有服务在监听,就会连接失败。 - 解决办法:确保在每次调试前,Chrome 实例已经正确启动并开启了远程调试模式。可以使用以下命令启动 Chrome 并开启远程调试:
# Windows
chrome.exe --remote-debugging-port=9222
# macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
# Linux
google-chrome --remote-debugging-port=9222
2. 端口被占用
- 原因:可能在调试过程中,其他程序占用了
9222
端口,导致 Chrome 无法继续监听该端口。或者在 Chrome 关闭后,该端口没有被正确释放。 - 解决办法:
- 检查端口占用情况:
- Windows:使用
netstat -ano | findstr :9222
命令查看占用9222
端口的进程 ID。 - macOS/Linux:使用
lsof -i :9222
命令查看占用9222
端口的进程信息。
- Windows:使用
- 释放端口:根据查找到的进程 ID,结束相应的进程。在 Windows 中可以使用
taskkill /F /PID <进程 ID>
命令;在 macOS/Linux 中可以使用kill -9 <进程 ID>
命令。 - 更改端口:如果
9222
端口经常被占用,可以尝试更改 Chrome 的远程调试端口,例如使用9223
端口:
- 检查端口占用情况:
# 以 Windows 为例
chrome.exe --remote-debugging-port=9223
同时,在代码中也要相应地修改调试地址:
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9223")
driver = webdriver.Chrome(options=chrome_options)
3. 浏览器版本与驱动不兼容
- 原因:如果 Chrome 浏览器版本和 ChromeDriver 版本不兼容,可能会导致连接调试器时出现问题,甚至在调试一次后就无法再次连接。
- 解决办法:确保 Chrome 浏览器和 ChromeDriver 版本兼容。可以通过以下步骤更新 ChromeDriver:
- 查看 Chrome 浏览器的版本号:在 Chrome 浏览器的地址栏输入
chrome://settings/help
,即可查看当前 Chrome 版本。 - 下载对应版本的 ChromeDriver:访问 ChromeDriver 官方下载页面,下载与 Chrome 版本对应的 ChromeDriver。
- 替换旧的 ChromeDriver:将下载的 ChromeDriver 替换掉原来的 ChromeDriver 可执行文件。
- 查看 Chrome 浏览器的版本号:在 Chrome 浏览器的地址栏输入
4. 代码中未正确处理浏览器会话
- 原因:如果代码中在调试结束后没有正确关闭浏览器会话,可能会导致 Chrome 处于异常状态,从而无法再次连接调试器。
- 解决办法:在代码中确保在调试结束后正确关闭浏览器会话。例如:
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=chrome_options)
try:
# 进行调试操作
driver.get("https://www.example.com")
finally:
# 确保在调试结束后关闭浏览器会话
driver.quit()
二、端口查看
netstat -ano | findstr :9222
TCP 127.0.0.1:9222 0.0.0.0:0 LISTENING 13588
TCP 127.0.0.1:9222 127.0.0.1:58148 ESTABLISHED 13588
TCP 127.0.0.1:9222 127.0.0.1:58149 ESTABLISHED 13588
TCP 127.0.0.1:58148 127.0.0.1:9222 ESTABLISHED 19784
TCP 127.0.0.1:58149 127.0.0.1:9222 ESTABLISHED 19784
三、解决
从你执行 netstat -ano | findstr :9222
命令得到的输出结果来看,端口 9222
确实被占用了,有多个与该端口相关的连接处于 ESTABLISHED
(已建立连接)状态,下面为你分析具体情况以及对应的解决办法。
分析输出结果
- 进程
13588
:它正在监听127.0.0.1:9222
端口(LISTENING
状态),并且与127.0.0.1:58148
和127.0.0.1:58149
建立了连接(ESTABLISHED
状态)。这个进程很可能是正在运行的 Chrome 实例。 - 进程
19784
:它与127.0.0.1:9222
建立了两个连接(ESTABLISHED
状态),可能是你的 Python 脚本或者其他程序尝试连接到 Chrome 的调试端口。
可能的问题及解决办法
1. Chrome 实例未正常关闭
如果 Chrome 实例没有正常关闭,就会一直占用 9222
端口。你可以尝试手动结束相关进程。
- 结束进程:打开任务管理器,切换到“详细信息”选项卡,找到进程 ID 为
13588
和19784
的进程,然后右键选择“结束任务”。 - 使用命令行结束进程:以管理员身份运行命令提示符,执行以下命令结束进程:
taskkill /F /PID 13588
taskkill /F /PID 19784
2. 代码中未正确释放资源
如果你的 Python 脚本在结束时没有正确关闭浏览器会话,会导致 Chrome 实例一直运行。确保在代码中使用 driver.quit()
来关闭浏览器会话,示例代码如下:
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=chrome_options)
try:
# 进行调试操作
driver.get("https://www.example.com")
finally:
# 确保在调试结束后关闭浏览器会话
driver.quit()
3. 更改端口
如果 9222
端口一直被占用,你可以尝试更改 Chrome 的远程调试端口。
- 启动 Chrome 并指定新端口:在命令提示符中执行以下命令启动 Chrome 并使用
9223
端口:
chrome.exe --remote-debugging-port=9223
- 修改代码中的调试地址:
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9223")
driver = webdriver.Chrome(options=chrome_options)
完成上述操作后,再次尝试连接调试器,应该就能正常连接了。