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

如何基于已有Selenium浏览器会话启动Protractor执行?

如何在Protractor中复用已有的Selenium会话

刚好之前折腾过这个需求,Protractor虽然默认每次启动都会新建Selenium会话,但其实可以通过它底层的WebDriverJS API来复用已经存在的活跃会话,不用从头再来。下面把具体的操作步骤和注意事项给你理清楚:

核心原理

Protractor本质是基于WebDriverJS封装的,所以我们可以绕过它默认的会话创建流程,手动连接到一个已经存在的活跃Selenium会话——只需要拿到这个会话的sessionId,以及你的Selenium服务器地址就行。

具体配置步骤

1. 准备必要信息

首先你得确保:

  • 有一个活跃的Selenium会话(没被关闭、没超时)
  • 已经拿到这个会话的sessionId(你已经通过环境变量或其他方式导出了这个值)
  • 知道Selenium服务器的地址(默认一般是http://localhost:4444/wd/hub,如果是自定义端口或远程服务器要对应修改)

2. 修改Protractor配置文件

打开你的protractor.conf.js,按照下面的示例修改:

const { webdriver } = require('protractor');

exports.config = {
  // 指定你的Selenium服务器地址
  seleniumAddress: 'http://localhost:4444/wd/hub',
  // 你的测试用例文件路径
  specs: ['./test-specs/*.js'],

  onPrepare: async function() {
    // 从环境变量或其他存储位置获取已有的session ID
    const existingSessionId = process.env.EXISTING_SESSION_ID;
    
    if (!existingSessionId) {
      throw new Error('请先确保EXISTING_SESSION_ID环境变量已设置好哦');
    }

    // 手动构建连接到已有会话的WebDriver实例
    const commandExecutor = new webdriver.HttpCommandExecutor(
      `${exports.config.seleniumAddress}/session/${existingSessionId}`
    );
    const session = new webdriver.Session(existingSessionId, { 
      browserName: 'chrome' // 划重点!这里必须和已有会话的浏览器类型完全一致!
    });
    const driver = new webdriver.WebDriver(commandExecutor, session);

    // 替换Protractor默认的driver,这样后续所有测试都会复用这个会话
    browser.driver = driver;

    // 验证一下会话是否能正常连接
    try {
      await browser.driver.getSession();
      console.log(`✅ 成功复用会话:${existingSessionId}`);
    } catch (err) {
      throw new Error(`❌ 连接已有会话失败:${err.message}`);
    }
  },

  onComplete: async function() {
    // 重要!如果不想让Protractor测试结束后关闭你的原有会话,就把默认的quit逻辑注释掉
    // await browser.quit();
    console.log('测试结束,原有会话已保留');
  }
};

3. 运行测试

先把EXISTING_SESSION_ID环境变量设好,然后正常启动Protractor就行:

EXISTING_SESSION_ID=你的会话ID protractor protractor.conf.js

踩过的坑&注意事项

  • 别开directConnect:directConnect是让Protractor直接连浏览器驱动,不走Selenium服务器,这种模式下根本没法复用会话,必须用seleniumAddress
  • 浏览器类型必须匹配:我之前就因为把browserName写成了chrome,但原有会话是Firefox,直接连接失败,一定要对应上!
  • 确保会话是活跃的:如果原有会话已经超时或者被手动关闭了,连接肯定会失败,复用前最好先确认会话状态
  • 会话清理要谨慎:如果测试结束后不需要保留原有会话,可以恢复browser.quit(),但这会直接关闭你之前的会话,操作前想清楚哦

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:52:15