摘要:整個九月份由于業務繁重以及玩心頗重,一直沒有機會來寫一篇博文。關于服務端截圖,這種使用場景非常少見,大多服務器不同于機器并不提供相關圖形界面以及圖形庫,所以對不同的系統的不同版本的服務器需要安裝不同的共享庫。
整個九月份由于業務繁重以及玩心頗重,一直沒有機會來寫一篇博文。而且筆者于十月一日將會舉辦人生大事--婚禮,現在家里籌辦過程中只能抽出零碎的時間來寫這篇文章。
關于服務端截圖,這種使用場景非常少見,大多服務器不同于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”,即
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98032.html
摘要:一背景需求因為數據包含機密信息,所以得自己搭建圖表導出服務器在后臺生成對應圖表以圖片的形式導出保存。圖表個性化程度較高,如一些圖列是沒有的,但在前端可以利用實現。每周定時執行上述生成圖表的任務,保存到指定位置。 一、背景需求 1、因為數據包含機密信息,所以得自己搭建圖表導出服務器;在后臺生成對應Highcharts圖表、以圖片的形式導出保存。2、圖表個性化程度較高,如一些圖列是High...
摘要:視覺感知測試視覺回歸測試為了解決上面提到的各種問題,視覺感知測試孕育而生。第三種方式,無法進行視覺感知測試結果只能進行視覺回歸測試和上一版的繼續比較差異。 前端自動化測試 之 視覺測試 showImg(https://segmentfault.com/img/remote/1460000014720180); 前端測試分類 showImg(https://segmentfault.co...
摘要:視覺感知測試視覺回歸測試為了解決上面提到的各種問題,視覺感知測試孕育而生。第三種方式,無法進行視覺感知測試結果只能進行視覺回歸測試和上一版的繼續比較差異。 前端自動化測試 之 視覺測試 showImg(https://segmentfault.com/img/remote/1460000014720180); 前端測試分類 showImg(https://segmentfault.co...
摘要:用于將及其狀態轉化為可序列化的數據結構并添加唯一標識則是將記錄的數據結構重建為對應的。用于記錄中的所有變更則是將記錄的變更按照對應的時間一一重放。表示觀察變動時,是否需要記錄變動前的屬性值。該方法返回變動記錄的數組。 摘要: 網頁應該如何錄屏呢? 作者:Winty 原文:用戶行為錄幀調研 Fundebug經授權轉載,版權歸原作者所有。 關鍵點 首先,每一次會話都有一個唯一的s...
閱讀 3591·2021-09-13 10:28
閱讀 1940·2021-08-10 09:43
閱讀 1013·2019-08-30 15:44
閱讀 3183·2019-08-30 13:14
閱讀 1836·2019-08-29 16:56
閱讀 2942·2019-08-29 16:35
閱讀 2850·2019-08-29 12:58
閱讀 868·2019-08-26 13:46