资讯专栏INFORMATION COLUMN

puppeteer实现线上服务器任意区域截图

chnmagnus / 953人阅读

摘要:整个九月份由于业务繁重以及玩心颇重,一直没有机会来写一篇博文。关于服务端截图,这种使用场景非常少见,大多服务器不同于机器并不提供相关图形界面以及图形库,所以对不同的系统的不同版本的服务器需要安装不同的共享库。

整个九月份由于业务繁重以及玩心颇重,一直没有机会来写一篇博文。而且笔者于十月一日将会举办人生大事--婚礼,现在家里筹办过程中只能抽出零碎的时间来写这篇文章。

关于服务端截图,这种使用场景非常少见,大多服务器不同于PC机器并不提供相关图形界面以及图形库,所以对不同的系统的不同版本的服务器需要安装不同的共享库。同时,截图依赖的浏览器服务也存在很多兼容性问题,好在google提供了puppeteer模块依赖于webkit内核,这与大多数业务场景的渲染引擎一致,因此我们可大致忽略引擎渲染的差异(大多数差异在于引擎版本、画图库与字体库导致)。

页面截图与元素块截图

puppeteer是nodejs社区中的提供API操作Chromium的npm模块,具体的安装方式可参考官方文档。

进行页面截图:

const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto("https://example.com",{
            waitUntil: "networkidle2"
        });
  await page.screenshot({path: "example.png"});

  await browser.close();
})();

puppeteer自带全局截图,文档中也提供了相关示例。

可大多数场景是针对页面的某个DOM元素区域进行局部截图,这就需要依赖puppeteer提供的在当前页面执行js的功能,通过定位DOM元素计算该元素的位置和盒子模型的信息,计算出DOM元素的坐标值,进行裁剪。

局部截图

通过evaluate接口在页面上下文执行js:

async  screenshotDOMElement(page, selector, path, padding = 0) {
    const rect = await page.evaluate(selector => {
        try{
            const element = document.querySelector(selector);
            const {x, y, width, height} = element.getBoundingClientRect();
            if(width * height != 0){
                return {left: x, top: y, width, height, id: element.id};
            }else{
                return null;
            }
        }catch(e){
            return null;
        }
    }, selector);
    
    return await page.screenshot({
        path: path,
        clip: rect ? {
        x: rect.left - padding,
        y: rect.top - padding,
        width: rect.width + padding * 2,
        height: rect.height + padding * 2
        } : null
    });
}

let puppeteer = require("puppeteer");
const browser = await puppeteer.launch({args: ["--no-sandbox", "--disable-setuid-sandbox"]});
const page = await browser.newPage();
page.setViewport({width: 1580, height: 1024, deviceScaleFactor: 2});
// 使用管理员的cookie
var cookie = {
    name: "vdian-fe-l-u",
    value: "eyJpZCI6InlhbmdIm5hbWUiOiLmnajldsafds",
    domain: ip.trim(),
    path: "/",
    expires: Date.now() + 3600 * 1000
};
await page.setCookie(cookie); // 设置cookie
await page.goto(pageUrl, {
    waitUntil: "networkidle2"
});
await screenshotDOMElement(page,"[data-share-wrapper]",savedPath);
await browser.close();
服务器依赖配置

目前社区内部对于Centos6的系统没有提供相关依赖解决方案,笔者也针对Centos6做了1天的尝试,确实无法正常运行,主要是缺少了几个共享库导致,并且无法在Centos6上正确安装。

因此下文的依赖安装仅仅针对 Centos7 系统而言:

#依赖库
yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 nss.x86_64 -y

#字体
yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y

同时,在机器中安装puppeteer执行如下命令:

npm install puppeteer --unsafe-perm=true

设置unsafe-perm为true,则是为了避免npm在执行puppeteer包的脚本的时候随意切换UID/GID,如果使用默认的unsafe-perm=false,则会以非root身份安装puppeteer导致出错。

中文编码乱码问题

服务器安装中文字体,关于中文字体安装,请参考 给CentOS安装中文字体

页面编码为“utf-8”,即

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98032.html

相关文章

  • Node.js定时导出Highchart图表

    摘要:一背景需求因为数据包含机密信息,所以得自己搭建图表导出服务器在后台生成对应图表以图片的形式导出保存。图表个性化程度较高,如一些图列是没有的,但在前端可以利用实现。每周定时执行上述生成图表的任务,保存到指定位置。 一、背景需求 1、因为数据包含机密信息,所以得自己搭建图表导出服务器;在后台生成对应Highcharts图表、以图片的形式导出保存。2、图表个性化程度较高,如一些图列是High...

    miguel.jiang 评论0 收藏0
  • 1.前端自动化测试 之 视觉测试

    摘要:视觉感知测试视觉回归测试为了解决上面提到的各种问题,视觉感知测试孕育而生。第三种方式,无法进行视觉感知测试结果只能进行视觉回归测试和上一版的继续比较差异。 前端自动化测试 之 视觉测试 showImg(https://segmentfault.com/img/remote/1460000014720180); 前端测试分类 showImg(https://segmentfault.co...

    VioletJack 评论0 收藏0
  • 1.前端自动化测试 之 视觉测试

    摘要:视觉感知测试视觉回归测试为了解决上面提到的各种问题,视觉感知测试孕育而生。第三种方式,无法进行视觉感知测试结果只能进行视觉回归测试和上一版的继续比较差异。 前端自动化测试 之 视觉测试 showImg(https://segmentfault.com/img/remote/1460000014720180); 前端测试分类 showImg(https://segmentfault.co...

    张春雷 评论0 收藏0
  • 网页应该如何录屏呢?

    摘要:用于将及其状态转化为可序列化的数据结构并添加唯一标识则是将记录的数据结构重建为对应的。用于记录中的所有变更则是将记录的变更按照对应的时间一一重放。表示观察变动时,是否需要记录变动前的属性值。该方法返回变动记录的数组。 摘要: 网页应该如何录屏呢? 作者:Winty 原文:用户行为录帧调研 Fundebug经授权转载,版权归原作者所有。 关键点 首先,每一次会话都有一个唯一的s...

    _Suqin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<