How to read data from CSV file in Playwright

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

Leave a Comment