如何将 excel 文件中的值存储到数组中进行测试

How to store values from excel file into array for testing

我无法处理它() - expect() 与 exceljs 的 readfile() 函数结合使用。使用此代码,我收到以下错误: "UnhandledPromiseRejectionWarning: Error: 'expect' was used when there was no current spec, this could be because an asynchronous test timed out"

我尝试删除第一个 it() 并用 it() 包围 expect() 但是 "hello2" 没有出现,这意味着 excelsjs 的 readFile() 甚至没有在这种情况下阅读。

这显然与 promises 以及您应该如何处理它们有关,但我无法设法找到解决方案。在此先感谢您的帮助。

import { AppPage } from './app.po';
import { browser, logging, element, by } from 'protractor'
import { Workbook, Row, Cell, Worksheet } from 'exceljs';

describe('E2E Tests', () => {

  const log4js = require('log4js');
  log4js.configure({
    appenders: { igwan: { type: 'file', filename: 'cheese.log' } },
    categories: { default: { appenders: ['igwan'], level: 'error' } }
  });

  const logger = log4js.getLogger('IGWAN');
  logger.level = 'trace';
  //console.log = (msg) => logger.trace(msg);

  let page = new AppPage();

  let wb: Workbook = new Workbook();
  let sheet: Worksheet;
  let rowObject: Row;
  let cellObject: Cell;
  let deviceName: string;
  let dataContainer: any[] = [];
  let dataContainer3: any[];
  let row: any[] = []

  browser.manage().timeouts().implicitlyWait(30000);
  page.navigateToPark();

  it('whatever man', () => {

  wb.xlsx.readFile('e2e/src/testsE2E.xlsx').then(() => {

    sheet = wb.getWorksheet("Eqpt");

    for (let k = 1; k <= sheet.rowCount; k++) {
      dataContainer.push([]);
    }

    for (let l = 1; l <= sheet.rowCount; l++) {
      rowObject = sheet.getRow(l);

      for (let m = 1; m <= sheet.columnCount; m++) {
        cellObject = rowObject.getCell(m);
        dataContainer[l - 1].push(cellObject.toString());
      }
    }
    console.log("hello2");

    return dataContainer;

  }).then((result) => {

    dataContainer3 = result;
    console.log(dataContainer3);

    for (let i = 0; i < dataContainer3.length; i++) {
      row = dataContainer3[i];

      if (row[0].toString() === "1") {
        deviceName = row[1];

        element(by.id('device_input')).clear().then(() => {
          element(by.id('device_input')).sendKeys(deviceName);
        });
        element(by.id('search_button')).click();

        for (let j = 2; j <= row.length; j++) {
          switch (j) {
            case 2: {
              //it('should fetch and display correct type data for device ' + deviceName.toString(), () => {
                expect(element(by.id('type')).getText()).toEqual(dataContainer[i][j]);
              //});
              break;
            }
            case 3: {
              //it('should fetch and display correct POP data for device ' + deviceName.toString(), () => {
                expect(element(by.id('pop')).getText()).toEqual(dataContainer[i][j]);
              //});
              break;
            }
            case 4: {
              //it('should fetch and display correct ipMngt data for device ' + deviceName.toString(), () => {
                expect(element(by.id('ipMngt')).getText()).toEqual(dataContainer[i][j]);
              //});
              break;
            }
            case 5: {
              //it('should fetch and display correct internalState data for device ' + deviceName.toString(), () => {
                expect(element(by.id('internalState')).getText()).toEqual(dataContainer[i][j]);
              //});
              break;
            }
            case 6: {
              //it('should fetch and display correct prodState data for device ' + deviceName.toString(), () => {
                expect(element(by.id('prodState')).getText()).toEqual(dataContainer[i][j]);
              //});
              break;
            }
            case 7: {
              //it('should fetch and display correct currentSwRelease data for device ' + deviceName.toString(), () => {
                expect(element(by.id('currentSwRelease')).getText()).toEqual(dataContainer[i][j]);
              //});
              break;
            }
            case 8: {
              //it('should fetch and display correct hwChassis data for device ' + deviceName.toString(), () => {
                expect(element(by.id('hwChassis')).getText()).toEqual(dataContainer[i][j]);
              //});
              break;
            }
            case 9: {
              //it('should fetch and display correct rfsNode data for device ' + deviceName.toString(), () => {
                expect(element(by.id('rfsNode')).getText()).toEqual(dataContainer[i][j]);
              //});
              break;
            }
            case 10: {
              //it('should fetch and display correct peId data for device ' + deviceName.toString(), () => {
                expect(element(by.id('peId')).getText()).toEqual(dataContainer[i][j]);
              //});
              break;
            }
          }
        }
      } else {
        console.log("Line was marked as skipped by author of .xlsx file");
      }
    }

  });

});



    //sheet = wb.getWorksheet("POP");
    // TO DO

    //sheet = wb.getWorksheet("Clients");
    // TO DO

  afterEach(async () => {
    // Assert that there are no errors emitted from the browser
    const logs = await browser.manage().logs().get(logging.Type.BROWSER);
    expect(logs).not.toContain(jasmine.objectContaining({
      level: logging.Level.SEVERE,
    } as logging.Entry));
  });

});

