Selenium分布式测试怎么配置

wen python案例 26

本文目录导读:

Selenium分布式测试怎么配置

  1. 核心概念
  2. 前提条件
  3. 配置步骤(Selenium Grid 4 推荐方式)
  4. 客户端测试脚本配置
  5. 常见问题与技巧

Selenium分布式测试主要通过 Selenium Grid 实现,其核心思想是:一个 Hub(中心节点) 负责接收测试请求并分发任务,多个 Node(节点) 负责实际执行浏览器自动化操作。

以下是详细的配置步骤和说明,涵盖从基础搭建到进阶技巧。

核心概念

  • Hub(中心)
    • 接收客户端(你的测试脚本)发来的测试请求。
    • 管理已注册的 Node 列表和它们的能力(如浏览器类型、版本、操作系统)。
    • 将测试任务分配给一个或多个合适的 Node。
  • Node(节点)
    • 实际执行测试的机器。
    • 可以运行在不同的操作系统、不同浏览器版本上。
    • 必须向 Hub 注册。

前提条件

  1. 环境要求:所有参与测试的机器(Hub 和 Node)需要安装 Java 8 或更高版本。
  2. Selenium Server:需要下载 selenium-server-<version>.jar 文件(旧版使用单独的 selenium-server-standalone.jar,新版 x 及以上只需一个 jar 包)。
  3. 浏览器驱动:每个 Node 机器上,根据要使用的浏览器,安装对应的 WebDriver(如 ChromeDriver、GeckoDriver for Firefox、EdgeDriver 等),并将其所在目录加入系统环境变量 PATH 中。
  4. 网络环境
    • Hub 机器需要有一个固定 IP 或可被 Node 机器访问的主机名。
    • 确保防火墙允许 Hub(默认 4444 端口)和 Node(默认 5555 端口,可配置)之间的通信。

配置步骤(Selenium Grid 4 推荐方式)

Selenium 4 大幅简化了配置,支持多种模式。推荐使用完全分布式模式,因为它将不同功能解耦,更稳定、更易于扩展。

简易模式(Standalone Hub + Node)

这种方式启动一个内置了 Hub 的独立服务器,然后在其他机器上单独启动 Node 并注册,适合小型环境。

启动 Hub(在主控机器上)

# 启动 Hub,默认监听 0.0.0.0:4444
java -jar selenium-server-<version>.jar hub
# 如果需要配置端口、超时等,使用参数
# java -jar selenium-server-<version>.jar hub --port 4444 --session-request-timeout 300

启动 Node(在每个工作机器上)

# 启动 Node,并指定要连接的 Hub 地址(替换 <hub-ip> 为实际的 Hub IP 或主机名)
java -jar selenium-server-<version>.jar node --detect-drivers true --hub http://<hub-ip>:4444
# 更常见的配置:指定最大并发会话数、浏览器类型
# 最多 5 个 Chrome 并发,最多 2 个 Firefox 并发
java -jar selenium-server-<version>.jar node \
    --hub http://<hub-ip>:4444 \
    --max-sessions 5 \
    --override-max-sessions true \
    --driver-configuration display-name="Chrome" max-sessions=3 \
    --driver-configuration display-name="Firefox" max-sessions=2

验证:打开浏览器,访问 http://<hub-ip>:4444,你会看到一个 Grid 控制台,显示已注册的 Node 及其状态。


完全分布式模式(推荐用于生产或复杂环境)

将 Hub 拆分为四个独立的组件,每个组件可以单独部署、升级和扩展,提高可靠性和可维护性。

  • Router(路由器):入口点,接收所有客户端请求,将其转发给正确的组件。
  • Distributor(分发器):负责跟踪和管理所有 Node 的负载和会话信息,为新会话分配最优 Node。
  • Session Map(会话映射器):维护活跃会话 ID 和其所在 Node 的映射关系,用于直接转发指令给正确的 Node。
  • Node(节点):与简易模式相同,但连接到 Router 而非 Hub。

启动步骤(顺序启动)

# 1. 在机器 A(或同一台机器上)启动 Event Bus(事件总线,用于组件间通信)
java -jar selenium-server-<version>.jar event-bus
# 2. 启动 Session Map
java -jar selenium-server-<version>.jar sessions
# 3. 启动 Distributor
java -jar selenium-server-<version>.jar distributor --sessions http://localhost:5557 --bind-bus false
# 4. 启动 Router(客户端将连接到这个地址,默认端口 4444)
java -jar selenium-server-<version>.jar router --sessions http://localhost:5557 --distributor http://localhost:5553
# 5. 在每个 Node 机器上启动 Node,并连接到 Router(不是 Hub)
# 注意:Node 的注册地址是 Router 的地址(通常是 localhost),但 Node 需要能被 Distributor 访问到。
# 更常见的做法:Node 指定 Router 的地址
java -jar selenium-server-<version>.jar node --publish-events tcp://<router-ip>:4442 --subscribe-events tcp://<router-ip>:4443

