我的要求是在新配置文件上测试 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 个浏览器。一个具有指定的配置文件,另一个具有默认配置文件。
所以我做的是:
我将目录
%userprofile%\AppData\Local\Chromium\User Data\Profile 1
的内容移动到%userprofile%\AppData\Local\Chromium\User Data\配置文件 1\默认
。我在配置文件 1 目录中创建了“默认”目录。删除了 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/