Selenium - Grid
Selenium - Grid
Section titled “Selenium - Grid”Selenium Grid 允许您在多台机器、浏览器和操作系统上并行运行您的 WebDriver 测试。这显著加快了测试执行时间,特别是对于大型测试套件,并有助于进行跨浏览器兼容性测试。
Grid 不会在您的本地机器上按顺序运行测试,而是将测试分发到与请求的浏览器和平台能力(Capabilities)相匹配的可用“节点”(Nodes)上执行。
Selenium Grid 4 架构
Section titled “Selenium Grid 4 架构”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 组件,强烈推荐用于动态扩展。
设置 Selenium Grid(独立模式)
Section titled “设置 Selenium 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,显示可用节点和正在运行的会话。
设置 Selenium Grid(中心模式)
Section titled “设置 Selenium Grid(中心模式)”用于跨多台机器运行测试。
步骤 1: 启动 Hub: 在您的中心机器上(例如 192.168.1.100),运行:
java -jar selenium-server-<version>.jar hubHub 将启动,通常监听 4444 端口。
步骤 2: 启动节点: 在每台要运行浏览器的机器上(节点机器),下载 Selenium Server JAR 文件并确保驱动程序可用。然后运行:
# Example for a Node machine# Grid will auto-detect browsers/drivers on the nodejava -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 上运行测试
Section titled “在 Grid 上运行测试”要在 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,无需维护自己的基础设施。