在 Puppeteer 中如何从默认配置文件切换到 chrome window 到所需的配置文件

In Puppeteer how to switch to chrome window from default profile to desired profile

我的要求是在新配置文件上测试 chrome 扩展。

我为 Chromium args[--user-data-dir, --profile-directory]

引用了 https://peter.sh/experiments/chromium-command-line-switches/

浏览器启动后,打开2 chrome windows。一个具有给定的配置文件和扩展名,另一个具有默认配置文件和给定的扩展名。此外,焦点在具有默认配置文件的 window 上。所以所有的动作都在它上面发生。

我曾预计只有 1 个浏览器 window 会使用所需的配置文件和扩展名打开。

我试图将焦点切换到所需的 window 但 browser.BrowserContexts().length 为 1,这是具有默认配置文件的浏览器。另外 browser.targets() 显示只有 1 个目标类型为浏览器。

我的环境:
1。人偶版本:6.9.0
2。平台 / OS 版本:Windows 10 Pro 版本 1803
3。网址(如果适用):
4。 Node.js版本:10.16.3

我尝试了什么:
一个。从 path\to\my\project\node_modules\puppeteer.local-chromium\win64-674921\chrome-win\chrome.exe 打开 chrome.exe
b。单击配置文件图标并打开“管理人员”对话框。
c。添加新人(个人资料)
d。打开 chrome://version 并记下 Profile Path 并关闭浏览器。
e。创建example1.js、example2.js并使用节点example1.js、节点example2.js执行。下面给出了两个示例的代码。

example1.js

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({headless:false, args:['--disable-extensions-except=\path\to\my\extension',
'--load-extension=\path\to\my\extension',
'--user-data-dir=%userprofile%\AppData\Local\Chromium\User Data',
'--profile-directory=Profile 1'
]});

  const page = await browser.newPage();
  await page.waitFor(5000);
  await browser.close();
})();

example2.js

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({headless:false, args:['--disable-extensions-except=c:\dev\prj\vpnteam\global VPN\extension', 
                                                                '--load-extension=c:\dev\prj\vpnteam\global VPN\extension',
                                                                '--user-data-dir=c:\Users\govinda.s\AppData\Local\Chromium\User Data',
                                                                '--profile-directory=Profile 1'
                                                            ]});
  console.log(browser.browserContexts().length);
  var x = await browser.targets();
  for(let i=0;i<x.length;i++)
  {
    if(x[i].type()==='browser')
    {
        console.log(x[i]['_targetInfo']['targetId']);
    }
  }
  await browser.close();
})();

我原以为 Puppeteer 应该启动 Chrome 给定:
一个。轮廓
b。应该为该配置文件加载给定的扩展名。

然而,除了超出预期之外,
一个。还启动了具有默认配置文件的浏览器。总共打开了 2 个浏览器 windows。
b。具有默认配置文件的浏览器也已加载给定的扩展名。
c。默认情况下,具有默认配置文件的浏览器具有焦点。
d。 browser.browserContexts().length 为 1
e。只有 1 个目标类型为 browser

好的,找到原因了

但首先我想补充一点,问题不在 puppeteer 中。问题是 chromium flag --user-data-dir 的工作方式以及我期望它工作的方式。

我的理解是指定了 arg --user-data-dir 来更改用户数据的默认目录。 Chromium 搜索用户数据的默认目录是 %userprofile%\AppData\Local\Chromium\User Data,但是当使用 arg --user-data-dir 时,它会将 '\Default' 附加到特定目录。所以它变成了 %userprofile%\AppData\Local\Chromium\User Data\Default,这是一个配置文件目录。

因此不需要 arg --profile-directory。不过既然用过,也让chromium考虑使用specific profile

这里肯定存在一些参数冲突,导致打开了 2 个浏览器。一个具有指定的配置文件,另一个具有默认配置文件。

所以我做的是:

  1. 我将目录 %userprofile%\AppData\Local\Chromium\User Data\Profile 1 的内容移到了 %userprofile%\AppData\Local\Chromium\User Data\Profile 1\Default。我在配置文件 1 目录中创建了 'Default' 目录。

  2. 删除了 arg --profile-directory 并设置了 --user-data-dir=%userprofile%\AppData\Local\Chromium\User Data\Profile 1

现在,chromium 的作用是将其更改为 %userprofile%\AppData\Local\Chromium\User Data\Profile 1\Default。这样我就可以使用 puppeteer 使用所需的配置文件启动。

最终代码:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({headless:false, args:['--disable-extensions-except=/path/to/my/extension',
                                                                '--load-extension=/path/to/my/extension',
                                                                '--user-data-dir=%userprofile%\AppData\Local\Chromium\User Data\Profile 1'
                                                                //'--profile-directory=Profile 1'
                                                            ]});
  const page = await browser.newPage();
  await page.goto("http://www.google.com");
  await page.waitFor(5000)
  await browser.close();
})();

感谢阅读。

我们需要使用 puppeteer-core 来利用现有的 chrome/edge 等。我在我的 windows10.

中发现了以下工作
const puppeteer = require('puppeteer-core');

(async () => {
    const browser = await puppeteer.launch({
        headless: false,
        executablePath: 'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe',
        args: [
            '--user-data-dir=%userprofile%\AppData\Local\Chrome\User Data',
            '--profile-directory=Profile 8'
        ]
    });
})();