Puppeteer在非无头模式下打开一个空标签

时间:2017-12-10 22:55:14

标签: google-chrome-devtools puppeteer

运行puppeteer(最后一个版本从npm - 0.13.0)并将args传递给

puppeteer.launch({ headless: false })

以空白页作为第一个标签打开chrome,并在第二个标签中打开脚本中的实际页面。

const page = await browser.newPage(); 这是预期的行为吗?还是一个bug?

5 个答案:

答案 0 :(得分:6)

是的,这是预期的行为。它与打开Chrome浏览器完全一样。如果您关闭了第一个标签页,则浏览器将像使用Chrome浏览器一样关闭。需要至少打开一个选项卡才能使浏览器保持打开状态。如果您在启动浏览器时使用await browser.pages,则会返回当前打开的所有页面,该页面应为1:空白页。

答案 1 :(得分:6)

解决方案是使用现有的标签/页面(不要打开一个新的)

// launch the browser
var browser = await puppeteer.launch({ headless: false });

// get existing tab/page (first item in the array)
var [page] = await browser.pages();

// load barcode tracking website
await page.goto('https://orcascan.com');

答案 2 :(得分:2)

对我来说,从用户的角度来看,这种行为是出乎意料的。这可能是设计意图,但这需要开发者的回应。

考虑到 puppeteer Browser 类的设计,Bobby Singh 的答案是正确的方法;不带参数的 puppeteer.launch 的使用(具体来说是无头的承诺一个没有空白页的浏览器实例,需要等待 Browser.newPage() 以便 Page.goto(url) 和后续命令;而,当声明无头时(无论是假的)或 true) 承诺的 Browser 实例已经加载了一个页面。因此,对 Page.goto(url) 的许多常见调用的下一个自然调用将打开第二个页面。

根据我的经验,这会导致混淆,并且是接近错误的意外行为。例如,我发现在一个实例中打开一个有页面的浏览器,而在另一个实例中没有一个页面,这会干扰进一步 Puppeteer 命令的计时。

我曾经在没有参数的情况下实现了 puppeteer.launch() 的例程,然后等待 Browser.newPage(),然后是 page.goto(url),然后是 page.focus(some element)。一切正常,然后我想添加一个调试选项,以切换无头模式。为了实现这一点,我在原始启动(调用)中添加了无头参数。现在我的会议结束了两页而不是一页。这干扰了启动的第二个页面上的 page.focus 和后续命令。

解决办法是,如果要指定headless false或true,可以采用browser.pages不带browser.newPage()的方式,但如果不指定headless,则需要用Browser.newPage实例化()

答案 3 :(得分:1)

您可以添加此项以在每次打开新页面时自动关闭第一个“空白”页面。

  browser.on('targetcreated', async function f() {

  let pages = await browser.pages();

            if (pages.length > 1) {
                await pages[0].close();

                browser.off('targetcreated', f);
            }

        });

答案 4 :(得分:0)

尝试一下:

const page = await browser.newPage();
const pages = await browser.pages();
if (pages.length > 1) {
    await pages[0].close();
}