由於專案的需要,測試中需要對網頁元素進行截圖,以確保它看起來沒有問題。之前我寫過一篇文章介紹過一種方法,先使用WebDriver 進行全螢幕截圖,然後根據目標元素(DOM Element)所在的位置,再對截下來的圖片進行剪裁,保留我們需要的位置即可。
那段程式碼一直都運作得很好,直到我知道了一個東西:iframe。 iframe(普通的 frame 也是一樣的,不過 frame 現在不太常見,這裡只用 iframe 舉例)中的內容被視為一個獨立的網頁,連 Window 物件也是和它的父級網頁分開的。而WebDriver 中的WebElement.getLocation()方法只能回傳這個WebElement 和它所在的Window 的位置關係,它的實作沒什麼問題,但全螢幕截圖不僅包含了iframe 的內容,可能也包含了它的父級頁面的內容,剪裁的時候需要知道目標元素在截圖中的位置。那麼問題來了,挖土機技術哪家強?如何計算一個元素相對於截圖的位置?
這個問題還要分類討論,原因是:Chrome 和 Firefox 中截圖的行為是不一樣的。 Chrome 的截圖是目前可見(viewport)的網頁內容,比方說,當網頁的實際大小超過 Chrome 視窗大小時,根據捲軸的位置不同,視窗中顯示的內容不同,Chrome 的截圖就是顯示出來的內容。於是我們要計算目標元素相對於目前可見內容的位置。而 Firefox 用了一個方法,可以截到整個網頁的內容,無視於目前視窗大小。於是對於 Firefox 我們要計算元素的絕對位置(Absolute Position)。
取得一個元素的位置,需要用到一個方法:Element.getBoundingClientRect()。這個方法傳回這個元素相對於它所處的 Windows 在目前可見內容的位置,以 top、left、right、bottom 四個值來表示。我們只關心其中的 top 和 left,至於剪裁的尺寸,我們可以透過元素本身的長度和寬度來得到,不需要計算。要計算目標元素對於頂級 Window的位置,我們只需要依序加上它的父級 Window的 top 和 left 即可。程式碼如下:
function calcViewportLocation(element) { var currentWindow = window; var rect = element.getBoundingClientRect(); // 元素的位置 var top = rect.top; var left = rect.left; while (currentWindow.frameElement != null) { // 处理父级 Window element = currentWindow.frameElement; currentWindow = currentWindow.parent; rect = element.getBoundingClientRect(); if (rect.top > 0) { top += rect.top; } if (rect.left > 0) { left += rect.left; } } return [Math.round(top), Math.round(left)]; }
以上程式碼適用於 Chrome ,而在 Firefox 中,我們還需要計算元素的絕對位置。這裡需要用到 Window.pageXOffset。 pageXOffset,或 scrollX,表示目前 Window 的橫向捲軸滾動的位置,把這個值和上述的 left 相加,即可得到目標元素的橫向絕對位置。當然,iframe 也可以特別處理的:
function calcAbsolutLocation(element) { var top = 0; var left = 0; var currentWindow = window; while (element != null) { rect = element.getBoundingClientRect(); var pageYOffset = currentWindow.pageYOffset; var pageXOffset = currentWindow.pageXOffset; if (typeof pageYOffset === 'undefined') { // IE8 currentDocument = currentWindow.document; var bodyElement = (currentDocument.documentElement || currentDocument.body.parentNode || currentDocument.body); pageYOffset = bodyElement.scrollTop; pageXOffset = bodyElement.scrollLeft; } top += rect.top + pageYOffset; left += rect.left + pageXOffset; element = currentWindow.frameElement; currentWindow = currentWindow.parent; if (element != null) { style = window.getComputedStyle(element); top += parseInt(style.borderTopWidth, 10); left += parseInt(style.borderLeftWidth, 10); } } return [Math.round(top), Math.round(left)]; }
由於 IE8 不支援 pageXOffset 和 scrollX,於是在 IE8 中需要一些特殊處理,即程式碼中標註「IE8」的部分。將這兩段 Javascript 程式碼,取代先前文中的 WebElement.getLocation(),即可實作在 iframe 中對特定元素截圖。

去掉重复并排序的方法:1、使用“Array.from(new Set(arr))”或者“[…new Set(arr)]”语句,去掉数组中的重复元素,返回去重后的新数组;2、利用sort()对去重数组进行排序,语法“去重数组.sort()”。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于Symbol类型、隐藏属性及全局注册表的相关问题,包括了Symbol类型的描述、Symbol不会隐式转字符串等问题,下面一起来看一下,希望对大家有帮助。

怎么制作文字轮播与图片轮播?大家第一想到的是不是利用js,其实利用纯CSS也能实现文字轮播与图片轮播,下面来看看实现方法,希望对大家有所帮助!

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于对象的构造函数和new操作符,构造函数是所有对象的成员方法中,最早被调用的那个,下面一起来看一下吧,希望对大家有帮助。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于面向对象的相关问题,包括了属性描述符、数据描述符、存取描述符等等内容,下面一起来看一下,希望对大家有帮助。

方法:1、利用“点击元素对象.unbind("click");”方法,该方法可以移除被选元素的事件处理程序;2、利用“点击元素对象.off("click");”方法,该方法可以移除通过on()方法添加的事件处理程序。

本篇文章给大家带来了关于JavaScript的相关知识,其中主要介绍了关于BOM操作的相关问题,包括了window对象的常见事件、JavaScript执行机制等等相关内容,下面一起来看一下,希望对大家有帮助。

foreach不是es6的方法。foreach是es3中一个遍历数组的方法,可以调用数组的每个元素,并将元素传给回调函数进行处理,语法“array.forEach(function(当前元素,索引,数组){...})”;该方法不处理空数组。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),