实现 Selenium Grid 分布式运行测试用例,核心是通过 Hub(中心节点) 统一调度、 Node(代理节点) 执行用例,实现多浏览器 / 多机器并行测试
- Hub:Grid 的 "调度中心",负责接收测试请求、管理所有 Node 节点、分发用例到可用的 Node;
- Node:连接到 Hub 的 "执行节点",提供浏览器运行环境(Chrome/Firefox 等),执行 Hub 分发的用例;
- 核心价值:多机器 / 多浏览器并行执行用例,提升测试效率;支持跨平台(Windows/Linux/Mac)、跨浏览器测试。
1. 安装运行环境
1.1 下载 JDK(推荐 8/11 版本,兼容 Selenium 4.x):
- 官方:https://www.oracle.com/java/technologies/downloads/
- 国内镜像(推荐):https://repo.huaweicloud.com/java/jdk/
1.2 Windows:设置JAVA_HOME为 JDK 安装路径(如D:\jdk1.8.0_391),Path添加%JAVA_HOME%\bin - 本地解压jar包(下载地址:https://github.com/SeleniumHQ/selenium/releases(选择selenium-server-xxx.jar,如 4.38.0))
- 下载浏览器驱动(ChromeDriver/GeckoDriver)---Node 节点需驱动控制浏览器,驱动版本必须与浏览器版本严格匹配
- ChromeDriver:https://sites.google.com/chromium.org/driver/(国内镜像:https://registry.npmmirror.com/binary.html?path=chromedriver/);
- GeckoDriver(Firefox):https://github.com/mozilla/geckodriver/releases
1.3 切换到 jar 包目录后终端运行命令:java -jar selenium-server-4.38.0.jar hub 和 java -jar selenium-server-4.38.0.jar node
注意点: - 默认端口为4444,若被占用则java-jar selenium-server-4.38.0.jar hub --port 4445
- Hub 启动后不要关闭命令行窗口(关闭则 Hub 停止);
- 查看日志,出现Started Hub on port 4444表示启动成功;
- 远程机器访问 Hub 需替换localhost为 Hub 机器的 IP,且防火墙开放 4444 端口。


2. 访问启动的地址:http://192.168.1.14:4444/ui/----能访问成功则说明启动成功
3. 连接Grid-单个用例
python
import time
from selenium.webdriver import Remote, ChromeOptions
driver = Remote(
command_executor="http://127.0.0.1:4444",
options=ChromeOptions()
)
driver.get("https://www.baidu.com")
time.sleep(3)
driver.quit() # 在grid浏览器不会随着Python自动结束,务必要手动关闭!不然影响资源占用
4. 分布式执行
- 执行命令: pytest -n 4(执行并行数) / pytest test_grid.py -n auto (自动根据 CPU 核心数并行)
- 注意需要安装pytest-xdist插件: pip install pytest-xdist
python
import pytest
import time
from selenium.webdriver import Remote, ChromeOptions
@pytest.fixture()
def driver():
d = Remote(
command_executor="http://127.0.0.1:4444",
options=ChromeOptions()
)
yield d
d.quit() # 在grid 浏览器不会随着Python自动结束,务必要手动关闭!
@pytest.mark.parametrize(
"url",
[
"https://www.baidu.com",
"https://www.bilibili.com/",
"https://www.csdn.net/",
]
)
def test_ces(driver, url):
time.sleep(2)
driver.get(url)
执行结果:三个用例同时执行