当前位置: 首页 > news >正文

Chrome 调试器第二次连接不上?

一、连接不上

当使用 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 端口的进程信息。
    • 释放端口:根据查找到的进程 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:
    1. 查看 Chrome 浏览器的版本号:在 Chrome 浏览器的地址栏输入 chrome://settings/help,即可查看当前 Chrome 版本。
    2. 下载对应版本的 ChromeDriver:访问 ChromeDriver 官方下载页面,下载与 Chrome 版本对应的 ChromeDriver。
    3. 替换旧的 ChromeDriver:将下载的 ChromeDriver 替换掉原来的 ChromeDriver 可执行文件。

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:58148127.0.0.1:58149 建立了连接(ESTABLISHED 状态)。这个进程很可能是正在运行的 Chrome 实例。
  • 进程 19784:它与 127.0.0.1:9222 建立了两个连接(ESTABLISHED 状态),可能是你的 Python 脚本或者其他程序尝试连接到 Chrome 的调试端口。

可能的问题及解决办法

1. Chrome 实例未正常关闭

如果 Chrome 实例没有正常关闭,就会一直占用 9222 端口。你可以尝试手动结束相关进程。

  • 结束进程:打开任务管理器,切换到“详细信息”选项卡,找到进程 ID 为 1358819784 的进程,然后右键选择“结束任务”。
  • 使用命令行结束进程:以管理员身份运行命令提示符,执行以下命令结束进程:
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)

完成上述操作后,再次尝试连接调试器,应该就能正常连接了。

相关文章:

  • 关闭Windows更新
  • Vue3 + Element Plus 图片加载优化全攻略
  • 为什么选择 Rust 和 WebAssembly?
  • vue-router实现
  • C/C++中应用程序调用其他dll模块,想要使用vs调试这个dll里的代码,附加进程的方式无法命中断点,但通过调试启动的方式却可以,是什么原因?
  • Appium使用文档
  • GaussDB备份数据常用命令
  • Cortical Labs公司CL1人脑芯片:开启生物智能计算新时代
  • MQTT客户端调试工具模拟MQTT设备接入物联网平台
  • 垃圾分类--环境配置
  • C++进阶——AVL树的实现
  • 首页性能优化
  • Vala 开发环境搭建
  • 第一章 面向对象高级部分
  • 「灰度发布与 A/B 测试」如何降低上线风险?
  • 天梯赛训练L1-031——L1-040
  • ImGui 学习笔记(六)—— 高 DPI 缩放
  • OpenCV计算摄影学(22)将输入的彩色图像转换为两种风格的铅笔素描效果函数pencilSketch()
  • 共享 IP 与独立 IP:长期邮件营销的优劣比较
  • 算法刷题整理合集(五)
  • 摩天大楼天津117大厦复工背后:停工近十年,未知挑战和压力仍在
  • 日月谭天丨赖清德强推“脱中入北”是把台湾带向死路
  • 见证上海援藏30年成果,萨迦非遗珍品展来沪
  • 国家发改委:建立实施育儿补贴制度
  • 四川在浙江公开招募200名退休教师,赴川支教帮扶
  • 中国航天员乘组完成在轨交接,神十九乘组将于29日返回地球