在第二页上通过 puppeteer 运行灯塔时浏览器实例被杀死

Posted

技术标签:

【中文标题】在第二页上通过 puppeteer 运行灯塔时浏览器实例被杀死【英文标题】:Browser instance get killed while running light house through puppeteer on the second page 【发布时间】:2021-03-27 19:25:48 【问题描述】:

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

因此,在启动页面之后,当我尝试进行身份验证时,浏览器实例被杀死。我还在检索页面指标和 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();
    
)();

杀死浏览器实例。

【问题讨论】:

你想做什么?在脚本结束时,您登录,然后使用 chrome.kill 终止浏览器 - 从您的问题中不清楚您要达到什么目的,最后一部分在不知道您为什么这样做的情况下毫无意义。 很抱歉听到这个格雷厄姆,我猜描述不清楚,让我详细说明一下,步骤 1:i。使用 puppeteer 在浏览器上启动页面。 ii.触发灯塔、页面指标和窗口评估 iii.仅关闭灯塔上的实例 步骤 2:i。输入用户名和密码登录应用程序。 ii.触发灯塔、页面指标和窗口评估 iii.关闭灯塔和 puppeteer 上的实例。 所以在审核启动页面后,我打算登录到应用程序,请参阅所附图片。 对,所以从我可以看到你输入用户名和密码但之后没有触发任何东西,是浏览器正在关闭的问题还是只是它没有记录在?即浏览器是否保持打开状态但在登录页面上。我还假设所有的审计工作都按预期工作? Graham 实际上在此之前失败了,如果我禁用灯塔代码,那么它工作正常并且用户能够登录 【参考方案1】:

我通过一些研究发现了这一点,我认为如果有人在寻找答案,我可以帮助社区。​​p>

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

解决方案:你需要从Pu​​ppeteer中复制session token或者id,在调用的时候传给Google Light House,可以放到参数列表中。

内吹代码:

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

【讨论】:

非常感谢您发布这个答案,我们已经实现了相同的框架,我们正在寻找答案。

以上是关于在第二页上通过 puppeteer 运行灯塔时浏览器实例被杀死的主要内容,如果未能解决你的问题,请参考以下文章

怎么用html编辑第二页网页,现在内容全挤在第一页上?

边距在第二页上不起作用

使用 Angular JS 的自定义分页 - 需要在第一页显示 div 元素,这应该在第二页上重复单击下一步

Plotly:如何使用plotly-dash在一页上创建“输入文本”并在第二页或选项卡上输出(图形)?

Xamarin表单:第二页上的MasterDetail按钮

UIWebView第二次卡住了