浏览器实例在 运行 light house 通过 puppeteer 在第二页被杀死

Browser instance get killed while running light house through puppeteer on the second page

在我的应用程序中,我在我的应用程序的各个页面上 运行 灯塔,以有序的方式,例如首先在启动页面上,然后在我再次登录后再次出现,依此类推。

因此,在启动页面之后,当我尝试进行身份验证时,浏览器实例被终止。我还检索了页面指标和 windows 指标。下面是我的代码,

(async () => {
    const launchOptions = {
        headless: false,
        executablePath: 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe',
        args: ['--start-maximized',
            '--disable-web-security',
            '--disable-features=IsolateOrigins,site-per-process'],
        defaultViewport: null
    };
    const lightHouseopts = {
        logLevel: 'info',
        output: 'json',
        disableDeviceEmulation: false,
        defaultViewport: {
            width: 1200,
            height: 900
        },
        chromeFlags: ['--disable-mobile-emulation']
    };
    const browser = await puppeteer.launch(launchOptions);
    const url = "";
    const page = await browser.newPage();
    try {
        await page.goto(url);
        const metrics = await page.metrics();
        await influx.write([{
            measurement: 'launch_page_puppeteer_evaluation',
            tags: {
                page: 'launchpagepuppeteer'
            },
            fields: metrics
        }])

        const performanceTiming = JSON.parse(
            await page.evaluate(() => JSON.stringify(window.performance.timing))
        );

        performanceWindowsMetrics(performanceTiming, 'launchpagewindowsperformance', 'launch_page_windows_performance')
        const configLightHouse = null;
        const chrome = await chromeLauncher.launch(lightHouseopts);
        lightHouseopts.port = chrome.port;

        const resp = await util.promisify(request)(`http://localhost:${lightHouseopts.port}/json/version`);
        const { webSocketDebuggerUrl } = JSON.parse(resp.body);
        const browser = await puppeteer.connect({ browserWSEndpoint: webSocketDebuggerUrl });

        // Run Lighthouse
        const { lhr } = await lighthouse(page.url(), lightHouseopts, configLightHouse);
        await browser.disconnect();
        await chrome.kill();

        const json = reportGenerator.generateReport(lhr, 'json');
        const audits = JSON.parse(json).audits; // Lighthouse audits
        const first_contentful_paint = audits['first-contentful-paint'].displayValue;
        const total_blocking_time = audits['total-blocking-time'].displayValue;
        const time_to_interactive = audits['interactive'].displayValue;

        console.log(`\n
        Lighthouse metrics: 
         First Contentful Paint: ${first_contentful_paint}, 
        ⌛️ Total Blocking Time: ${total_blocking_time},
         Time To Interactive: ${time_to_interactive}`);

        const time = new Date().getTime();
        const html = reportGenerator.generateReport(lhr, 'html');
        fs.writeFile(`report-${time}.html`, html, function (err) {
            if (err) throw err;
        });
        await userNamePage.enterUserName(page, inputFiles.mySiteUserName);
        await passwordPage.enterPassword(page, inputFiles.mySitPassword);
        await page.waitFor(500);


        await browser.disconnect();
        await chrome.kill();
    } catch (error) {
        console.error(error);
    } finally {

        await page.waitFor(10000);
        console.log("Closing the browser session")
        await browser.close();
    }
})();

正在杀死浏览器实例。

我通过一些研究弄明白了,认为如果有人同样在寻找答案,我可以帮助社区。

首先是导致浏览器被杀死的根本原因,默认情况下 Light House 不负责保持会话,它 运行 在由浏览器。这就是为什么当 LightHouse 从 Puppeteer 触发时,会话由 Puppeteer 而不是 Puppeteer 使用的浏览器维护。

解决方法:需要从Pu​​ppeteer复制session token或id,在调用时传给GoogleLight House,放在参数列表中即可。

内吹代码:

const lightHouseopts = {
        logLevel: 'info',
        output: 'json',
        disableDeviceEmulation: false,
        defaultViewport: {
            width: 1200,
            height: 900
        },
        chromeFlags: ['--disable-mobile-emulation']
    };