浏览器实例在 运行 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 使用的浏览器维护。
解决方法:需要从Puppeteer复制session token或id,在调用时传给GoogleLight House,放在参数列表中即可。
内吹代码:
const lightHouseopts = {
logLevel: 'info',
output: 'json',
disableDeviceEmulation: false,
defaultViewport: {
width: 1200,
height: 900
},
chromeFlags: ['--disable-mobile-emulation']
};
在我的应用程序中,我在我的应用程序的各个页面上 运行 灯塔,以有序的方式,例如首先在启动页面上,然后在我再次登录后再次出现,依此类推。
因此,在启动页面之后,当我尝试进行身份验证时,浏览器实例被终止。我还检索了页面指标和 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 使用的浏览器维护。
解决方法:需要从Puppeteer复制session token或id,在调用时传给GoogleLight House,放在参数列表中即可。
内吹代码:
const lightHouseopts = {
logLevel: 'info',
output: 'json',
disableDeviceEmulation: false,
defaultViewport: {
width: 1200,
height: 900
},
chromeFlags: ['--disable-mobile-emulation']
};