Skip to content

Selenium - Grid

Selenium Grid 允许您在多台机器、浏览器和操作系统上并行运行您的 WebDriver 测试。这显著加快了测试执行时间,特别是对于大型测试套件,并有助于进行跨浏览器兼容性测试。

Grid 不会在您的本地机器上按顺序运行测试,而是将测试分发到与请求的浏览器和平台能力(Capabilities)相匹配的可用“节点”(Nodes)上执行。

Selenium Grid 4 引入了现代化的架构,使设置和扩展更加容易。主要组件包括:

  • 路由器 (Router): 所有传入的 RemoteWebDriver 请求的入口点。它查询分发器以查找可用的节点。
  • 分发器 (Distributor): 管理可用节点的列表。它接收来自路由器的测试请求(Capability),并将其分配给匹配的、空闲的节点。
  • 会话映射 (Session Map): 跟踪活动会话,将会话 ID 映射到执行该会话的节点。
  • 节点 (Node): 运行实际浏览器自动化所在的机器(物理机或虚拟机)。节点向分发器注册自己,并声明它支持的浏览器和能力。
  • 事件总线 (Event Bus)(可选): 促进组件之间的通信,对于分布式设置非常有用。
  • 新会话队列 (New Session Queue): 当没有立即匹配的节点可用时, holding 传入的请求。

Grid 4 支持不同的运行模式:

  • 独立模式 (Standalone): 最简单的模式。单个进程充当路由器、分发器、会话映射和节点。非常适合在本地运行少量并行测试。
  • 中心模式 (Hub and Node(s)): 经典模式。一台机器运行中心 Hub(路由器、分发器、会话映射、事件总线),其他机器运行连接到 Hub 的节点。
  • 分布式模式 (Distributed): 每个组件(路由器、分发器、会话映射、事件总线、节点)都可以作为单独的进程运行,从而实现最大的可伸缩性和弹性。
  • Docker: Selenium 提供了官方的 Docker 镜像,可以轻松地在容器中设置 Grid 组件,强烈推荐用于动态扩展。

这是在本地开始使用 Grid 的最简单方式。

步骤 1: 下载 Selenium Server: 从 Selenium 官方网站下载最新的 Selenium Server JAR 文件:https://www.selenium.dev/downloads/

步骤 2: 确保浏览器驱动程序可用: 确保必要的浏览器驱动程序(例如 chromedriver, geckodriver)位于系统 PATH 中,或者在启动服务器时指定其位置(如果驱动程序位于 PATH 中,Grid 4 通常会自动检测到它们)。

步骤 3: 启动独立服务器: 打开终端或命令提示符,导航到下载 JAR 文件的目录,然后运行:

java -jar selenium-server-<version>.jar standalone

将 <version> 替换为实际版本号。这将以独立模式启动 Grid,通常监听 http://localhost:4444 端口。它会自动检测机器上可用的浏览器。

步骤 4: 访问 UI(可选): 打开您的 Web 浏览器,导航到 http://localhost:4444。您应该会看到 Grid UI,显示可用节点和正在运行的会话。

用于跨多台机器运行测试。

步骤 1: 启动 Hub: 在您的中心机器上(例如 192.168.1.100),运行:

java -jar selenium-server-<version>.jar hub

Hub 将启动,通常监听 4444 端口。

步骤 2: 启动节点: 在每台要运行浏览器的机器上(节点机器),下载 Selenium Server JAR 文件并确保驱动程序可用。然后运行:

# Example for a Node machine
# Grid will auto-detect browsers/drivers on the node
java -jar selenium-server-<version>.jar node --hub http://192.168.1.100:4444

将 192.168.1.100 替换为您的 Hub 机器的实际 IP 地址或主机名。节点将向 Hub 注册自己。为所有节点机器重复此步骤。

步骤 3: 验证设置: 在 Hub 机器上(http://192.168.1.100:4444)检查 Grid UI,查看已注册的节点。

要在 Grid 上运行您的 WebDriver 测试,您需要使用 RemoteWebDriver 而不是特定的驱动程序(如 ChromeDriver)。您还需要指定 Grid Hub 的 URL 和所需的 Capabilities(浏览器、平台)。

package com.example.gridtests;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Assert;
import org.testng.annotations.*;
import java.net.MalformedURLException;
import java.net.URL;
public class GridTest {
WebDriver driver;
URL gridUrl;
@Parameters("browser") // Get browser parameter from testng.xml
@BeforeTest
public void setup(String browser) throws MalformedURLException {
gridUrl = new URL("http://localhost:4444"); // Or your Hub URL
DesiredCapabilities caps = new DesiredCapabilities();
if (browser.equalsIgnoreCase("chrome")) {
caps.setBrowserName("chrome");
} else if (browser.equalsIgnoreCase("firefox")) {
caps.setBrowserName("firefox");
} else {
throw new IllegalArgumentException("Unsupported browser: " + browser);
}
// You can set other capabilities like platformName, browserVersion etc.
// caps.setPlatformName(Platform.WINDOWS);
System.out.println("Requesting " + browser + " from Grid: " + gridUrl);
driver = new RemoteWebDriver(gridUrl, caps);
driver.manage().window().maximize();
}
@Test
public void testGridExecution() {
driver.get("https://www.google.com");
System.out.println("Page title on " + driver.getCapabilities().getBrowserName() + ": " + driver.getTitle());
Assert.assertEquals(driver.getTitle(), "Google");
}
@AfterTest
public void tearDown() {
if (driver != null) {
driver.quit();
}
}
}

您通常会使用 TestNG XML 套件文件来运行此测试,以便传递浏览器参数并可能并行运行测试:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Grid Suite" parallel="tests" thread-count="2">
<test name="Chrome Test">
<parameter name="browser" value="chrome"/>
<classes>
<class name="com.example.gridtests.GridTest"/>
</classes>
</test> <!-- Test -->
<test name="Firefox Test">
<parameter name="browser" value="firefox"/>
<classes>
<class name="com.example.gridtests.GridTest"/>
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
  • Docker: 使用 Selenium 的 Docker 镜像可以显著简化设置和扩展。
  • 配置: 节点可以通过命令行标志或 TOML 配置文件进行配置,以指定驱动程序、最大会话数、stereotype 等。
  • 云端 Grid: 像 Sauce Labs, BrowserStack, LambdaTest 这样的服务提供了托管的云端 Selenium Grids,无需维护自己的基础设施。