如何为Puppeteer默认浏览器上下文添加Cookie且不打开额外窗口
问题根源
你当前代码里调用了browser.createBrowserContext(),这会创建一个全新的隔离浏览器上下文。而Puppeteer启动浏览器时,默认会自动创建一个默认上下文,并打开一个空白页(about:blank)的窗口。两个上下文各自对应一个窗口,所以出现了双窗口的问题。
解决方案
直接使用浏览器的默认上下文来设置Cookie,不需要创建新上下文。这样既不会额外生成窗口,Cookie也会自动应用到该上下文下的所有页面,实现共享。
修改后的代码如下:
const puppeteer = require('puppeteer-extra') const fs = require('fs'); const cookiesPath = "cookies.txt"; const StealthPlugin = require('puppeteer-extra-plugin-stealth') const { createCursor } = require("ghost-cursor") puppeteer.use(StealthPlugin()) // ... 你的其他代码(比如读取cookies的逻辑) cookies = JSON.parse(cookies) let args = [] if(proxy) { args.push(`--proxy-server=${proxy}`) } puppeteer.launch({ headless: false, args: args }).then(async browser => { // 关键修改:使用默认浏览器上下文,而非创建新上下文 const defaultContext = browser.defaultBrowserContext() await defaultContext.setCookie(...cookies) // 获取默认上下文里的默认页面(就是启动时打开的那个空白窗口) let pages = await browser.pages() let page = pages[0] // 第一个页面就是默认打开的空白页 let finalUserAgent = userAgent || defaultUserAgent console.log('Attempting to login w existing session..') await page.setUserAgent(finalUserAgent) await page.setDefaultNavigationTimeout(100000); // 90 seconds await page.goto(url) console.log(`logged in`) }) console.log(userAgent, proxy); res.send("browser launched with session");
额外说明
- 默认上下文的Cookie会被该上下文下所有新建页面共享,完全满足你的需求。
- 如果不想使用启动时的默认空白页,可以先关闭它再新建页面:
这样也只会打开一个窗口,且Cookie依然全局共享。let pages = await browser.pages() await pages[0].close() // 关闭默认空白页 let page = await defaultContext.newPage() // 在默认上下文新建页面
内容的提问来源于stack exchange,提问作者Tharusha Jayasooriya
相关产品推荐
相关产品推荐

