1. Install CSV Parser
Run:
npm install csv-parser
2. Create CSV File
Create a file named testdata.csv
username,password
admin,admin123
testuser,test123
demo,demo123
3. Create Utility to Read CSV
Create readCSV.js
const fs = require('fs');
const csv = require('csv-parser');
function readCSV(filePath) {
return new Promise((resolve, reject) => {
const results = [];
fs.createReadStream(filePath)
.pipe(csv())
.on('data', (data) => results.push(data))
.on('end', () => resolve(results))
.on('error', (error) => reject(error));
});
}
module.exports = readCSV;
4. Use CSV Data in Playwright Test
Create example.spec.js
const { test, expect } = require('@playwright/test');
const readCSV = require('./readCSV');
let testData = [];
test.beforeAll(async () => {
testData = await readCSV('./testdata.csv');
});
test.describe('Login Tests Using CSV Data', () => {
for (const data of testData) {
test(`Login test for ${data.username}`, async ({ page }) => {
await page.goto('https://example.com/login');
await page.fill('#username', data.username);
await page.fill('#password', data.password);
await page.click('button[type="submit"]');
// Example validation
await expect(page).toHaveURL(/dashboard/);
});
}
});
Better Approach (Recommended)
Because Playwright loads tests before beforeAll, the loop may not work correctly.
Use this cleaner approach:
const { test, expect } = require('@playwright/test');
const readCSV = require('./readCSV');
test.describe('CSV Driven Tests', () => {
let testData;
test.beforeAll(async () => {
testData = await readCSV('./testdata.csv');
});
test('Run all CSV rows', async ({ page }) => {
for (const data of testData) {
console.log(`Testing with ${data.username}`);
await page.goto('https://example.com/login');
await page.fill('#username', data.username);
await page.fill('#password', data.password);
await page.click('button[type="submit"]');
await expect(page).toHaveURL(/dashboard/);
}
});
});
Best Practice for Large Frameworks
For scalable automation frameworks:
- Keep test data in
data/folder - Use Page Object Model (POM)
- Create reusable CSV utility
- Separate:
- Test Data
- Test Logic
- Page Actions
Example structure:
project/
│
├── tests/
├── pages/
├── utils/
│ └── readCSV.js
├── data/
│ └── testdata.csv
└── playwright.config.js
Alternative (Recommended for Playwright)
Playwright works better with JSON than CSV for parameterized tests.
You can convert CSV → JSON and use:
testData.forEach((data) => {
test(`Login ${data.username}`, async ({ page }) => {
// test steps
});
});
This gives:
- Better reporting
- Separate test cases
- Parallel execution support
- Easier debugging