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、存储没有清空,导致第二个场景的登录操作可能处于异常状态
按照上面的修改,每个场景都会:
- 清空浏览器所有存储和会话(或者启动全新实例)
- 执行场景步骤
- 关闭当前浏览器窗口
- 所有场景结束后彻底退出WebDriver
这样就能保证每个场景完全独立,解决第二个场景超时的问题。
内容的提问来源于stack exchange,提问作者mmar
相关产品推荐
相关产品推荐

