淺入淺出Selenium DevTools

前言

在自動化測試領域,Selenium一直是主流工具之一。隨著前端技術的不斷發展,瀏覽器的功能也在不斷豐富。

在這里插入圖片描述

Selenium 3版本前,一套通用的采集流程如上圖所示:

  1. 打開Charles,設置Session自動導出頻次及導出路徑
  2. Selenium模擬操作Chrome網頁頁面,待網頁頁面渲染出需采集的數據
  3. 解析Charles攔截的Session,提取目標數據

Selenium 4版本引入了org.openqa.selenium.devtools.DevTools,為開發者提供了更底層、更強大的瀏覽器交互能力。對以上采集流程而言,DevTools優化了步驟2,減少了模塊間的異步交互,增加了采集的穩定性。

什么是DevTools?

DevTools是Selenium 4引入的一個全新的功能模塊,它允許開發者直接與瀏覽器的DevTools協議(Chrome DevTools Protocol,CDP)進行交互。通過DevTools,開發者可以獲取瀏覽器的更底層信息,或者執行更復雜的瀏覽器操作。

Chrome DevTools協議是一個允許工具與瀏覽器內部對象交互的接口。通過CDP,開發者可以訪問瀏覽器的所有內部信息,如頁面結構、網絡請求、性能指標等。此外,CDP還允許開發者執行一些高級操作,如設置頁面縮放、獲取頁面截圖、模擬設備等。

為什么使用DevTools?

更底層的瀏覽器控制

相比傳統的Selenium API,DevTools提供了更底層的瀏覽器控制能力。通過直接訪問CDP,開發者可以獲取更詳細的瀏覽器狀態信息,或執行更復雜的操作。

更高的靈活性

DevTools的靈活性是它最大的優勢之一。通過CDP,開發者可以根據需求自定義瀏覽器的行為,而不受傳統API的限制。

更廣泛的應用場景

DevTools的功能涵蓋了從性能分析到網絡代理,從頁面調試到設備模擬等多個方面。這種多樣化的功能使得DevTools在自動化測試、性能優化、網絡調試等領域都有廣泛的應用。

DevTools的核心概念

DevTools Server

DevTools ServerDevTools的核心,它負責與瀏覽器的CDP交互。開發者可以通過DevTools Server發送指令,并接收瀏覽器的響應。DevTools Server的創建與管理是使用DevTools的前提條件。

DevTools Command

DevTools CommandDevTools的操作單元。通過發送特定的命令,開發者可以執行各種操作,如獲取頁面內容、模擬用戶交互、設置瀏覽器配置等。DevTools Command可以通過DevTools Server發送,并通過回調接收執行結果。

Event Listener

DevTools支持通過事件監聽器(Event Listener)來監聽瀏覽器的各種事件。例如,開發者可以監聽頁面加載完成、網絡請求完成、頁面元素更新等事件。這使得開發者可以在特定事件發生時執行自定義邏輯。

實際應用場景

1. 獲取頁面性能數據

通過DevTools,開發者可以輕松獲取頁面的性能數據,如加載時間、內存使用情況、CPU使用情況等。這些數據對于性能優化非常有價值。

示例代碼:

import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.events.Event;
import org.openqa.selenium.devtools.events.PerformanceMetric;// 創建DevTools實例
DevTools devTools = new Chrome().getDevTools();// 監聽性能指標事件
devTools.onPerformanceMetric(new Consumer<Event<PerformanceMetric>>() {@Overridepublic void accept(Event<PerformanceMetric> event) {PerformanceMetric metric = event.getData();System.out.println("Metric Name: " + metric.getName());System.out.println("Value: " + metric.getValue());}
});// 啟動DevTools會話
devTools.send(Performance.startProfiling());

2. 獲取頁面截圖

通過DevTools,開發者可以獲取頁面的截圖,并將其保存為圖片文件。這種功能對于自動化測試中的視覺驗證非常有用。

示例代碼:

import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.browser.Target;// 創建DevTools實例
DevTools devTools = new Chrome().getDevTools();// 獲取當前窗口截圖
String screenshot = devTools.send(Browser.getViewport()).getScreenshot();// 將截圖保存為PNG文件
File file = new File("screenshot.png");
Files.write(file.toPath(), Base64.getDecoder().decode(screenshot));

