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

NodeJS+Gauge框架下如何跨文件共享Selenium Driver实例

Gauge+NodeJS+Selenium跨文件共享Driver实例解决方案

核心思路

利用Gauge自带的spec级数据存储管理Driver实例,确保每个spec只初始化一次浏览器,所有步骤文件都能安全访问同一个Driver,彻底解决重复初始化多窗口、变量未定义的问题。

具体实现步骤

1. 编写Driver管理工具类

新建driverManager.js,统一处理Driver的初始化、获取和销毁逻辑:

const { Builder } = require('selenium-webdriver');
const { gauge } = require('@getgauge/gauge');

// 初始化Driver,仅当前spec未初始化时执行
async function initDriver() {
  const existingDriver = gauge.dataStore.specStore.get('driver');
  if (!existingDriver) {
    const driver = await new Builder().forBrowser('chrome').build();
    gauge.dataStore.specStore.put('driver', driver);
  }
}

// 获取当前spec的Driver实例
function getDriver() {
  return gauge.dataStore.specStore.get('driver');
}

// 销毁Driver,在spec结束后执行
async function teardownDriver() {
  const driver = getDriver();
  if (driver) {
    await driver.quit();
    gauge.dataStore.specStore.remove('driver');
  }
}

module.exports = { initDriver, getDriver, teardownDriver };

2. 绑定Spec级生命周期钩子

在你的主测试步骤文件(比如test_steps.js)中,添加Gauge的spec前后钩子,确保每个spec只初始化一次Driver:

const { gauge } = require('@getgauge/gauge');
const { initDriver, teardownDriver } = require('./driverManager');

// 每个Spec执行前初始化Driver
gauge.specSuite().beforeSpec(async () => {
  await initDriver();
});

// 每个Spec执行完销毁Driver
gauge.specSuite().afterSpec(async () => {
  await teardownDriver();
});

3. 在公共步骤中使用共享Driver

修改common_steps.js,通过getDriver()获取实例,替换之前直接使用driver的代码:

const { getDriver } = require('./driverManager');
const { By } = require('selenium-webdriver');

step('Visit the application under test.', async () => {
  const driver = getDriver();
  await driver.get('你的应用访问地址');
});

step('Close the popup.', async () => {
  const driver = getDriver();
  const closeBtn = await driver.findElement(By.css('.popup-close-btn'));
  await closeBtn.click();
});

关键注意事项

  • 绝对不要在公共步骤文件里单独初始化Driver,所有初始化逻辑必须通过driverManager和beforeSpec钩子执行,否则会触发多窗口问题
  • 用specStore而非scenarioStore,确保同一个spec下的所有场景共享同一个Driver实例(如果需要每个场景单独开浏览器,再切换为scenarioStore)
  • 检查getDriver()的返回值,避免存错数据到存储中,否则会出现driver.findElement is not a function这类类型错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:47:37