在第二页上通过 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 使用的浏览器。
解决方案:你需要从Puppeteer中复制session token或者id,在调用的时候传给Google Light House,可以放到参数列表中。
内吹代码:
const lightHouseopts =
logLevel: 'info',
output: 'json',
disableDeviceEmulation: false,
defaultViewport:
width: 1200,
height: 900
,
chromeFlags: ['--disable-mobile-emulation']
;
【讨论】:
非常感谢您发布这个答案,我们已经实现了相同的框架,我们正在寻找答案。以上是关于在第二页上通过 puppeteer 运行灯塔时浏览器实例被杀死的主要内容,如果未能解决你的问题,请参考以下文章
使用 Angular JS 的自定义分页 - 需要在第一页显示 div 元素,这应该在第二页上重复单击下一步