Puppeteer启动后能否复用初始页面?解决secureConnectionStart返回0问题
Puppeteer:避免多隐身会话+解决secureConnectionStart为0的问题
嘿,我来帮你理清楚这个问题~
首先你代码里出现两个浏览器会话的核心原因是重复启用了隐身模式:你在puppeteer.launch()里加了--incognito启动参数,之后又调用browser.createIncognitoBrowserContext()——这相当于在一个隐身浏览器实例里,又创建了一个完全独立的隐身上下文,所以才会出现两个会话窗口。
方法一:直接复用启动时的初始页面
如果你想跳过newPage(),直接用浏览器启动时默认打开的那个空白页,只需要删掉createIncognitoBrowserContext()相关代码,然后通过browser.pages()获取初始页面就行,代码改成这样:
const browser = await puppeteer.launch({ args: ['--incognito', '--aggressive-cache-discard'], headless: false }); // 解构获取浏览器启动后的第一个页面(就是默认打开的那个空白页) const [page] = await browser.pages();
这样就只会生成一个隐身会话,完美复用初始页面。
方法二:规范使用隐身上下文(更推荐)
其实Puppeteer官方更建议通过createIncognitoBrowserContext()来创建隔离的隐身环境,而不是依赖启动参数--incognito——两种方式选一个就好,别同时用,这样也能避免多会话问题:
const browser = await puppeteer.launch({ args: ['--aggressive-cache-discard'], headless: false }); const context = await browser.createIncognitoBrowserContext(); // 在这个独立的隐身上下文里创建页面,只会有一个会话 const page = await context.newPage();
关于secureConnectionStart一直返回0的问题
这个值为0通常有这几种情况:
- 你访问的是HTTP站点:这个字段本身就是为HTTPS的安全连接过程设计的,HTTP站点自然会返回0;
- 页面从缓存加载:哪怕你加了
--aggressive-cache-discard,有时候缓存还是会生效,或者你访问的是本地file://协议的文件,也不会触发安全连接; - 页面还没加载完成就获取指标:一定要等页面完全加载(包括网络请求都结束)再去读取
window.performance.timing,比如用waitForNavigation({ waitUntil: 'networkidle0' })确保页面稳定。
给你个验证的示例代码:
// 访问HTTPS站点,等待网络完全空闲 await page.goto('https://example.com', { waitUntil: 'networkidle0' }); // 在页面加载完成后获取指标 const secureConnectionStart = await page.evaluate(() => { return window.performance.timing.secureConnectionStart; }); console.log(secureConnectionStart); // 正常情况下会返回非0的时间戳
内容的提问来源于stack exchange,提问作者Bill
相关产品推荐
相关产品推荐

