javascript - 在 Puppeteer 中如何从默认配置文件切换到 chrome 窗口到所需的配置文件

标签 javascript automated-tests chromium puppeteer browser-automation

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

我提到了 https://peter.sh/experiments/chromium-command-line-switches/对于 Chromium args[--user-data-dir, --profile-directory]

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

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

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

我的环境:
1. puppeteer 版本:6.9.0
2.平台/操作系统版本: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
乙。单击配置文件图标并打开“管理人员”对话框。
c。添加新人(个人资料)
d。打开 chrome://version 并记下配置文件路径并关闭浏览器。
即。创建example1.js、example2.js并使用node example1.js、node example2.js执行。下面给出了两个示例的代码。

例子1.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();
})();

例子2.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:
一个。轮廓
乙。应该为该配置文件加载给定的扩展名。

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

最佳答案

好的,我找到原因了。

但首先我想补充一点,问题不在 puppeteer 中。问题是 Chrome 标志 --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考虑用特定的profile。

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

所以我做的是:

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

  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();
})();

感谢阅读。

关于javascript - 在 Puppeteer 中如何从默认配置文件切换到 chrome 窗口到所需的配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57623828/

相关文章:

javascript - 如何使用选择但仍然允许输入文本

sockets - 如何自动测试网络 (TCP/IP) 应用程序?

language-agnostic - 购买机器进行持续集成 - 关键因素?

c++ - ofstream (C++) 不创建文件(权限被拒绝)

c++ - 清除/删除 Chromium 嵌入式框架 (CEF3 C++) 缓存

javascript - Hello World - Backbone + Firebase + Backfire

javascript - AWS S3 直接通过浏览器下载文件

javascript - 默认情况下取消选中复选框

C# 查找解决方案中的所有测试

google-chrome - 如何关闭chrome浏览器自动更新