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

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);

关键修改点说明

  1. 避免提前return:不再在分支中直接return配置,而是修改传入的config对象,最后统一return,确保事件注册代码能执行。
  2. 修正env判断逻辑:config.env是对象,需读取其内部属性(如environment)进行判断,同时统一属性名避免混乱。
  3. 保持正确参数顺序:setupNodeEvents的参数顺序固定为(on, config),修复逻辑后无需调整顺序即可正常读取env。

内容的提问来源于stack exchange,提问作者K.A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:25:52