注意:在分布式模式下,Node 注册时的端口、事件总线配置需要精确,通常建议使用 YAML 或 JSON 配置文件来简化管理。

通过配置文件启动(推荐)

创建配置文件 config.toml (Grid 4 推荐格式):

[router]
host = "0.0.0.0"
port = 4444
sessions = "http://localhost:5557"
distributor = "http://localhost:5553"
[node]
host = "0.0.0.0"
port = 5555
detect-drivers = true
max-sessions = 5
[[node.driver-configuration]]
display-name = "Chrome"
stereotype = "{\"browserName\": \"chrome\", \"browserVersion\": \"latest\"}"
max-sessions = 3
[[node.driver-configuration]]
display-name = "Firefox"
stereotype = "{\"browserName\": \"firefox\", \"browserVersion\": \"latest\"}"
max-sessions = 2

然后启动:

java -jar selenium-server-<version>.jar node --config config.toml

客户端测试脚本配置

无论使用哪种模式,你的测试脚本只需要知道 Router(或简易模式的 Hub) 的地址,使用 RemoteWebDriver 即可。

Python 示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
# 1. 创建 ChromeOptions,指明要使用的浏览器能力
chrome_options = webdriver.ChromeOptions()
chrome_options.set_capability("browserName", "chrome")
chrome_options.set_capability("browserVersion", "latest")
# chrome_options.set_capability("platformName", "Linux")  # 可选,指定平台
# 2. 连接到 Selenium Grid Hub
driver = webdriver.Remote(
    command_executor='http://192.168.1.100:4444/wd/hub',  # 替换为你的 Hub IP
    options=chrome_options
)
# 3. 执行测试
driver.get("https://www.example.com")
print(driver.title)
# ... 测试逻辑 ...
# 4. 关闭
driver.quit()

Java 示例:

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.net.URL;
public class RemoteTest {
    public static void main(String[] args) throws Exception {
        ChromeOptions options = new ChromeOptions();
        options.setCapability("browserName", "chrome");
        options.setCapability("platformName", "Linux");
        WebDriver driver = new RemoteWebDriver(
            new URL("http://192.168.1.100:4444/wd/hub"),
            options
        );
        driver.get("https://www.example.com");
        System.out.println(driver.getTitle());
        driver.quit();
    }
}

常见问题与技巧

  1. Node 无法注册到 Hub?

    • 检查网络连接:Node 能否 ping 通 Hub?
    • 检查端口:Hub 默认 4444,Node 注册时是否指向了正确的端口?
    • 检查 Java 版本。
    • 查看 Hub 和 Node 的控制台输出,通常会有详细的错误日志。
  2. 测试无法分配到 Node?

    • 确保 Node 的 stereotype 能力(如 browserName, browserVersion)与客户端请求的能力匹配。
    • 检查 Node 的最大会话数是否已满。
    • 检查 Node 上对应的浏览器驱动是否安装正确、版本匹配。
  3. 并发执行优化

    • Node 资源:根据 Node 机器的 CPU、内存和网络情况,合理设置 max-sessions 和每个浏览器的 max-sessions,不要过度配置,以免机器过载。
    • 测试脚本:使用多线程(如 Python 的 threading 或 Java 的 ExecutorService)并发启动多个 RemoteWebDriver 连接来实现分布式并发执行。
  4. 使用 Docker 容器化(推荐方式):

    • 使用 selenium/standalone-chromeselenium/hub 等 Docker 镜像,可以快速搭建 Grid 环境,无需手动安装浏览器和驱动。
    • 示例(使用 Docker Compose):
      version: '3'
      services:
        selenium-hub:
          image: selenium/hub:4.0.0-rc-1-prerelease-20210915
          container_name: selenium-hub
          ports:
            - "4444:4444"
        chrome:
          image: selenium/node-chrome:4.0.0-rc-1-prerelease-20210915
          volumes:
            - /dev/shm:/dev/shm
          depends_on:
            - selenium-hub
          environment:
            - SE_EVENT_BUS_HOST=selenium-hub
            - SE_EVENT_BUS_PUBLISH_PORT=4442
            - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    • 运行:docker-compose up -d --scale chrome=5(启动 5 个 Chrome Node)。
  5. 安全性

    默认情况下,Grid 没有任何安全认证,在生产环境中,建议将其放在防火墙后,或使用反向代理(如 Nginx)添加基本认证或 HTTPS。

  • 小型/开发环境:使用 hub + 多个 node 模式。
  • 生产/复杂环境:使用完全分布式模式(Router, Distributor, Session Map, Node),或采用 Docker Compose 容器化部署,这是最现代、最简洁的方式。
  • 客户端:始终使用 RemoteWebDriver 并指定 Hub 的 IP 和端口。

记得:实际测试执行是在 Node 机器上,耗用的是 Node 的 CPU、内存和带宽。 合理规划 Node 数量和资源配置是关键。

抱歉,评论功能暂时关闭!