Skip to content

Grid 与 BiDi

基于 Selenium 4.x(selenium-webdriver)编写

速查

  • Selenium Grid:分布式测试,跨机器跨浏览器并行,企业大规模场景
  • Grid 4 架构:Router / Distributor / Session Queue / Session Map / Node 组件化
  • 连接 Grid:new Builder().usingServer("http://host:4444/wd/hub").forBrowser("chrome").build()
  • WebDriver BiDi:基于 WebSocket 的双向协议,支持事件订阅(区别于单向 WebDriver)
  • BiDi 能力:console 日志、JS 异常、网络拦截、认证;Firefox 支持最完整
  • Selenium 目标从 CDP 迁向标准 BiDi(CDP 支持是临时方案)

Selenium Grid(分布式)

Grid 让测试跨多台机器、多浏览器并行执行,是企业级大规模测试基础设施。Grid 4 把经典的 Hub-Node 拆成组件:

请求 → Router(入口)
        ├── Distributor(分配会话,维护 Node 注册表)
        ├── Session Queue(排队等待的会话)
        └── Session Map(会话 → Node 映射)

        Node ×N(实际跑浏览器的机器)

连接 Grid(JS)

js
const { Builder } = require("selenium-webdriver");
const chrome = require("selenium-webdriver/chrome");

const options = new chrome.Options().addArguments("--headless=new");

const driver = await new Builder()
  .usingServer("http://grid-host:4444/wd/hub") // Grid 地址
  .forBrowser("chrome")
  .setChromeOptions(options)
  .build();

WebDriver BiDi(双向协议)

经典 WebDriver 是单向请求-响应(HTTP),无法主动推送事件;WebDriver BiDi 基于 WebSocket 双向通信,支持实时事件订阅。它是跨浏览器标准,Selenium 官方目标是从 CDP 迁移到 BiDi(CDP 支持标记为临时方案)。

js
// console 日志监听(Firefox 的 BiDi 支持最完整)
const { LogInspector } = require("selenium-webdriver/bidi/logInspector");

const inspector = await LogInspector(driver);
await inspector.onConsoleEntry((log) => {
  console.log(`[${log.method}] ${log.text}`);
});
await inspector.onJavascriptException((log) => {
  console.error(`[JS 异常] ${log.text}`);
});

BiDi 模块涵盖:浏览上下文、日志(console / 异常)、网络(拦截 / 认证)、脚本注入、输入模拟——这是 Selenium 现代化、向 Playwright 这类能力靠拢的方向。