Using with puppeteer
Jest Puppeteer provides all required configuration to run your tests using Puppeteer.
- First, install
jest-puppeteer
- npm
- Yarn
yarn add --dev jest-puppeteer
- Specify preset in your :
{
"preset": "jest-puppeteer"
}
- Write your test
There’s no need to load any dependencies. There’s no need to load any dependencies. Puppeteer’s page
and browser
classes will automatically be exposed
See documentation.
Custom example without jest-puppeteer preset
- launch & file the websocket endpoint of puppeteer with Global Setup
- connect to puppeteer from each Test Environment
- close puppeteer with Global Teardown
Here’s an example of the GlobalSetup script
setup.js
const {mkdir, writeFile} = require('fs').promises;
const os = require('os');
const path = require('path');
const puppeteer = require('puppeteer');
const DIR = path.join(os.tmpdir(), 'jest_puppeteer_global_setup');
module.exports = async function () {
const browser = await puppeteer.launch();
// store the browser instance so we can teardown it later
// this global is only available in the teardown but not in TestEnvironments
globalThis.__BROWSER_GLOBAL__ = browser;
// use the file system to expose the wsEndpoint for TestEnvironments
await mkdir(DIR, {recursive: true});
};
Then we need a custom Test Environment for puppeteer
puppeteer_environment.js
const {readFile} = require('fs').promises;
const os = require('os');
const path = require('path');
const NodeEnvironment = require('jest-environment-node').default;
const DIR = path.join(os.tmpdir(), 'jest_puppeteer_global_setup');
class PuppeteerEnvironment extends NodeEnvironment {
constructor(config) {
super(config);
}
async setup() {
await super.setup();
// get the wsEndpoint
const wsEndpoint = await readFile(path.join(DIR, 'wsEndpoint'), 'utf8');
if (!wsEndpoint) {
throw new Error('wsEndpoint not found');
}
// connect to puppeteer
this.global.__BROWSER_GLOBAL__ = await puppeteer.connect({
browserWSEndpoint: wsEndpoint,
});
}
async teardown() {
}
getVmContext() {
return super.getVmContext();
}
module.exports = PuppeteerEnvironment;
teardown.js
With all the things set up, we can now write our tests like this:
test.js
const timeout = 5000;
describe(
'/ (Home Page)',
() => {
let page;
beforeAll(async () => {
page = await globalThis.__BROWSER_GLOBAL__.newPage();
await page.goto('https://google.com');
}, timeout);
it('should load without error', async () => {
const text = await page.evaluate(() => document.body.textContent);
expect(text).toContain('google');
});
},
timeout,
);
Finally, set jest.config.js
to read from these files. (The jest-puppeteer
preset does something like this under the hood.) (The jest-puppeteer
preset does something like this under the hood.)
module.exports = {
globalSetup: './setup.js',
globalTeardown: './teardown.js',
};