摘要:整個(gè)九月份由于業(yè)務(wù)繁重以及玩心頗重,一直沒有機(jī)會(huì)來寫一篇博文。關(guān)于服務(wù)端截圖,這種使用場(chǎng)景非常少見,大多服務(wù)器不同于機(jī)器并不提供相關(guān)圖形界面以及圖形庫,所以對(duì)不同的系統(tǒng)的不同版本的服務(wù)器需要安裝不同的共享庫。
整個(gè)九月份由于業(yè)務(wù)繁重以及玩心頗重,一直沒有機(jī)會(huì)來寫一篇博文。而且筆者于十月一日將會(huì)舉辦人生大事--婚禮,現(xiàn)在家里籌辦過程中只能抽出零碎的時(shí)間來寫這篇文章。
關(guān)于服務(wù)端截圖,這種使用場(chǎng)景非常少見,大多服務(wù)器不同于PC機(jī)器并不提供相關(guān)圖形界面以及圖形庫,所以對(duì)不同的系統(tǒng)的不同版本的服務(wù)器需要安裝不同的共享庫。同時(shí),截圖依賴的瀏覽器服務(wù)也存在很多兼容性問題,好在google提供了puppeteer模塊依賴于webkit內(nèi)核,這與大多數(shù)業(yè)務(wù)場(chǎng)景的渲染引擎一致,因此我們可大致忽略引擎渲染的差異(大多數(shù)差異在于引擎版本、畫圖庫與字體庫導(dǎo)致)。
頁面截圖與元素塊截圖puppeteer是nodejs社區(qū)中的提供API操作Chromium的npm模塊,具體的安裝方式可參考官方文檔。
進(jìn)行頁面截圖:
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自帶全局截圖,文檔中也提供了相關(guān)示例。
可大多數(shù)場(chǎng)景是針對(duì)頁面的某個(gè)DOM元素區(qū)域進(jìn)行局部截圖,這就需要依賴puppeteer提供的在當(dāng)前頁面執(zhí)行js的功能,通過定位DOM元素計(jì)算該元素的位置和盒子模型的信息,計(jì)算出DOM元素的坐標(biāo)值,進(jìn)行裁剪。
局部截圖通過evaluate接口在頁面上下文執(zhí)行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); // 設(shè)置cookie await page.goto(pageUrl, { waitUntil: "networkidle2" }); await screenshotDOMElement(page,"[data-share-wrapper]",savedPath); await browser.close();服務(wù)器依賴配置
目前社區(qū)內(nèi)部對(duì)于Centos6的系統(tǒng)沒有提供相關(guān)依賴解決方案,筆者也針對(duì)Centos6做了1天的嘗試,確實(shí)無法正常運(yùn)行,主要是缺少了幾個(gè)共享庫導(dǎo)致,并且無法在Centos6上正確安裝。
因此下文的依賴安裝僅僅針對(duì) Centos7 系統(tǒng)而言:
#依賴庫 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
同時(shí),在機(jī)器中安裝puppeteer執(zhí)行如下命令:
npm install puppeteer --unsafe-perm=true
設(shè)置unsafe-perm為true,則是為了避免npm在執(zhí)行puppeteer包的腳本的時(shí)候隨意切換UID/GID,如果使用默認(rèn)的unsafe-perm=false,則會(huì)以非root身份安裝puppeteer導(dǎo)致出錯(cuò)。
中文編碼亂碼問題服務(wù)器安裝中文字體,關(guān)于中文字體安裝,請(qǐng)參考 給CentOS安裝中文字體
頁面編碼為“utf-8”,即
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/98032.html
摘要:一背景需求因?yàn)閿?shù)據(jù)包含機(jī)密信息,所以得自己搭建圖表導(dǎo)出服務(wù)器在后臺(tái)生成對(duì)應(yīng)圖表以圖片的形式導(dǎo)出保存。圖表個(gè)性化程度較高,如一些圖列是沒有的,但在前端可以利用實(shí)現(xiàn)。每周定時(shí)執(zhí)行上述生成圖表的任務(wù),保存到指定位置。 一、背景需求 1、因?yàn)閿?shù)據(jù)包含機(jī)密信息,所以得自己搭建圖表導(dǎo)出服務(wù)器;在后臺(tái)生成對(duì)應(yīng)Highcharts圖表、以圖片的形式導(dǎo)出保存。2、圖表個(gè)性化程度較高,如一些圖列是High...
摘要:視覺感知測(cè)試視覺回歸測(cè)試為了解決上面提到的各種問題,視覺感知測(cè)試孕育而生。第三種方式,無法進(jìn)行視覺感知測(cè)試結(jié)果只能進(jìn)行視覺回歸測(cè)試和上一版的繼續(xù)比較差異。 前端自動(dòng)化測(cè)試 之 視覺測(cè)試 showImg(https://segmentfault.com/img/remote/1460000014720180); 前端測(cè)試分類 showImg(https://segmentfault.co...
摘要:視覺感知測(cè)試視覺回歸測(cè)試為了解決上面提到的各種問題,視覺感知測(cè)試孕育而生。第三種方式,無法進(jìn)行視覺感知測(cè)試結(jié)果只能進(jìn)行視覺回歸測(cè)試和上一版的繼續(xù)比較差異。 前端自動(dòng)化測(cè)試 之 視覺測(cè)試 showImg(https://segmentfault.com/img/remote/1460000014720180); 前端測(cè)試分類 showImg(https://segmentfault.co...
摘要:用于將及其狀態(tài)轉(zhuǎn)化為可序列化的數(shù)據(jù)結(jié)構(gòu)并添加唯一標(biāo)識(shí)則是將記錄的數(shù)據(jù)結(jié)構(gòu)重建為對(duì)應(yīng)的。用于記錄中的所有變更則是將記錄的變更按照對(duì)應(yīng)的時(shí)間一一重放。表示觀察變動(dòng)時(shí),是否需要記錄變動(dòng)前的屬性值。該方法返回變動(dòng)記錄的數(shù)組。 摘要: 網(wǎng)頁應(yīng)該如何錄屏呢? 作者:Winty 原文:用戶行為錄幀調(diào)研 Fundebug經(jīng)授權(quán)轉(zhuǎn)載,版權(quán)歸原作者所有。 關(guān)鍵點(diǎn) 首先,每一次會(huì)話都有一個(gè)唯一的s...
閱讀 3652·2021-09-13 10:28
閱讀 2000·2021-08-10 09:43
閱讀 1062·2019-08-30 15:44
閱讀 3248·2019-08-30 13:14
閱讀 1939·2019-08-29 16:56
閱讀 2999·2019-08-29 16:35
閱讀 2906·2019-08-29 12:58
閱讀 923·2019-08-26 13:46