Selenium Grid

[!note] 一个用于分布式测试的工具,它允许你在多个机器上并行运行测试。通过 Selenium Grid,你可以同时在多个浏览器和操作系统上执行测试,从而加快测试速度并提高测试覆盖率。

主要特点: #

  1. 并行执行:可以在多个节点上同时运行测试,显著减少测试时间。
  2. 跨浏览器测试:支持在不同的浏览器(如 Chrome、Firefox、Edge 等)上运行测试。
  3. 跨平台测试:支持在不同的操作系统(如 Windows、macOS、Linux 等)上运行测试。
  4. 集中管理:通过一个中心节点(Hub)来管理多个测试节点(Node),方便配置和监控。

基本架构: #

  • Hub:中心节点,负责接收测试请求并将其分发到合适的节点。
  • Node:测试节点,负责执行实际的测试任务。每个节点可以配置不同的浏览器和操作系统。

示例: #

假设你有一个测试套件需要在 Chrome、Firefox 和 Edge 上运行,你可以配置一个 Selenium Grid,其中包含三个节点,每个节点分别运行不同的浏览器。然后,你可以通过 Hub 将测试分发到这些节点上并行执行。

podman-compose部署 #

version: '3'
services:
  selenium-hub:
    image: selenium/hub:latest
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"
    environment:
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    security_opt:
      - no-new-privileges:true

  selenium-node-chrome:
    image: selenium/node-chrome:latest
    shm_size: 1g
    dns:
      - 8.8.8.8
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
    depends_on:
      - selenium-hub
    security_opt:
      - no-new-privileges:true

Python代码 #

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from settings import RemoteBrowserAPIHost # hub 部署host

class Browser:
	def __init__(self, headless=True, account_info=None):
		self.headless = headless
		self.input_element = None
		self.account_info = account_info
		logger.debug(f"其它模式使用远程浏览器")
		op = webdriver.ChromeOptions()
		self.browser = webdriver.Remote(command_executor=RemoteBrowserAPIHost + "/wd/hub", options=op)
		self.session_id = self.browser.session_id
		RDS.update_browser_heartbeat(self.session_id)
		logger.info(f"浏览器 连接成功!")