【问题标题】:Read excel files in Cypress在 Cypress 中读取 excel 文件
【发布时间】:2020-05-21 12:22:55
【问题描述】:

我是赛普拉斯的新手。如何使用 Cypress 从 excel 文件中读取数据?在 google 中搜索,但找不到有用的答案。

【问题讨论】:

    标签: cypress


    【解决方案1】:

    在 cypress 中,您可以创建 cypress task 以使用 SheetJS 库读取 xlsx 文件。

    用法

    cypress\integration\read-xlsx.spec.js

    context('Xlsx file', () => {
      it('Read excel file', () => {
        cy.task('readXlsx', { file: 'my-excel.xlsx', sheet: "Sheet1" }).then((rows) => {
          expect(rows.length).to.equal(543)
          // expect(rows[0]["column name"]).to.equal(11060)
        })
      })
    })
    

    需要安装xlsx

     $ npm install xlsx
    

    创建读取excel函数

    cypress\plugins\read-xlsx.js

    const fs = require('fs');
    const XLSX = require('xlsx');
    
    const read = ({file, sheet}) => {
       const buf = fs.readFileSync(file);
       const workbook = XLSX.read(buf, { type: 'buffer' });
       const rows = XLSX.utils.sheet_to_json(workbook.Sheets[sheet]);
       return rows
    }
    
    module.exports = {
       read,
    }
    

    将函数用作 Cypress 任务(插件)

    cypress\plugins\index.js

    const readXlsx = require('./read-xlsx')
    
    module.exports = (on, config) => {
      on('task', {
        'readXlsx': readXlsx.read
      })
    }
    

    【讨论】:

      【解决方案2】:

      这里是如何使用 excel 作为 cypress 测试源代码的说明https://medium.com/@you54f/dynamically-generate-data-in-cypress-from-csv-xlsx-7805961eff55

      首先,您需要使用 Xlsx 将您的 xlsx 文件转换为 json

      import { writeFileSync } from "fs";
      import * as XLSX from "xlsx";
      try {
        const workBook = XLSX.readFile("./testData/testData.xlsx");
        const jsonData = XLSX.utils.sheet_to_json(workBook.Sheets.testData);
        writeFileSync(
          "./cypress/fixtures/testData.json",
          JSON.stringify(jsonData, null, 4),
          "utf-8"
        );
      } catch (e) {
        throw Error(e);
      }
      

      然后导入 json 文件并遍历每一行并以您想要的方式使用数据。在此示例中,它尝试登录到系统。

      import { login } from "../support/pageObjects/login.page";
      const testData = require("../fixtures/testData.json");
      describe("Dynamically Generated Tests", () => {
        testData.forEach((testDataRow: any) => {
          const data = {
            username: testDataRow.username,
            password: testDataRow.password
          };
          context(`Generating a test for ${data.username}`, () => {
            it("should fail to login for the specified details", () => {
              login.visit();
              login.username.type(data.username);
              login.password.type(`${data.password}{enter}`);
              login.errorMsg.contains("Your username is invalid!");
              login.logOutButton.should("not.exist");
            });
          });
        });
      });
      

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
      • @ArdentCoder 添加了回答的基本部分
      • 我试过了,但我遇到了这个问题:_fs.readFileSync 不是一个函数。我该如何解决?
      • 我必须在哪里放置一个 try-catch 块?
      【解决方案3】:

      对我来说,第一个答案非常有效。但我必须做一个小修复。

      将函数用作 Cypress 任务(插件)

      cypress/plugins/index.js

      const readXlsx = require('./read-xlsx')
      
      module.exports = (on, config) => {
        on('task', {
          'readXlsx': readXlsx.read
        })
      }
      

      当我使用此代码时,我在 cypress 中收到以下错误。

      CypressError cy.task('log') 失败并出现以下错误: 插件文件中未处理任务“日志”。注册了以下任务:readXlsx

      并且下面的修复工作

      const readXlsx = require('./read-xlsx')
      
      module.exports = (on, config) => {
        on('task', {
          'readXlsx': readXlsx.read,
          log (message) {
            console.log(message)
            return null
          }
        })
      }
      

      【讨论】:

        猜你喜欢
        • 2017-05-22
        • 2018-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-18
        相关资源
        最近更新 更多