如何使用用户数据目录,但用于多个木偶机窗口



所以我想用我的谷歌配置文件打开puppeteer窗口,但我想做的是多次,我的意思是2-4个窗口,但配置文件相同-这可能吗?当我这样做的时候,我得到了这个错误:

(node:17460) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
[45844:13176:0410/181437.893:ERROR:cache_util_win.cc(20)] Unable to move the cache: Access is denied. (0x5)
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless:false,
'--user-data-dir=C:\Users\USER\AppData\Local\Google\Chrome\User Data',
);
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'example.png' });

await browser.close();
})();

注意:注释中已经指出了它,但示例中存在语法错误。发布会应该是这样的:

const browser = await puppeteer.launch({
headless: false,
args: ['--user-data-dir=C:\Users\USER\AppData\Local\Google\Chrome\User Data']
});

该错误来自于您同时启动多个浏览器实例的事实,因此配置文件目录将被锁定,并且不能被puppeteer移动以重用

您应该避免同时使用相同的用户数据目录启动chromium实例

可能的解决方案

  • 使打开的窗口按顺序排列,如果只有几个窗口,则会很有用。例如:
const firstFn = async () => await puppeteer.launch() ...
const secondFn = async () => await puppeteer.launch() ...
(async () => {
await firstFn()
await secondFn()
})();
  • 将用户数据目录的副本创建为User Data1User Data2User Data3等,以避免在木偶师复制它们时发生冲突。这可以通过Node的fs模块即时完成,甚至可以手动完成(如果您不需要很多实例(
  • 考虑重用Chromium实例(如果您的用例允许的话(,使用browser.wsEndpointpuppeteer.connect,如果您需要使用相同的用户数据目录打开数千个页面,这可能是一个解决方案。
    注意:这是性能最好的,因为只会启动一个浏览器,则可以在for..of或常规for循环中打开任意数量的页面(单独使用forEach可能会产生副作用(,例如:
const puppeteer = require('puppeteer')
const urlArray = ['https://example.com', 'https://google.com']
async function fn() {
const browser = await puppeteer.launch({
headless: false,
args: ['--user-data-dir=C:\Users\USER\AppData\Local\Google\Chrome\User Data']
})
const browserWSEndpoint = await browser.wsEndpoint()
for (const url of urlArray) {
try {
const browser2 = await puppeteer.connect({ browserWSEndpoint })
const page = await browser2.newPage()
await page.goto(url) // it can be wrapped in a retry function to handle flakyness
// doing cool things with the DOM
await page.screenshot({ path: `${url.replace('https://', '')}.png` })
await page.goto('about:blank') // because of you: https://github.com/puppeteer/puppeteer/issues/1490
await page.close()
await browser2.disconnect()
} catch (e) {
console.error(e)
}
}
await browser.close()
}
fn()

最新更新