node.js - puppeteer 设置 "isMobile:true"导致 "UnhandledPromiseRejectionWarning"

标签 node.js chromium puppeteer

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    devtools: true,
    ignoreHTTPSErrors: true
  });

  const page = await browser.newPage();
  page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1');
  page.setViewport({
    width: 375,
    height: 667,
    isMobile: true
  });
  await page.goto('https://google.com', {
    waitUntil: 'networkidle2'
  });

  await page.evaluate(() => {
    console.log(window);
  })
})();

当我在setViewport()中设置isMobile:true时,chromium正常打开,但进程报以下错误:

(node:13360) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: net::ERR_ABORTED at https://google.com
(node:13360) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

如何处理?

最佳答案

您刚刚错过了 setUserAgent 方法和 setViewport 方法的 await

(async () => {
 const browser = await puppeteer.launch({
   devtools: true,
   ignoreHTTPSErrors: true
 });

 const page = await browser.newPage();
 await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1');
 await page.setViewport({
   width: 375,
   height: 667,
   isMobile: true
 });
 await page.goto('https://google.com', {
   waitUntil: 'networkidle2'
 });

 await page.evaluate(() => {
   console.log(window);
 })
})();

此外,您可以用 emulate 方法替换这些方法。

emulate 方法是调用两个方法的快捷方式:

  • page.setUserAgent(userAgent)
  • page.setViewport(视口(viewport))

不要忘记从 puppeteer 导入设备对象。查看 devices 的完整列表.

const devices = require('puppeteer/DeviceDescriptors');

await page.emulate(devices['iPhone 6'])

所以,你的最终脚本应该是:

const puppeteer = require('puppeteer');
const devices = require('puppeteer/DeviceDescriptors');


(async () => {
 const browser = await puppeteer.launch({
   devtools: true,
   ignoreHTTPSErrors: true
 });

 const page = await browser.newPage();
 await page.emulate(devices['iPhone 6'])
 await page.goto('https://google.com', {
   waitUntil: 'networkidle2'
 });

 await page.evaluate(() => {
   console.log(window);
 })
})();

关于node.js - puppeteer 设置 "isMobile:true"导致 "UnhandledPromiseRejectionWarning",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57356255/

相关文章:

javascript - Node.js puppeteer 师 "document is not defined"

javascript - 与客户端脚本nodejs共享模块功能

javascript - 是什么阻止了node.js退出进程?

javascript - 您可以将 FileInterceptor 与 TransformPipe 一起使用吗

google-chrome-devtools - 同时运行多个 Puppeteer 实例是否安全?

javascript - Puppeteer page.evaluate querySelectorAll 返回空对象

javascript - Jest 仅显示一个测试套件,即使测试文件中存在对 describe() 的多个顶级调用也是如此

html - CSS 在打印中创建整页无边距纯色背景

css - 覆盖 Electron 中的首选配色方案

javascript - Puppeteer 抛出无效参数错误