3. 模擬設備和屏幕

DevTools允許開發者模擬不同的設備和屏幕分辨率。這種功能對于響應式設計測試非常有用。

示例代碼:

import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.browser.Viewport;// 創建DevTools實例
DevTools devTools = new Chrome().getDevTools();// 設置視口
Viewport viewport = new Viewport();
viewport.setDeviceScaleFactor(2);
viewport.setDeviceWidth(375);
viewport.setDeviceHeight(667);// 發送設置指令
devTools.send(Browser.setDeviceMetrics(viewport));

4. 自定義瀏覽器行為

DevTools允許開發者自定義瀏覽器的行為,例如設置瀏覽器的user agent、模擬網絡條件等。這種功能對于跨瀏覽器測試和網絡調試非常有用。

示例代碼:

import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.network.NetworkConditions;// 創建DevTools實例
DevTools devTools = new Chrome().getDevTools();// 設置網絡條件
NetworkConditions conditions = new NetworkConditions();
conditions.setOffline(true);
conditions.setLatency(1000);
conditions.setDownloadThroughput(50000);// 發送網絡條件設置指令
devTools.send(Network.setNetworkConditions(conditions));

5. 調試和分析

DevTools提供了豐富的調試和分析工具,例如堆棧跟蹤、JavaScript執行、資源加載分析等。開發者可以利用這些工具來調試自動化測試腳本,或者分析瀏覽器的行為。

示例代碼:

import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.runtime.Runtime;// 創建DevTools實例
DevTools devTools = new Chrome().getDevTools();// 執行JavaScript代碼
String script = "console.log('Hello from DevTools!');";
devTools.send(Runtime.evaluate(script));// 獲取執行結果
String result = devTools.send(Runtime.getHeapStatistics()).getUsedHeapSize();
System.out.println("Used Heap Size: " + result);

Selenium 4中的DevTools集成

Selenium 4對DevTools進行了深度集成,使得開發者可以更方便地使用這些功能。在Selenium 4中,DevTools被設計為一個獨立的模塊,開發者可以根據需求選擇是否加載它。

啟用DevTools

在Selenium 4中,啟用DevTools非常簡單。開發者只需要創建一個DevTools實例即可開始使用。

示例代碼:

import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.devtools.DevTools;// 創建Chrome選項
ChromeOptions options = new ChromeOptions();// 啟用DevTools
options.addArguments("--remote-debugging-port=9222");// 創建Chrome驅動
ChromeDriver driver = new ChromeDriver(options);// 獲取DevTools實例
DevTools devTools = driver.getDevTools();

使用DevTools API

Selenium 4提供了豐富的DevTools API,涵蓋了從瀏覽器控制到性能分析、從網絡調試到設備模擬等多個方面。

示例代碼:

import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.browser.Browser;
import org.openqa.selenium.devtools.domain.runtime.Runtime;// 獲取瀏覽器版本信息
String version = devTools.send(Browser.getVersion());
System.out.println("Browser Version: " + version);// 獲取運行時信息
String runtimeInfo = devTools.send(Runtime.getRuntimeInfo());
System.out.println("Runtime Info: " + runtimeInfo);

自定義DevTools命令

除了使用Selenium提供的API,開發者還可以通過DevTools發送自定義的CDP命令。這種功能對于需要低級別控制的場景非常有用。

示例代碼:

import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.domain.custom.CustomCommand;// 創建自定義命令
CustomCommand<String> command = new CustomCommand<>("Runtime.evaluate", request -> {request.body().put("expression", "window.innerWidth");request.body().put("contextId", 1);
});// 發送自定義命令
String result = devTools.send(command);
System.out.println("Custom Command Result: " + result);

總結

org.openqa.selenium.devtools.DevTools是Selenium 4版本中一個非常強大的功能模塊。通過它,開發者可以直接與瀏覽器的DevTools協議交互,獲取更底層的瀏覽器控制能力和更靈活的操作方式。無論是自動化測試、性能優化,還是網絡調試,DevTools都能提供豐富的功能支持。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896651.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896651.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

04 路由表的IP分組傳輸過程

