You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python或R中基于Docker Selenium集群并行执行测试?

并行执行Selenium任务:Python & RSelenium方案

嘿,我来帮你搞定这个并行执行的问题!既然你已经用Docker搭好了1个Hub+2个Node的Selenium集群,核心就是要让两个任务独立连接到Hub并被分配到不同Node,关键是用多线程/多进程来同时发起请求,而不是串行创建Driver。下面分别给你Python和RSelenium的可行方案:


Python 实现方案

用concurrent.futures的线程池就能轻松实现并行,每个线程独立创建Remote WebDriver,Hub会自动把任务分配给空闲的Node。

示例代码

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from concurrent.futures import ThreadPoolExecutor

def run_selenium_task(task_id):
    # 连接到Selenium Hub(确保地址和端口和你的Docker配置一致)
    driver = webdriver.Remote(
        command_executor='http://localhost:4444/wd/hub',
        desired_capabilities=DesiredCapabilities.CHROME  # 替换成你用的浏览器,比如FIREFOX
    )
    try:
        print(f"任务{task_id}: 开始执行")
        driver.get("https://www.example.com")
        print(f"任务{task_id}: 页面标题 - {driver.title}")
        # 这里可以添加你的其他Selenium命令,比如截图、元素操作等
    finally:
        driver.quit()  # 必须关闭Driver,释放Node资源
        print(f"任务{task_id}: 执行完毕,已关闭Driver")

if __name__ == "__main__":
    # 启动2个并行任务(和你的Node数量匹配)
    with ThreadPoolExecutor(max_workers=2) as executor:
        executor.map(run_selenium_task, [1, 2])

关键说明

  • 每个线程都有独立的Driver实例,避免资源冲突
  • Hub会自动将任务分配给空闲的Node,无需手动指定Node地址
  • 如果你的Node是不同浏览器(比如一个Chrome一个Firefox),可以给不同任务指定不同的desired_capabilities

RSelenium 实现方案

R里推荐用future+furrr包实现多会话并行,每个任务独立初始化RemoteDriver,避免串行执行的问题。

前置准备

先安装依赖包:

install.packages(c("RSelenium", "future", "furrr"))

示例代码

library(RSelenium)
library(future)
library(furrr)

# 设置并行策略为多会话,开启2个工作进程(匹配Node数量)
plan(multisession, workers = 2)

# 定义单个任务的执行函数
run_selenium_task <- function(task_id) {
  # 每个任务独立创建RemoteDriver连接到Hub
  remDr <- remoteDriver(
    remoteServerAddr = "localhost",
    port = 4444,
    browserName = "chrome"  # 替换成你的浏览器类型
  )
  
  tryCatch({
    remDr$open()
    message(paste("任务", task_id, ": 开始执行"))
    remDr$navigate("https://www.example.com")
    page_title <- remDr$getTitle()[[1]]
    message(paste("任务", task_id, ": 页面标题 -", page_title))
    # 添加你的其他Selenium操作,比如元素定位、点击等
  }, error = function(e) {
    message(paste("任务", task_id, ": 执行出错 -", e$message))
  }, finally = {
    remDr$close()
    remDr$quit()  # 释放Node资源
    message(paste("任务", task_id, ": 执行完毕,已关闭Driver"))
  })
}

# 并行执行两个任务
future_map(c(1, 2), run_selenium_task)

关键说明

  • 必须在任务函数内部初始化RemoteDriver,因为R的多进程环境下变量是隔离的
  • plan(multisession)会创建独立的R会话,避免单线程阻塞
  • 任务数量不要超过Node数量,否则多余任务会排队等待

常见问题排查

  • 先确认Hub状态:访问http://localhost:4444/ui,检查两个Node是否显示为ready状态
  • 确保Docker容器的端口映射正确:Hub的4444端口要映射到本地,Node要正确注册到Hub
  • 任务结束后必须调用quit(),否则Node会一直占用会话,导致后续任务无法分配

内容的提问来源于stack exchange,提问作者Mislav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:42:49