浏览器在正常启动时是否可以在执行过程中变成 headless,反之亦然?

Can the browser turned headless mid-execution when it was started normally, or vice-versa?

我想启动一个 chromium 浏览器 instant headless,做一些自动化操作,然后在做剩下的事情之前把它变成可见。

使用 Puppeteer 可以做到这一点吗?如果可以,您能告诉我怎么做吗?如果不是,是否有任何其他浏览器自动化框架或库可以做到这一点?

到目前为止,我已经尝试了以下方法,但没有用。

const browser = await puppeteer.launch({'headless': false});
browser.headless = true;
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com', {waitUntil: 'networkidle2'});
await page.pdf({path: 'hn.pdf', format: 'A4'});

简答:不可能

Chrome 只允许以 headlessnon-headless 模式启动浏览器。您必须在启动浏览器时指定它,并且无法在运行时切换。

有可能启动第二个浏览器并重复使用第一个浏览器的 cookie(和任何其他数据)。

长答案

您会假设在 puppeteer 存储库中调用 puppeteer.launch, but this is currently not possible due to multiple bugs (#1268, #1270 时可以重用数据目录。

所以最好的方法是 save any cookies 或本地存储您需要在浏览器实例之间共享的数据,并在您启动浏览器时恢复数据。然后您第二次访问该网站。请注意,网站在 JavaScript 变量方面的任何状态都将在您重新抓取页面时丢失。

进程

总而言之,整个过程应该是这样的(反之亦然,从无头到有头):

  • 在非无头模式下抓取,直到您想要切换模式
  • Serialize cookies
  • 启动或重新使用第二个浏览器(无头模式)
  • 恢复 cookies
  • 重新访问页面
  • 继续抓取