必须先启动 hub 再启动 node:hub 命令为 java -jar selenium-server-4.19.0.jar standalone --host 0.0.0.0 --port 4444;node 命令为 java -jar selenium-server-4.19.0.jar node --publish-events tcp://localhost:4442 --subscribe-events tcp://localhost:4443。

启动 Selenium Grid 的 hub 和 node 要用什么命令?
必须先启动 hub,再让 node 注册上去,顺序不能反。hub 是调度中心,node 是真正执行浏览器操作的机器。
启动 hub(默认端口 4444):java -jar selenium-server-4.19.0.jar standalone --host 0.0.0.0 --port 4444
启动 node(需提前装好对应浏览器和驱动):java -jar selenium-server-4.19.0.jar node --publish-events tcp://hub-host:4442 --subscribe-events tcp://hub-host:4443
-
--publish-events和--subscribe-events地址要和 hub 实际监听地址一致;本地测试可写tcp://localhost:4442 - node 会自动探测本机已安装的浏览器(Chrome、Firefox),但
chromedriver或geckodriver必须在$PATH中,否则注册失败且无明确报错 - 如果 hub 和 node 在不同机器上,注意防火墙放行 4442/4443/4444 端口
Python 脚本里怎么连接 Grid 并指定浏览器和版本?
不用本地启动 webdriver.Chrome(),而是通过 Remote 连接 hub 的 /session 接口,并用 capabilities 声明期望环境。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
示例(Chrome 128):
from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver
caps = {
"browserName": "chrome",
"browserVersion": "128",
"selenium:options": {"acceptInsecureCerts": True}
}
driver = webdriver.Remote(
command_executor="http://localhost:4444/wd/hub",
options=webdriver.ChromeOptions().add_experimental_option("capabilities", caps)
)
-
browserName必须小写,值为"chrome"或"firefox",不是"Chrome" -
browserVersion是 node 上实际安装的版本号,不匹配会导致 session 创建超时或 fallback 到默认版本 - Selenium 4+ 不再推荐用
DesiredCapabilities,改用ChromeOptions+add_experimental_option("capabilities", ...)
为什么 node 注册后显示在线,但脚本总报 “No matching capability”?
这是最常卡住的地方:Grid 匹配逻辑比看起来严格,尤其是版本字段和扩展 capability。
- node 日志里若出现
Matched 0 capabilities,说明 hub 收到请求,但没找到满足全部条件的 node - 检查 node 是否真的支持你声明的
browserVersion:运行google-chrome --version确认输出是Google Chrome 128.x.x,而非128.0.6578.123—— 后者会被截断为128.0,与"128"不等价 - 加
"platformName": "linux"(或"windows")能提高匹配成功率,尤其混用系统时 - 避免在 capabilities 里传无效键,比如
"chromeOptions"在 Selenium 4+ 已废弃,应统一走selenium:options
Grid 集群跑多浏览器并发时要注意什么?
并发数不是无限的,它受限于 node 机器的 CPU、内存和浏览器进程开销。
- 一个 Chrome 实例约占用 300–600MB 内存,16GB 内存的 node 建议最多并行 12–16 个 session
- node 启动时可通过
--max-sessions 8显式限制最大并发,防止资源耗尽崩溃 - 不同浏览器不能共享 session,Chrome 和 Firefox 请求会分发到不同 node —— 如果只启了一个 node 且只装了 Chrome,Firefox 请求永远失败
- 脚本中别复用
driver实例,每个 test case 应新建 + quit,否则 Grid 无法正确回收 slot
实际部署时,hub 的 --host 和 node 的 --publish-events 地址最容易填错;更隐蔽的问题是 node 机器上 DISPLAY 环境变量缺失(Linux headless 模式下需配 Xvfb 或用 --headless=new)。这些细节不报错,但会让测试静默失败。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










