如何通过代码获取Chrome DevTools的WebSocket地址(Selenium场景)
获取Chrome DevTools WebSocket地址的方法
嘿,这个问题我之前也折腾过!默认情况下ChromeDriver确实会把DevTools的WebSocket地址输出到标准输出,但直接从driver实例里找不到现成的属性来获取它,不过有两个可靠的方法可以搞定:
方法一:通过Selenium日志API捕获(推荐)
这是最省心的方式,只需要配置Chrome的日志参数,然后通过Selenium自带的日志接口提取地址:
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 配置Chrome选项,开启日志并设置足够低的日志级别 chrome_options = Options() chrome_options.add_argument('--enable-logging') chrome_options.add_argument('--log-level=0') # INFO级别,确保能捕获到DevTools地址的日志 # 启动Chrome Driver driver = webdriver.Chrome(options=chrome_options) # 遍历driver日志,提取WebSocket地址 devtools_ws_url = None for log_entry in driver.get_log('driver'): if 'DevTools listening on' in log_entry['message']: # 拆分日志消息拿到地址 devtools_ws_url = log_entry['message'].split('DevTools listening on ')[1].strip() break if devtools_ws_url: print(f"找到DevTools WebSocket地址:{devtools_ws_url}") else: print("未找到DevTools WebSocket地址") # 后续业务操作... driver.quit()
说明:
--enable-logging用于开启Chrome的日志输出,--log-level=0对应INFO级别,保证不会漏掉包含WebSocket地址的日志条目。- 日志里的关键词
DevTools listening on在不同ChromeDriver版本中基本稳定,所以用字符串拆分或者正则匹配都能准确提取地址。
方法二:直接捕获ChromeDriver进程的标准输出
如果第一种方法在你的环境里不生效(比如日志被系统重定向),可以手动启动ChromeDriver进程并读取它的标准输出:
import subprocess import re from selenium.webdriver.remote.webdriver import WebDriver # 启动ChromeDriver进程,捕获标准输出 chromedriver_proc = subprocess.Popen( ['chromedriver', '--port=9515'], # 指定端口避免冲突 stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True ) # 逐行读取输出,匹配WebSocket地址 devtools_ws_url = None for line in iter(chromedriver_proc.stdout.readline, ''): match_result = re.search(r'DevTools listening on (ws://.*)', line) if match_result: devtools_ws_url = match_result.group(1) break if devtools_ws_url: print(f"找到DevTools WebSocket地址:{devtools_ws_url}") # 通过RemoteWebDriver连接到ChromeDriver driver = WebDriver(command_executor='http://localhost:9515', desired_capabilities={'browserName': 'chrome'}) # 后续业务操作... driver.quit() else: print("未找到DevTools WebSocket地址") # 终止ChromeDriver进程 chromedriver_proc.terminate()
说明:
- 这种方式需要手动管理ChromeDriver进程,还要注意端口冲突问题,所以建议指定固定端口。
- 适合需要完全控制进程输出的场景,但日常使用还是第一种方法更方便。
内容的提问来源于stack exchange,提问作者Max Mikhaylov
相关产品推荐
相关产品推荐

