I want to integrate a function in a spec.ts file where it will read multiple xml data one by one from a directory and will repeat the tests as long as the directories length.
Is there any way to read multiple files or files name from a folder in Cypress or in JavaScript ?
You can use fs to read the content of a directory, and then we can use Cypress Lodash to iterate through that returned array.
import fs from 'fs';
const files = fs.readdirSync('/my/dir/');
describe('My Tests', () => {
Cypress._.times(files.length, (index) => {
it(`does some test for the file: ${files[index]}, () => {
cy.readFile(files[index]).should(...);
});
});
});
You will need to read the file list in cypress.config.js (for Cypress version 10 and above).
const { defineConfig } = require('cypress')
const fs = require("fs");
module.exports = defineConfig({
e2e: {
setupNodeEvents(on, config) {
const xmlFolder = `${__dirname}/xml-files/`;
const files = fs.readdirSync(xmlFolder)
.map(file => `${xmlFolder}/${file}`) // add folder path
config.xmlFiles = files // put in config for test
return config
}
}
})
In the test,
describe('Creating one test for each XML file', () => {
Cypress.config('xmlFiles')
.forEach(fileName => {
it(`Testing ${fileName}`, () => {
cy.readFile(fileName)
.then(xml => {
...
})
});
});
})
For Cypress version 9 and below use plugins.index.js:
module.exports = (on, config) => {
on('before:run', (spec) => {
const xmlFolder = `${__dirname}/xml-files/`;
const files = fs.readdirSync(xmlFolder)
.map(file => `${xmlFolder}/${file}`) // add folder path
config.xmlFiles = files // put in config for test
})
return config
}