Google chrome devtools 木偶演员在无头模式下打开一个空标签

Google chrome devtools 木偶演员在无头模式下打开一个空标签,google-chrome-devtools,puppeteer,Google Chrome Devtools,Puppeteer,运行Puppeter(npm-0.13.0的最新版本)并将参数传递给 puppeter.launch({headless:false}) chrome以空白页面作为第一个选项卡打开,并从第二个选项卡中的脚本打开实际页面 const page=wait browser.newPage() 这是一种预期的行为吗?还是虫子 是的,这是预期的行为。它的工作原理与打开chrome浏览器完全相同。如果关闭第一个选项卡,浏览器将关闭,就像使用chrome浏览器一样。至少需要打开一个选项卡,浏览器才能保持打开状

运行Puppeter(npm-0.13.0的最新版本)并将参数传递给

puppeter.launch({headless:false})

chrome以空白页面作为第一个选项卡打开,并从第二个选项卡中的脚本打开实际页面

const page=wait browser.newPage()

这是一种预期的行为吗?还是虫子

是的,这是预期的行为。它的工作原理与打开chrome浏览器完全相同。如果关闭第一个选项卡,浏览器将关闭,就像使用chrome浏览器一样。至少需要打开一个选项卡,浏览器才能保持打开状态。如果在启动浏览器时使用
wait browser.pages()
,则将返回当前打开的所有页面,该页面应为1
about:blank
page。

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

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

  let pages = await browser.pages();

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

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

        });
试试这个:

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

解决方案是使用现有选项卡/页面(不要打开新选项卡/页面):

//启动浏览器
var browser=wait puppeter.launch({headless:false});
//获取现有选项卡/页面(数组中的第一项)
var[page]=wait browser.pages();
//加载条形码跟踪网站
等待页面。转到('https://orcascan.com');

对于我来说,从用户的角度来看,这种行为是意外的。这可能是设计意图,但这需要开发人员的响应

Bobby Singh给出的答案是木偶演员浏览器类设计的正确方法;使用puppeter.launch而不使用args(headless具体来说是指没有空白页的浏览器实例,需要等待Browser.newPage()才能调用page.goto(url)和后续命令;然而,在声明headless时(无论是false还是true)浏览器实例已经加载了一个页面。因此,对许多公共页面的下一个自然调用page.goto(url)将打开第二个页面

根据我的经验,这会导致混乱,而且是一种近乎bug的意外行为。例如,我发现在一个实例中打开一个带有页面的浏览器,但在另一个实例中没有页面,这会干扰后续木偶手命令的计时

有一次,我实现了一个不带参数的puppeter.launch()例程,然后等待Browser.newPage(),然后是page.goto(url),然后是page.focus(一些元素)。一切正常,然后我想添加一个调试选项来切换headless模式。为了实现这一点,我在原始启动(call)中添加了headless参数。现在,我的会话以两页而不是一页结束。这干扰了启动的第二页上的page.focus和后续命令


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

谢谢,我知道chrome浏览器是如何工作的。我的问题更多的是关于为什么第一个选项卡保持打开和空白,并在第二个选项卡中打开实际的测试页面,更多的是,如何实际使用第一个页面,使每个浏览器实例只有一个页面。哦,所以
让页面=等待浏览器。页面
返回一个数组of pages。如果在启动后执行此操作,数组中的第一个也是唯一一个元素将是打开的选项卡。因此,您可以将其分配给变量
let page=pages[0]
,然后可以从那里使用该页面。谢谢,这完全有道理!browser.pages是一个函数-即let pages=wait browser.pages();您知道第二次调用pages时,它会返回不同的列表吗?这不起作用。@OrAssayag它对我起作用了!