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

Protractor+CucumberJS:Feature场景无法重启浏览器问题求助

嘿,我看你在Protractor+Cucumber框架里遇到了多场景浏览器隔离的问题——第一个场景跑成功了,第二个直接超时失败。我之前也踩过类似的坑,给你梳理一下问题根源和解决办法:

核心问题定位

你现在的困境是每个Cucumber场景无法独立启动/关闭浏览器实例,导致第二个场景复用了第一个场景的浏览器上下文,残留的会话、Cookie或者WebDriver状态异常,最终引发超时。你试过的restartBrowserBetweenTests和After钩子没生效,主要是因为配置没适配Cucumber框架的特性。

具体修复步骤

1. 修复hooks.js:强制每个场景前后重置浏览器状态

把你注释掉的After钩子恢复,同时在Before钩子里添加会话清空逻辑,确保每个场景都是干净的环境:

import { Before, BeforeAll, After, AfterAll } from "cucumber";
import { browser } from "protractor";
import { config } from "../protractorConf"

Before( {timeout: 40000}, async () => {
  // 彻底清空浏览器存储和会话
  await browser.manage().deleteAllCookies();
  await browser.executeScript('window.sessionStorage.clear();');
  await browser.executeScript('window.localStorage.clear();');
  // 不用提前get页面,步骤里已经会打开
})

After( {timeout: 10000}, async () => {
  // 每个场景结束后关闭当前浏览器窗口
  await browser.close();
})

AfterAll( {timeout: 10000}, async () => {
  // 所有场景跑完后退出WebDriver会话
  await browser.quit();
})

2. 调整conf.js:适配Cucumber的场景隔离需求

restartBrowserBetweenTests是给Jasmine框架设计的,在Cucumber里得配合钩子用,同时调整超时和初始化逻辑:

import { browser } from "protractor";
export const config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  SELENIUM_PROMISE_MANAGER: false,
  framework: 'custom',
  frameworkPath: require.resolve('protractor-cucumber-framework'),
  capabilities: {
    'browserName': 'chrome',
    'chromeOptions': {
      'args': ['--disable-extensions=true', '--start-maximized'] // 把窗口最大化移到这里,避免重复执行
    }
  },
  restartBrowserBetweenTests: true, // 开启这个参数配合钩子增强隔离
  specs: [
    './features/*.feature'
  ],
  cucumberOpts: {
    require: [
      './features/step_definitions/*.js',
      './support/*.js'
    ],
    format: ['json:results/report.json'],
    tags: [],
    strict: true
  },
  disableChecks: true,
  onPrepare: function () {
    browser.ignoreSynchronization = true;
    // 把deleteAllCookies和maximize移到Before钩子,因为onPrepare只执行一次
  },
  getPageTimeout: 120000, // 延长页面加载超时到2分钟
  allScriptsTimeout: 600000 // 延长脚本执行超时到10分钟
}

3. 优化步骤文件的超时设置

你当前的步骤超时是10秒(2 * 5000),第二个场景因为要重新启动浏览器、加载页面,时间可能不够,建议延长:

const stepTimeoutExpiry = {timeout: 30000} // 直接设为30秒,更直观

为什么之前的配置没生效?

  • restartBrowserBetweenTests:这个参数是Protractor专门为Jasmine框架做的自动隔离,在Cucumber自定义框架下不会自动触发每个场景的浏览器重启,必须配合Before/After钩子手动实现
  • 你注释了After钩子的browser.close():第一个场景结束后浏览器没关闭,第二个场景复用旧实例时,可能因为页面状态残留、会话过期等问题导致操作超时
  • onPrepare里的deleteAllCookies只执行一次:场景之间的Cookie、存储没有清空,导致第二个场景的登录操作可能处于异常状态

按照上面的修改,每个场景都会:

  1. 清空浏览器所有存储和会话(或者启动全新实例)
  2. 执行场景步骤
  3. 关闭当前浏览器窗口
  4. 所有场景结束后彻底退出WebDriver

这样就能保证每个场景完全独立,解决第二个场景超时的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:57:42