Puppeteer 在非无头模式下打开一个空选项卡
Puppeteer opens an empty tab in non-headless mode
当运行 puppeteer(npm 的最新版本 - 0.13.0)并将 args 传递给
puppeteer.launch({ headless: false })
chrome 打开时第一个选项卡是空页面,第二个选项卡中的脚本打开实际页面。
const page = await browser.newPage();
这是预期的行为吗?还是错误?
是的,这是预期的行为。它的工作原理与打开 chrome 浏览器完全一样。如果您关闭第一个选项卡,浏览器将关闭,就像使用 chrome 浏览器一样。至少需要打开一个选项卡,浏览器才能保持打开状态。如果您在启动浏览器时使用 await browser.pages()
,则当前打开的所有页面将 return,应该是 1 about:blank
页。
您可以添加此项,以便在您打开新页面时自动关闭第一个“空白”页面。
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();
}
解决办法是用已有的tab/page(不要开新的):
// 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');
对我来说,从用户的角度来看,这种行为是出乎意料的。这可能是设计意图,但这需要开发商的回应。
考虑到 puppeteer 浏览器的设计,Bobby Singh 的答案是正确的方法 class; puppeteer.launch 不带 args 的用法(无头具体承诺浏览器实例没有空白页,需要等待 Browser.newPage() 以便 Page.goto(url) 和后续命令;然而,当声明无头(无论是假还是真)时,浏览器实例承诺已经加载了一个页面。因此,下一个对 Page.goto(url) 常见的自然调用会打开第二个页面。
根据我的经验,这会导致混淆并且是接近错误的意外行为。例如,我发现在一个实例中打开有页面但在另一个实例中没有页面的浏览器会干扰进一步的 Puppeteer 命令的时间。
我曾经实现了一个没有参数的 puppeteer.launch() 例程,然后等待 Browser.newPage(),然后是 page.goto(url),然后是 page.focus(一些元素)。一切正常,然后我想添加一个调试选项,以切换无头模式。为此,我将 headless 参数添加到原始的 launch(call) 中。现在我的会话以两页而不是一页结束。这干扰了启动的第二页上的 page.focus 和后续命令。
解决方案是,如果你想指定 headless false 或 true,你可以采取不使用 browser.newPage() 的 browser.pages 的方法,但如果你不指定 headless,你需要用 Browser.newPage()
实例化
当运行 puppeteer(npm 的最新版本 - 0.13.0)并将 args 传递给
puppeteer.launch({ headless: false })
chrome 打开时第一个选项卡是空页面,第二个选项卡中的脚本打开实际页面。
const page = await browser.newPage();
这是预期的行为吗?还是错误?
是的,这是预期的行为。它的工作原理与打开 chrome 浏览器完全一样。如果您关闭第一个选项卡,浏览器将关闭,就像使用 chrome 浏览器一样。至少需要打开一个选项卡,浏览器才能保持打开状态。如果您在启动浏览器时使用 await browser.pages()
,则当前打开的所有页面将 return,应该是 1 about:blank
页。
您可以添加此项,以便在您打开新页面时自动关闭第一个“空白”页面。
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();
}
解决办法是用已有的tab/page(不要开新的):
// 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');
对我来说,从用户的角度来看,这种行为是出乎意料的。这可能是设计意图,但这需要开发商的回应。
考虑到 puppeteer 浏览器的设计,Bobby Singh 的答案是正确的方法 class; puppeteer.launch 不带 args 的用法(无头具体承诺浏览器实例没有空白页,需要等待 Browser.newPage() 以便 Page.goto(url) 和后续命令;然而,当声明无头(无论是假还是真)时,浏览器实例承诺已经加载了一个页面。因此,下一个对 Page.goto(url) 常见的自然调用会打开第二个页面。
根据我的经验,这会导致混淆并且是接近错误的意外行为。例如,我发现在一个实例中打开有页面但在另一个实例中没有页面的浏览器会干扰进一步的 Puppeteer 命令的时间。
我曾经实现了一个没有参数的 puppeteer.launch() 例程,然后等待 Browser.newPage(),然后是 page.goto(url),然后是 page.focus(一些元素)。一切正常,然后我想添加一个调试选项,以切换无头模式。为此,我将 headless 参数添加到原始的 launch(call) 中。现在我的会话以两页而不是一页结束。这干扰了启动的第二页上的 page.focus 和后续命令。
解决方案是,如果你想指定 headless false 或 true,你可以采取不使用 browser.newPage() 的 browser.pages 的方法,但如果你不指定 headless,你需要用 Browser.newPage()
实例化