目錄 1、路由表的核心結構 2、IP分組傳輸過程和數據包轉發過程 2.1、IP分組傳輸過程 2.2、數據包轉發過程 2.3、IP分組傳輸過程和數據包轉發的區別 3、數據包的變化 3.1、拓撲結構 3.2、傳輸過程詳解&#xff08;主機A → 主機B&#xff09; 3.2.1、主機A發送數據 3.2…

【子網掩碼計算器:Python + Tkinter 實現】

子網掩碼計算器&#xff1a;Python Tkinter 實現 引言代碼功能概述代碼實現思路1. 界面設計2. 功能實現3. 事件處理 子網掩碼計算器實現步驟1. 導入必要的庫2. 定義主窗口類 SubnetCalculatorApp3. 創建菜單欄4. 創建界面組件5. 判斷 IP 地址類別6. 計算子網信息7. 其他功能函…

【練習】【貪心】力扣1005. K 次取反后最大化的數組和

題目 1005 K 次取反后最大化的數組和 給你一個整數數組 nums 和一個整數 k &#xff0c;按以下方法修改該數組&#xff1a; 選擇某個下標 i 并將 nums[i] 替換為 -nums[i] 。 重復這個過程恰好 k 次。可以多次選擇同一個下標 i 。 以這種方式修改數組后&#xff0c;返回數組 可…

3dsmax中使用python創建PBR材質并掛接貼圖

前言 筆者處理模型時下載到一個pbr材質庫貼圖包&#xff0c;手動每次創建材質過于麻煩&#xff0c;因此計劃使用自動化腳本根據貼圖名自動創建材質。 3dsmax的原本腳本使用的是maxscript&#xff0c;語法有點奇怪懶得學&#xff0c;發現也支持使用python編寫腳本&#…

Metal學習筆記九:光照基礎

光和陰影是使場景流行的重要要求。通過一些著色器藝術&#xff0c;您可以突出重要的對象、描述天氣和一天中的時間并設置場景的氣氛。即使您的場景由卡通對象組成&#xff0c;如果您沒有正確地照亮它們&#xff0c;場景也會變得平淡無奇。 最簡單的光照方法之一是 Phong 反射模…

JAVA學習筆記038——bean的概念和常見注解標注

什么是bean? Bean 就是 被 Spring 管理的對象&#xff0c;就像工廠流水線上生產的“標準產品”。這些對象不是你自己 new 出來的&#xff0c;而是由 Spring 容器&#xff08;一個超級工廠&#xff09;幫你創建、組裝、管理。 由 Component、Service、Controller 等注解標記的…

start DL from stratch (2)!!!

start DL from stratch &#xff08;2&#xff09;!!! 一、CPU and GPUcpuGPU安培架構愛達洛夫萊斯架構 二、使用conda創建一個新的虛擬環境三、autodl操作先知Linux復習目錄文件和數據上傳對于整個鏡像的操作守護進程Tips 四、autodl租用創建實例<big>沒有所需要的版本的…

機器學習:線性回歸,梯度下降

線性回歸模型 (Linear Regression Model) 梯度下降算法 (Gradient Descent Algorithm) 的數學公式

論文筆記-NeurIPS2017-DropoutNet

論文筆記-NeurIPS2017-DropoutNet: Addressing Cold Start in Recommender Systems DropoutNet&#xff1a;解決推薦系統中的冷啟動問題摘要1.引言2.前言3.方法3.1模型架構3.2冷啟動訓練3.3推薦 4.實驗4.1實驗設置4.2在CiteULike上的實驗結果4.2.1 Dropout率的影響4.2.2 實驗結…

nvm的學習

學習 nvm&#xff08;Node Version Manager&#xff09; 是掌握 Node.js 開發的關鍵技能之一。以下是系統的學習路徑和實戰指南&#xff0c;涵蓋從基礎到進階的內容&#xff1a; 一、基礎入門 1. nvm 的核心作用 多版本共存&#xff1a;安裝和管理多個 Node.js 版本&#xff…

GPT-4.5實際性能評測:實際探索