我建议您执行以下操作:

关闭 Protractor 的控制流并切换到 async/await 语法。控制流功能已弃用 see docs

根据我的经验,理解控制流在幕后发生的事情比切换到 async/await 语法要难得多。这将使您完全控制代码的执行方式。您可以通过将 SELENIUM_PROMISE_MANAGER: false 添加到量角器配置文件来实现。

因此您的代码片段必须如下所示:

import { AppPage } from './app.po';
import { browser, logging, element, by } from 'protractor';
import { Workbook, Row, Cell, Worksheet } from 'exceljs';
import * as log4js from 'log4js';

describe('E2E Tests', () => {
  let wb: Workbook;
  let sheet: Worksheet;
  let rowObject: Row;
  let cellObject: Cell;
  let deviceName: string;
  let dataContainer: any[];
  let row: any[];
  let logger;

  beforeAll(async () => {
    log4js.configure({
      appenders: { igwan: { type: 'file', filename: 'cheese.log' } },
      categories: { default: { appenders: ['igwan'], level: 'error' } }
    });
    logger = log4js.getLogger('IGWAN');
    logger.level = 'trace';
  });

  beforeEach(async () => {
    const page = new AppPage();

    wb = new Workbook();
    dataContainer = [];
    row = [];

    await browser.sleep(5000);
    await page.navigateToPark();
  });
  //console.log = (msg) => logger.trace(msg);

  it('whatever man', async () => {
    dataContainer = await wb.xlsx.readFile('e2e/src/testsE2E.xlsx').then(() => {
      sheet = wb.getWorksheet('Eqpt');

      for (let k = 1; k <= sheet.rowCount; k++) {
        dataContainer.push([]);
      }

      for (let l = 1; l <= sheet.rowCount; l++) {
        rowObject = sheet.getRow(l);

        for (let m = 1; m <= sheet.columnCount; m++) {
          cellObject = rowObject.getCell(m);
          dataContainer[l - 1].push(cellObject.toString());
        }
      }
      console.log('hello2');

      return dataContainer;
    });

    for (let i = 0; i < dataContainer.length; i++) {
      row = dataContainer[i];

      if (row[0].toString() === '1') {
        deviceName = row[1];

        await element(by.id('device_input')).clear();
        await element(by.id('device_input')).sendKeys(deviceName);
        await element(by.id('search_button')).click();

        for (let j = 2; j <= row.length; j++) {
          switch (j) {
            case 2: {
              //it('should fetch and display correct type data for device ' + deviceName.toString(), () => {
              expect(await element(by.id('type')).getText()).toEqual(
                dataContainer[i][j]
              );
              //});
              break;
            }
            case 3: {
              //it('should fetch and display correct POP data for device ' + deviceName.toString(), () => {
              expect(await element(by.id('pop')).getText()).toEqual(
                dataContainer[i][j]
              );
              //});
              break;
            }
            case 4: {
              //it('should fetch and display correct ipMngt data for device ' + deviceName.toString(), () => {
              expect(await element(by.id('ipMngt')).getText()).toEqual(
                dataContainer[i][j]
              );
              //});
              break;
            }
            case 5: {
              //it('should fetch and display correct internalState data for device ' + deviceName.toString(), () => {
              expect(await element(by.id('internalState')).getText()).toEqual(
                dataContainer[i][j]
              );
              //});
              break;
            }
            case 6: {
              //it('should fetch and display correct prodState data for device ' + deviceName.toString(), () => {
              expect(await element(by.id('prodState')).getText()).toEqual(
                dataContainer[i][j]
              );
              //});
              break;
            }
            case 7: {
              //it('should fetch and display correct currentSwRelease data for device ' + deviceName.toString(), () => {
              expect(
                await element(by.id('currentSwRelease')).getText()
              ).toEqual(dataContainer[i][j]);
              //});
              break;
            }
            case 8: {
              //it('should fetch and display correct hwChassis data for device ' + deviceName.toString(), () => {
              expect(await element(by.id('hwChassis')).getText()).toEqual(
                dataContainer[i][j]
              );
              //});
              break;
            }
            case 9: {
              //it('should fetch and display correct rfsNode data for device ' + deviceName.toString(), () => {
              expect(await element(by.id('rfsNode')).getText()).toEqual(
                dataContainer[i][j]
              );
              //});
              break;
            }
            case 10: {
              //it('should fetch and display correct peId data for device ' + deviceName.toString(), () => {
              expect(await element(by.id('peId')).getText()).toEqual(
                dataContainer[i][j]
              );
              //});
              break;
            }
          }
        }
      } else {
        console.log('Line was marked as skipped by author of .xlsx file');
      }
    }
  });

  //sheet = wb.getWorksheet("POP");
  // TO DO

  //sheet = wb.getWorksheet("Clients");
  // TO DO

  afterEach(async () => {
    // Assert that there are no errors emitted from the browser
    const logs = await browser
      .manage()
      .logs()
      .get(logging.Type.BROWSER);
    expect(logs).not.toContain(
      jasmine.objectContaining({
        level: logging.Level.SEVERE
      } as logging.Entry)
    );
  });
});