前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Puppeteer踩坑问题记录

Puppeteer踩坑问题记录

作者头像
luciozhang
发布2023-04-22 16:39:15
1.4K0
发布2023-04-22 16:39:15
举报
文章被收录于专栏:前端lucio前端lucio

前言

什么是Puppeteer?

Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。

具体怎么开始和API,参考文档:https://zhaoqize.github.io/puppeteer-api-zh_CN/

作者在工作中有需要用puppeteer编写自动化测试用例,对移动端H5进行E2E测试。

下文主要记录puppeteer进行自动化测试过程中,遇到的问题。

踩坑问题记录

Chromium问题

我们直接使用puppeteer,在MacOS可以正常运行测试脚本,但是部署到Linux服务器,会出现Chromium不存在,或者缺少Chromium依赖库的问题。

解决方案:使用不包含Chromium的puppeteer-core,再自己下载不同系统下的chromium,在配置参数中指定chromium的路径。

参考文章:https://www.jianshu.com/p/873f0bb2c3e5

代码语言:javascript
复制
//chrome.js 指定chromium路径
const os = require('os')
const type = os.type();
const path = require('path');
const chromePathMap = {
  Linux: path.resolve('lib', 'chrome', 'chrome-linux', 'chrome'),
  Darwin: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'  // Mac本地调试用
}
exports.chromePath = chromePathMap[type];
代码语言:javascript
复制
// 启动浏览器,通过executablePath配置chromium的路径
  const browser = await puppeteer.launch({
    executablePath: chromePath,
    headless: type == 'Linux' ? true : false, // MacOS,不启用无头模式,方便进行调试,
    devtools: false,
    args: ['--no-sandbox', '--disable-setuid-sandbox']
  })

tlinux下系统依赖库不存在

报错:

代码语言:javascript
复制
UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
/root/luciozhang/pmd-auto-test/lib/chrome/chrome-linux/chrome: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory

TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md

解决方案:手动安装缺失的依赖库

代码语言:javascript
复制
$ cd lib/chrome/chrome-linux
$ ldd chrome | grep not

发现缺失依赖库如下

代码语言:javascript
复制
        libXss.so.1 => not found
        libatk-bridge-2.0.so.0 => not found
        libatspi.so.0 => not found
        libgtk-3.so.0 => not found
        libgdk-3.so.0 => not found

安装依赖库

代码语言:javascript
复制
yum install libXScrnSaver*
yum install gtk3

字体问题

问题:由于系统字体问题,一些中文变成方块,

企业微信截图_29369da5-2437-474b-95a4-b4d0d7c218f0
企业微信截图_29369da5-2437-474b-95a4-b4d0d7c218f0

解决方案:添加中文字体,修改字体配置文件

参考文章:https://www.jianshu.com/p/f2ba4f5b8f36

关闭弹窗

代码语言:javascript
复制
 page.on('dialog', async dialog => {
      try {
        await dialog.accept();
      } catch (error) {
        console.log("关闭弹窗出现错误", error)
      }
    })

定位授权问题

问题:定位授权弹窗,想要模拟位置,但是puppeteer的api不支持。

解决方案:覆盖navigator.geolocation.getCurrentPosition方法,直接返回一个模拟位置。

参考文章:https://stackoverflow.com/questions/51229360/puppeteer-close-geolocation-permission-request

代码语言:javascript
复制
await page.evaluateOnNewDocument(function () {
      navigator.geolocation.getCurrentPosition = function (cb) {
        setTimeout(() => {
          cb({
            'coords': {
              accuracy: 21,
              altitude: null,
              altitudeAccuracy: null,
              heading: null,
              latitude: 23.129163,
              longitude: 113.264435,
              speed: null
            }
          })
        }, 500)
      }
    })

rem单位问题

问题:需要测试的H5页面,大多都是使用rem单位,但是puppeteer没有找到可以模拟dpr的方法。

解决方案:直接在page.evaluate设置为该窗口尺寸下,应该出现的font-size

代码语言:javascript
复制
 await page.evaluate(() => {
     document.documentElement.style.fontSize = '55px'
 })
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 踩坑问题记录
    • Chromium问题
      • tlinux下系统依赖库不存在
        • 字体问题
          • 关闭弹窗
            • 定位授权问题
              • rem单位问题
              相关产品与服务
              腾讯云服务器利旧
              云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档