如何在 Puppeteer 中设置最大视口?

Posted

技术标签:

【中文标题】如何在 Puppeteer 中设置最大视口?【英文标题】:How to set max viewport in Puppeteer? 【发布时间】:2019-03-04 07:58:14 【问题描述】:

当我运行一个新页面时,我必须使用setViewport 函数指定视口的大小:

await page.setViewport(
    width: 1920,
    height: 1080
)

我想使用最大视口。

如何使视口根据窗口大小调整大小?

【问题讨论】:

【参考方案1】:

这是一种在运行时通过 Chrome Devtools 协议会话调用 headful 中的 Page.setViewport() 和 headless 中的 Browser.setWindowBounds() 的方法:

async function setWindowSize(page, width, height) 
  if(headless) 
    const session = await page.target().createCDPSession();
    const windowId = await session.send('Browser.getWindowForTarget');
    await session.send('Browser.setWindowBounds', windowId, bounds: width: width, height: height);
    await session.detach();
   else 
    await page.setViewport(width: width, height: height);
  

请参阅my comment on GitHub 了解更多信息。

【讨论】:

【参考方案2】:

我遇到了同样的问题,对我有用的是这个。

const browser = await puppeteer.launch(
  headless: false,
  args: ['--window-size=1920,1080'],
  defaultViewport: null
  );

【讨论】:

当 headless=true 时使用 await page._client.send('Emulation.clearDeviceMetricsOverride');【参考方案3】:

对我来说,defaultViewport: nullargs: ['--start-maximized'] 的组合给了我全屏,视图适合屏幕大小,所以:

browser = await puppeteer.launch(
            headless: false,
            args: [
                '--start-maximized',
            ],
            defaultViewport: null,
        ); 

【讨论】:

【参考方案4】:

您可以将--window-size 标志作为参数传递给puppeteer.launch(),以将窗口大小更改为所需的widthheight

然后您可以调用 Chrome Devtools 协议方法 Emulation.clearDeviceMetricsOverride 来清除覆盖的设备指标(包括默认的 800 x 600 视口)。

这将导致视口与窗口大小匹配(截屏时等)。

const browser = await puppeteer.launch(
  args: [
    '--window-size=1920,1080',
  ],
);

const page = await browser.newPage();

await page._client.send('Emulation.clearDeviceMetricsOverride');

await page.screenshot(
  path: 'example.png', // Image Dimensions : 1920 x 1080
);

注意:page.viewport() 仍将返回 width: 800, height: 600 ,唯一可靠地更改这些属性值的方法是使用page.setViewport()

请参阅下面的完整示例:

'use strict';

const puppeteer = require('puppeteer');

(async () => 
  /* ============================================================
      Prerequisite: Set Window size
  ============================================================ */

  const browser = await puppeteer.launch(
    args : [
      '--window-size=1920,1080',
    ],
  );

  const page = await browser.newPage();

  await page.goto('https://www.example.com/');

  /* ============================================================
      Case 1: Default Viewport
  ============================================================ */

  console.log('Case 1 - Width  :', page.viewport().width);  // Width  : 800
  console.log('Case 1 - Height :', page.viewport().height); // Height : 600

  await page.screenshot(
    path: 'image-1.png', // Image Dimensions : 800 x 600
  );

  /* ============================================================
      Case 2: Clear Overridden Device Metrics
  ============================================================ */

  await page._client.send('Emulation.clearDeviceMetricsOverride');

  console.log('Case 2 - Width  :', page.viewport().width);  // Width  : 800
  console.log('Case 2 - Height :', page.viewport().height); // Height : 600

  await page.screenshot(
    path: 'image-2.png', // Image Dimensions : 1920 x 1080
  );

  /* ============================================================
      Case 3: Manually Set Viewport
  ============================================================ */

  await page.setViewport(
    width: 1920,
    height: 1080,
  );

  console.log('Case 3 - Width  :', page.viewport().width);  // Width  : 1920
  console.log('Case 3 - Height :', page.viewport().height); // Height : 1080

  await page.screenshot(
    path: 'image-3.png', // Image Dimensions : 1920 x 1080
  );

  /* ============================================================
      Case 4: Revert Back to Default Viewport
  ============================================================ */

  await page.setViewport(
      width: 800,
      height: 600,
  );

  console.log('Case 4 - Width  :', page.viewport().width);  // Width  : 800
  console.log('Case 4 - Height :', page.viewport().height); // Height : 600

  await page.screenshot(
    path: 'image-4.png', // Image Dimensions : 800 x 600
  );

  await browser.close();
)();

【讨论】:

tks,使用await page._client.send('Emulation.clearDeviceMetricsOverride'); 使--window-size 工作【参考方案5】:

可能值得一提的是,如果将puppeteer.launch(defaultViewport: null)puppeteer.connect() 结合使用,则需要再次传递defaultViewport: null,否则视口将调整回默认大小。所以在这种情况下,使用:

await puppeteer.connect(browserWSEndpoint: ws, defaultViewport: null)

【讨论】:

【参考方案6】:
const browser = await puppeteer.launch( "headless": false, args: ['--start-maximized']  );
const page = await browser.newPage();
await page.setViewport(width:0, height:0);

" const browser = ..." 行最大化您的 chrome 窗口。但请注意,页面是需要设置视口的位置,并且在您创建页面时它仍将保持默认大小。

当您将视口的宽度和高度设置为“0”时,页面视口大小将等于浏览器的大小。

【讨论】:

【参考方案7】:

我可能已经很晚了。不过对于其他人,请尝试:

const browser = await puppeteer.launch(defaultViewport: null);

如上所述将defaultViewport 选项设置为null 以禁用800x600 分辨率。那么它需要最大分辨率。

【讨论】:

@gdoron 在他们的文档中提到,puppeteer.launch(options)。请参阅defaultViewport 选项,它明确指出将其设置为null,它会禁用默认视口 + 它对我有用。 为我工作过: const browser = await puppeteer.launch( headless: false, defaultViewport: null ); 当禁用无头模式并以可视方式启动 Chromium 时,这确认视口使用其最大允许大小。与 pdf 选项 preferCSSPageSize: true 一起,可以更轻松地设置 pdf 的样式。 就我而言,您的答案和@Grant Miller 的答案(即使用参数设置窗口大小)都是解决方案【参考方案8】:

正如issue中所解释的那样

page.setViewport( width: 0, height: 0 );

通过推断当前屏幕分辨率使 chromium 设置视口。似乎只适用于headless: false

【讨论】:

以上是关于如何在 Puppeteer 中设置最大视口?的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何在 android constraintLayout 中设置视图的最大宽度?

Android:如何在 android constraintLayout 中设置视图的最大宽度?

如何在 PyCharm 中设置最大行长?

如何在 nativescript 中设置最大高度?

如何在android中设置带有包装内容的最大高度?

CSS:如何在数据列表中设置最大高度?