浏览器正常启动时是否会在执行中转无头,反之亦然?

Sum*_*osh 4 javascript node.js google-chrome-devtools puppeteer

我想立即启动一个无头的 Chrome 浏览器,做一些自动化操作,然后在做其他事情之前把它变成可见的。

使用 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'});
Run Code Online (Sandbox Code Playgroud)

Tho*_*orf 8

简短的回答:这是不可能的

Chrome浏览器只允许要么开始在浏览器中无头无无头模式。您必须在启动浏览器时指定它,并且在运行时无法切换。

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

长答案

您会假设您可以在调用 时重用数据目录puppeteer.launch,但由于存在多个错误(puppeteer repo 中的#1268#1270),目前这是不可能的。

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

过程

总结一下,整个过程应该是这样的(对于 headless 到 headfull,反之亦然):

  • 在非无头模式下爬行,直到您想切换模式
  • 序列化 cookie
  • 启动或重用第二个浏览器(无头模式)
  • 恢复 cookie
  • 重访页面
  • 继续爬行