摘要 經過數萬輪嚴格測試&#xff0c;GPT-4.5的性能并未超越其前代產品GPT-4。此前發布的《GPT-4.5 一手實測&#xff1a;垃圾》一文中存在不準確描述&#xff0c;在此向讀者致歉。盡管GPT-4.5在價格上有所提升且響應速度較慢&#xff0c;但測試結果顯示其模型素質并未達到預期…

從UNIX到Linux:操作系統進化史與開源革命

從UNIX到Linux&#xff1a;操作系統進化史與開源革命 一、操作系統&#xff1a;數字世界的基石 1.1 什么是操作系統&#xff1f; 操作系統&#xff08;OS&#xff09;是計算機系統的核心管理者&#xff0c;承擔著三大核心使命&#xff1a; 硬件指揮官&#xff1a;直接管理C…

如何修改安全帽/反光衣檢測AI邊緣計算智能分析網關V4的IP地址?

TSINGSEE青犀推出的智能分析網關V4&#xff0c;是一款集成了BM1684芯片的高性能AI邊緣計算智能硬件。其內置的高性能8核ARM A53處理器&#xff0c;主頻可高達2.3GHz&#xff0c;INT8峰值算力更是達到了驚人的17.6Tops。此外&#xff0c;該硬件還預裝了近40種AI算法模型&#xf…

【全棧開發】----Mysql基本配置與使用

本篇是在已下載Mysql的情況下進行的&#xff0c;若還未下載或未創建Mysql服務&#xff0c;請轉到這篇: 2024 年 MySQL 8.0.40 安裝配置、Workbench漢化教程最簡易&#xff08;保姆級&#xff09;_mysql8.0.40下載安裝教程-CSDN博客 本文對于mysql的操作均使用控制臺sql原生代碼…

C++ primer plus 第四節 復合類型

本章內容包括: ? 創建和使用數組 ? 創建和使用 c-風格字符串 ? 創建和使用 string 類字符串 ? 使用方法getline( )和 get( )讀取字符串 ? 混合輸入字符串和數字 ? 創建和使用結構 ? 創建和使用共用休 ? 創建和使用枚舉 ? 創建和使用指針 ? 使用 new和delete 管理動態…

Java中的泛型類 --為集合的學習做準備

學習目標 ● 掌握在集合中正確使用泛型 ● 了解泛型類、泛型接口、泛型方法 ● 了解泛型上下限 ● 了解基本的使用場景 1.有關泛型 1.1泛型的概念 泛型&#xff08;Generics&#xff09;是Java中引入的參數化類型機制&#xff0c;允許在定義類、接口或方法時使用類型參數&a…

VUE3+Vite使用TailwindCSS【若依前后端分離框架】

參考&#xff1a;https://tailwind.nodejs.cn/docs/guides/vite#vue 和 https://blog.csdn.net/hjl_and_djj/article/details/144694485依次運行命令&#xff1a; cnpm install -D tailwindcss3.4.17 postcss autoprefixernpx tailwindcss init -p修改配置文件tailwind.config.…

FFmpeg入門:最簡單的音頻播放器

FFmpeg入門&#xff1a;最簡單的音頻播放器 歡迎大家來到FFmpeg入門的第二章&#xff0c;今天只做一個最簡單的FFmpeg音頻播放器&#xff1b;同樣&#xff0c;話不多說&#xff0c;先上流程圖 流程圖 以上流程和視頻播放器的解碼過程基本上是一致的&#xff1b; 不同點在于 S…

在Ubuntu下,源碼編譯安裝Python

在Ubuntu下&#xff0c;源碼編譯安裝Python 知識點 知識點1&#xff1a;在 Linux 系統里&#xff0c;/usr 目錄通常用于存放一些共享的、只讀的程序和數據&#xff0c;是系統安裝軟件的一個重要位置。而 /usr/src 目錄一般是用來存放系統源代碼以及一些軟件包的源代碼的地方 …

《每天讀一個JDK源碼》之HashMap解讀

&#x1f4cc;《每天讀一個JDK源碼》之HashMap解讀 &#x1f517;源碼定位&#xff1a;java.util.HashMap&#xff08;建議IDE對照閱讀&#xff09; 今天我們來破解Java集合框架中最精妙的藝術品——HashMap&#xff01;它不僅是面試必考題&#xff08;出現率99%&#xff09;&…