user-journeys/runner.js (58 lines of code) (raw):

console.log('User journey runner is started.') import fs from 'fs'; import puppeteer from 'puppeteer'; import { createRunner, parse, PuppeteerRunnerExtension } from '@puppeteer/replay'; const journeyFolder = './journeys'; const replays = fs.readdirSync(journeyFolder); if(replays.length === 0) { console.log({ message:"No user journey found in the /journeys folder.", severity: "WARNING", }); process.exit(1); } else { console.log(`Found ${replays.length} user journeys in folder "journeys"`); } let taskIndex = 0; // If this container is running as a Cloud Run job execution if(process.env.CLOUD_RUN_JOB) { taskIndex = parseInt(process.env.CLOUD_RUN_TASK_INDEX, 10); } if(taskIndex > replays.length) { console.error({ message: `The job has been configured with too many tasks and not enough user journeys. We recommend using the same number of tasks as user journeys. Number of journeys found: ${replays.length}. Index of the current task: ${taskIndexs}. This process will now exit.`, severity: "WARNING", }); process.exit(1); } // Create an extension that prints at every step of the replay class Extension extends PuppeteerRunnerExtension { async beforeEachStep(step, flow) { await super.beforeEachStep(step, flow); console.log('Step: ', `${step.type} ${step.url || ''}`); } async afterAllSteps(flow) { await super.afterAllSteps(flow); console.log('All steps done'); } } // Start a browser and new page, needed to initialize the extension. // TODO: remove these lines if https://github.com/puppeteer/replay/issues/201 is fixed const browser = await puppeteer.launch({ headless: true, }); const page = await browser.newPage(); const recordingText = fs.readFileSync(`./journeys/${replays[taskIndex]}`, 'utf8'); const recording = parse(JSON.parse(recordingText)); console.log(`User journey ${taskIndex} running: ${replays[taskIndex]}`); const runner = await createRunner(recording, new Extension(browser, page, 7000)); const result = await runner.run(); if(result) { console.log(`User journey ${taskIndex} completed successfully: ${replays[taskIndex]}`); console.log('User journey runner has finished, exiting successfully') process.exit(); } else { console.log(`User journey ${taskIndex} completed with errors: ${replays[taskIndex]}`); console.log('User journey runner has finished, exiting with error') process.exit(1); }