如何将 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)
);
});
});
我无法处理它() - 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)
);
});
});