const { chromium } = require(‘playwright’); const { saveVideo } = require(‘playwright-video’); const fs = require(‘fs’); var actions; var syncReport = []; fs.readFile(process.argv, ‘utf8’, (err, data) => {

actions = JSON.parse(data);

}); var video_output_name = process.argv; var videoSpeed = 1000; if(process.argv.length > 4){

videoSpeed = 10;

}

function logtime(now, start, msg){

var timestamp = now.getTime() - start.getTime();
syncReport.push({
        'time': timestamp,
        'msg': msg,
})
//console.log(timestamp/1000, msg);

}

(async () => {

var start = new Date();
// this seems to be ignored? no way to set zoom?
const browser = await chromium.launch({args: ["--force-device-scale-factor=1.5"]});
const context = await browser.newContext({ignoreHTTPSErrors: true});
const page = await context.newPage();
await page.setViewportSize({
        width: 1920,
        height: 1080,
});
await saveVideo(page, video_output_name);

for(var i = 0; i < actions.length; i++){
        var step = actions[i];
        //console.log(step);
        if(step.action == 'goto'){
                await page.goto(step.target);
                await page.waitForLoadState('networkidle');
                now = new Date();
                logtime(now, start, 'gone')
        } else if (step.action == 'scrollTo'){
                await page.evaluate((step) => document.getElementById(step.target.slice(1)).scrollIntoView({behavior: "smooth"}), step).catch((err) => console.log(err));
                now = new Date();
                logtime(now, start, 'scrolled')
        } else if (step.action == 'fill'){
                await page.fill(step.target, step.value)
                now = new Date();
                logtime(now, start, 'filled')
        } else if (step.action == 'click'){
                await page.click(step.target)
                now = new Date();
                logtime(now, start, 'clicked')
        } else {
                console.log("Unknown step type!", step)
        }

        if(step.sleep){
                await page.waitForTimeout(step.sleep * videoSpeed);
        }
}
// Sleep an extra 1.5s at the end.
await page.waitForTimeout(1500);
await browser.close();
process.stdout.write(JSON.stringify(syncReport));

})();