Start a conversation Book intro call

Playwright Screenshots on Jest Test Failure

How do you do that

How does one take a screenshot in Playwright if a Jest test fails? This was sort of the question brought up by a team lead at work. I wondered why that would be needed, but I quickly answered my own question. Playwright follows async/await fairly closely, and if an await fails, then Jest won’t exaclty help with identifying where the error is. From what I’ve seen, all Jest will mostly print a timeout error. So a screenshot could probably help to know where a thrown error came from.

So I searched for an answer, and I eventually found one! Here is the huge code bit in my jest.setup.js file.

global.it = async (name, func) => {
	return await test(name, async () => {
		try {
			await func();
		} catch (e) {
			const date = new Date();
			const year = date.getFullYear();
			const month = date.getUTCMonth() + 1;
			const dateOfMonth = date.getUTCDate();
			const hour = date.getUTCHours();
			const minute = date.getUTCMinutes();
			const sec = date.getUTCSeconds();
			const dateString = `${year}-${month}-${dateOfMonth}-${hour}-${minute}-${sec}`;

			const errorScreenshotPath = `screenshots/${browserName}-${dateString}-${name.replace(
				/ /g,
				'_'
			)}.png`;

			const captureScreenshots = process.env.CAPTURE_SCREENSHOTS === 'true';

			if (captureScreenshots) {
				await mkdirp('screenshots');

				await page.screenshot({
					path: errorScreenshotPath
				});
			}

			throw e;
		}
	});
};

The answer was to override the Jest it function with something that took screenshots on fail. Surround the testing function with a try/catch block in case any one of those await statements throws and error. If an error is thrown, catch that error and make a screenshot. With the error handling, I added in a timestamp, test name, and browser name for the screenshot file name. I also used mkdirp to see if the directory exists or not.

And so this is the way that I liked. I could take a screenshot of the Playwright automation test on fail. A lot of the other potential solutions looked like they could work, but exploring the other solutions didn’t prove anything. This previous solution that I have shown was simple! And because of its simplicity, I think I will stick to this if I ever need a way to capture a screenshot on a test failure.