Cypress 10 task事件未注册及env变量读取异常问题
问题分析与修复方案
核心问题1:task事件未注册报错
你的代码中,setupNodeEvents里的if/else if分支直接return了新的配置对象,导致后续的on('task')和on('before:browser:launch')代码完全没有执行,自然会触发task未注册的报错。
核心问题2:env变量读取异常
config.env是一个对象,你直接用config.env == undefined或config.env == 'development'的判断逻辑完全错误,这会导致分支判断失效,进而出现env读取异常。- 此外,你在两个分支里返回的env属性名不统一(第一个用
env: "test",第二个用environment: "development"),也会导致后续环境判断混乱。
修复后的完整代码
/// <reference types="cypress" /> const { defineConfig } = require('cypress'); module.exports = defineConfig({ e2e: { // setupNodeEvents的正确参数顺序是(on, config) setupNodeEvents(on, config) { // 统一环境变量判断逻辑,先获取当前环境标识 const currentEnv = config.env.environment || config.env.env || 'test'; // 根据环境修改config对象,而非直接return新对象 if (currentEnv === 'test' || !currentEnv) { config.baseUrl = "intentionally blank"; config.env = { environment: "test", // 统一属性名为environment schedulerBaseUrl: "intentionally blank", signInUrl: "intentionally blank", enableAccessibility: true, takeScreenShot: false, suites: "", }; } else if (currentEnv === 'development') { config.baseUrl = "https://blank.blank.com:blank"; config.env = { environment: "development", schedulerBaseUrl: "intentionally blank", signInUrl: "intentionally blank", enableAccessibility: false, takeScreenShot: false }; } // 现在事件注册代码会正常执行 on('task', { log(message) { console.log(message) return null }, table(message) { console.table(message) return null } }) on('before:browser:launch', (browser, launchOptions) => { if (browser.name === 'chrome' && browser.isHeadless) { launchOptions.args.push('--disable-gpu'); launchOptions.args.push('--disable-dev-shm-usage'); launchOptions.args.push('use-fake-device-for-media-stream'); return launchOptions; } }); // 最后统一return修改后的config return config; }, chromeWebSecurity: false, screenshotOnRunFailure: false, trashAssetsBeforeRuns: true, numTestsKeptInMemory: 0, video: true, videoCompression: false, enableAccessibility: false, takeScreenShot: false, defaultCommandTimeout: 10000, execTimeout: 500000, pageLoadTimeout: 500000, retries: { runMode: 1, openMode: 0 }, blockHosts: [ "*intentionally blank" ], redirectionLimit: 199, projectId: "intentionally blank", } }) require('@applitools/eyes-cypress')(module);
关键修改点说明
- 避免提前return:不再在分支中直接return配置,而是修改传入的
config对象,最后统一return,确保事件注册代码能执行。 - 修正env判断逻辑:
config.env是对象,需读取其内部属性(如environment)进行判断,同时统一属性名避免混乱。 - 保持正确参数顺序:
setupNodeEvents的参数顺序固定为(on, config),修复逻辑后无需调整顺序即可正常读取env。
内容的提问来源于stack exchange,提问作者K.A.
相关产品推荐
相关产品推荐

