Cypress 版本 13.6.4 出现错误 | cy.task() 只能从规范文件或支持文件中调用

问题描述 投票:0回答:1

我正在使用以下版本进行赛普拉斯自动化

Cypress package version: 13.6.4
Cypress binary version: 13.6.4
Electron version: 25.8.4
Bundled Node version:
18.15.0

我正在从 Xlsx 文件读取数据并转换为 json,然后在 --headed 模式下运行时遇到问题。

案例 1:当使用命令“npx cypress run --headed”运行我的代码时,然后在浏览器中出现错误

cy.task() must only be invoked from the spec file or support file.

案例 2:当使用命令“npx cypress run”运行我的代码时,没有收到此错误 Data Read from Xlsx file

分享我在cypress中使用的代码

  1. 在 cypress 中添加了一个名为“read-xlsx.js”的文件夹并添加了代码
const XLSX = require('xlsx')
const fs = require('fs')

const readData = (testCaseIdData) => {
    try{
        const testDataFilePath = "cypress\\fixtures\\TestData.xlsx"
        // const workbook = XLSX.readFile(testDataFilePath);
        const buf = fs.readFileSync(testDataFilePath);
        const workbook = XLSX.read(buf, {type: 'buffer'})
        const sheetName = workbook.SheetNames[0]; // Assuming data is in the first sheet
        const worksheet = workbook.Sheets[sheetName];
        const jsonData = XLSX.utils.sheet_to_json(worksheet);
        // Filter JSON data based on test case ID column
        const filteredData = jsonData.filter((row) => row['TestCaseId'] === testCaseIdData);
        console.log(filteredData[0])
        return filteredData[0]
    }catch(e){
        console.log(e)
    }
}

module.exports = {
    // `on` is used to hook into various events Cypress emits
    readData,
}
  1. 在插件文件夹中添加了另一个文件,名称为“index.js”并添加了代码
const readXlsxData = require('./read-xlsx')

module.exports = (on, config) =>{
    on('task',{
        'readXlsxData': readXlsxData.readData
    })
}
  1. 更新 cypress.config.js
const { defineConfig } = require("cypress");

module.exports = defineConfig({
  chromeWebSecurity:false,
  e2e: {
    setupNodeEvents(on, config) {
      // implement node event listeners here
      return require('./cypress/plugins/index.js')(on, config)
    },
    specPattern:'cypress/e2e/practice_code.js'
  },
});

  1. 最后在我的测试spec.js文件中
describe('Reading XLSX file and converting to JSON', () => {
  it('should convert XLSX data to JSON based on test case ID column', () => {
    const testCaseIdData = 'TC_002'; // Update this with the test case ID you want to filter
    var data = cy.task('readXlsxData', testCaseIdData)
    cy.log(data)
    console.log(data)
  });
});

请帮忙解决!!

我希望测试运行时应该打印我的结果。

cypress ui-automation xlsx
1个回答
0
投票

根据Cypress文档-最佳实践,使用命令的返回值是一种反模式,包括

cy.task()

反模式:尝试使用 const、let 或 var 分配命令的返回值。

最佳实践:使用别名和闭包来访问和存储命令产生的内容。

所以你的测试代码应该是这样的:

cy.task('readXlsxData', testCaseIdData)
  .then(data => {
    cy.log(data)
    console.log(data)
  })
© www.soinside.com 2019 - 2024. All rights reserved.