《剛剛問世》系列初窺篇-Java+Playwright自動化測試-22- 操作鼠標拖拽 - 下篇(詳細教程)

1.簡介

上一篇中,宏哥說的宏哥在最后提到網站的反爬蟲機制,那么宏哥在自己本地做一個網頁,沒有那個反爬蟲的機制,谷歌瀏覽器是不是就可以驗證成功了,宏哥就想驗證一下自己想法,其次有人私信宏哥說是有那種類似拼圖的驗證碼如何處理。于是寫了這一篇文章,另外也是相對前邊做一個簡單的總結分享給小伙伴們或者童鞋們。廢話不多數,直接進入今天的主題。

2.滑動驗證碼

2.1演示模擬驗證碼點擊拖動場景

例如:演示模擬驗證碼點擊拖動場景示例如下:

3.代碼準備

3.1前端HTML代碼

前端HTML代碼如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>北京-宏哥 滑動條</title><link rel="stylesheet" href="drag.css"><script src="jquery-1.7.1.min.js"></script><script src="drag.js"></script><style type="text/css">.slidetounlock{font-size: 12px;background:-webkit-gradient(linear,left top,right top,color-stop(0,#4d4d4d),color-stop(.4,#4d4d4d),color-stop(.5,#fff),color-stop(.6,#4d4d4d),color-stop(1,#4d4d4d));-webkit-background-clip:text;-webkit-text-fill-color:transparent;-webkit-animation:slidetounlock 3s infinite;-webkit-text-size-adjust:none}@-webkit-keyframes slidetounlock{0%{background-position:-200px 0} 100%{background-position:200px 0}}.button1 {background-color: #f44336; border: none;color: white;padding: 15px 32px;text-align: center;text-decoration: none;display: inline-block;font-size: 28px;margin-bottom: 100px;text-decoration:none;color: white;}#myAnchor{text-decoration:none;color: white;}</style>
</head>
<body>
<div id="wrapper" style="position: relative;top: 300px;left:300px;"><button class="button1"><a id="myAnchor" href="https://www.cnblogs.com/du-hong/">北京-宏哥</a></button></br><div id="drag"><div class="drag_bg"></div><div class="drag_text slidetounlock" onselectstart="return false;" unselectable="on">請按住滑塊,拖動到最右邊</div><div class="handler handler_bg"></div></div>
</div><!--<a href="#" class="img"><img src="img/Lighthouse.jpg"/></a>-->
<script>$('#drag').drag();
</script>
</body>
</html>
3.2滑塊CSS樣式

HTML滑塊CSS樣式代碼如下:

#drag{position: relative;background-color: #e8e8e8;width: 300px;height: 34px;line-height: 34px;text-align: center;
}
#drag .handler{position: absolute;top: 0px;left: 0px;width: 40px;height: 32px;border: 1px solid #ccc;cursor: move;
}
.handler_bg{background: #fff url("../img/slider.png") no-repeat center;
}
.handler_ok_bg{background: #fff url("../img/complet.png") no-repeat center;
}
#drag .drag_bg{background-color: #7ac23c;height: 34px;width: 0px;
}
#drag .drag_text{position: absolute;top: 0px;width: 300px;color:#9c9c9c;-moz-user-select: none;-webkit-user-select: none;user-select: none;-o-user-select:none;-ms-user-select:none;font-size: 12px;        //  add
}
3.3滑塊拖拽JS

滑塊拖拽JS代碼如下:

$.fn.drag = function(options) {var x, drag = this, isMove = false, defaults = {};var options = $.extend(defaults, options);var handler = drag.find('.handler');var drag_bg = drag.find('.drag_bg');var text = drag.find('.drag_text');var maxWidth = drag.width() - handler.width();  //能滑動的最大間距//鼠標按下時候的x軸的位置handler.mousedown(function(e) {isMove = true;x = e.pageX - parseInt(handler.css('left'), 10);});//鼠標指針在上下文移動時,移動距離大于0小于最大間距,滑塊x軸位置等于鼠標移動距離$(document).mousemove(function(e) {var _x = e.pageX - x;// _x = e.pageX - (e.pageX - parseInt(handler.css('left'), 10)) = xif (isMove) {if (_x > 0 && _x <= maxWidth) {handler.css({'left': _x});drag_bg.css({'width': _x});} else if (_x > maxWidth) {  //鼠標指針移動距離達到最大時清空事件dragOk();}}}).mouseup(function(e) {isMove = false;var _x = e.pageX - x;if (_x < maxWidth) { //鼠標松開時,如果沒有達到最大距離位置,滑塊就返回初始位置handler.css({'left': 0});drag_bg.css({'width': 0});}});//清空事件function dragOk() {handler.removeClass('handler_bg').addClass('handler_ok_bg');text.removeClass('slidetounlock').text('驗證通過').css({'color':'#fff'});       //modify// drag.css({'color': '#fff !important'});handler.css({'left': maxWidth});                   // adddrag_bg.css({'width': maxWidth});                  // addhandler.unbind('mousedown');$(document).unbind('mousemove');$(document).unbind('mouseup');}
};
3.4jquery-1.7.1.min.js下載地址

?jquery-1.7.1.min.js下載鏈接:jquery所有版本下載 jquery官方cdn地址 jquery.min.js

3.5demo滑動演示效果

最后用瀏覽器打開HTML文件,看一下效果如下圖所示:

4.自動化代碼實現

4.1代碼設計

4.2參考代碼
package com.bjhg.playwright;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Locator;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公眾號:北京宏哥(微信搜索,關注宏哥,提前解鎖更多測試干貨)* * 《剛剛問世》系列初窺篇-Java+Playwright自動化測試-22- 操作鼠標拖拽 - 下篇(詳細教程)** 2025年02月13日*/
public class Test_Drag_Demo {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//1.使用chromium瀏覽器,# 瀏覽器配置,設置以GUI模式啟動Chrome瀏覽器(要查看瀏覽器UI,在啟動瀏覽器時傳遞 headless=false 標志。您還可以使用 slowMo 來減慢執行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));//2.創建contextBrowserContext context = browser.newContext();//創建pagePage page = context.newPage();//3.瀏覽器訪問demopage.navigate("E:\\Desktop\\test\\MouseDrag\\identifying_code.html");//4.開始拖拽 //*[@id='drag']/div[3]//獲取拖動按鈕位置并拖動Locator slider = page.locator("//*[@id='drag']/div[3]");// 使用鼠標滑動滑塊page.mouse().move(slider.boundingBox().x + slider.boundingBox().width / 2, slider.boundingBox().y + slider.boundingBox().height / 2);page.mouse().down();// 根據滑動的范圍,這里使用滑動最大距離page.mouse().move(slider.boundingBox().x + slider.boundingBox().width / 0.5+300, slider.boundingBox().y + slider.boundingBox().height / 2);page.mouse().up();System.out.println("Test Pass");//關閉pagepage.close();//關閉browserbrowser.close();}}
}
4.3運行代碼

1.運行代碼,右鍵Run As->Java Application,就可以看到控制臺輸出,如下圖所示:

2.運行代碼后電腦端的瀏覽器的動作。如下圖所示:

5.項目實戰

閑暇之際,宏哥突然想到以前的一個網站,于是抱著試一試的想法看看能不能找到這樣的一個演示實例,果然皇天不負有心人,在:jQuery插件庫-收集最全最新最好的jQuery插件?找了一個demo(也是沒有發爬蟲機制的)用于演示:jQuery滑動驗證。如下圖所示:

5.1代碼設計

5.2參考代碼
package com.bjhg.playwright;import com.microsoft.playwright.Browser;
import com.microsoft.playwright.BrowserContext;
import com.microsoft.playwright.BrowserType;
import com.microsoft.playwright.Locator;
import com.microsoft.playwright.Page;
import com.microsoft.playwright.Playwright;/*** @author 北京-宏哥* * @公眾號:北京宏哥(微信搜索,關注宏哥,提前解鎖更多測試干貨)* * 《剛剛問世》系列初窺篇-Java+Playwright自動化測試-21-操作鼠標拖拽 -中篇(詳細教程)** 2024年02月13日*/
public class Test_DragTo {public static void main(String[] args) {try (Playwright playwright = Playwright.create()) {//1.使用chromium瀏覽器,# 瀏覽器配置,設置以GUI模式啟動Chrome瀏覽器(要查看瀏覽器UI,在啟動瀏覽器時傳遞 headless=false 標志。您還可以使用 slowMo 來減慢執行速度。Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false).setSlowMo(3000));//2.創建contextBrowserContext context = browser.newContext();//創建pagePage page = context.newPage();//3.瀏覽器訪問demopage.navigate("https://www.jq22.com/demo/slideVerify201909022305/");//4.開始拖拽//獲取拖動按鈕位置并拖動:Locator slider = page.locator("//*[@id='verify-wrap']/span[1]");// 使用鼠標滑動滑塊page.mouse().move(slider.boundingBox().x + slider.boundingBox().width / 2, slider.boundingBox().y + slider.boundingBox().height / 2);page.mouse().down();// 根據滑動的范圍,這里使用滑動最大距離page.mouse().move(slider.boundingBox().x + slider.boundingBox().width / 0.5+300, slider.boundingBox().y + slider.boundingBox().height / 2);page.mouse().up();System.out.println("Test Pass");//關閉pagepage.close();//關閉browserbrowser.close();}}
}
5.3運行代碼

1.運行代碼,右鍵Run As->Java Application,就可以看到控制臺輸出,如下圖所示:

2.運行代碼后電腦端的瀏覽器的動作(滑動并驗證通過)。如下圖所示:

6.小結

好了,今天時間也不早了,宏哥就講解和分享到這里,感謝您耐心的閱讀,希望對您有所幫助。

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

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

相關文章

神經網絡常見激活函數 8-SELU函數

SELU 縮放指數線性單元&#xff1a;SELU&#xff08;Scaled Exponential Linear Unit&#xff09; 函數導函數 SELU函數 S E L U ( x ) { λ x x > 0 λ α ( e x ? 1 ) x ≤ 0 \rm SELU(x) \left\{ \begin{array}{} \lambda x \quad & x > 0 \\ \lambda \alph…

【Elasticsearch】多字段查詢方式匯總

在 Elasticsearch 中&#xff0c;實現多字段查詢的常見方式有以下幾種&#xff0c;每種方式適用于不同的場景&#xff1a; --- ### 1. **multi_match 查詢** - **用途**&#xff1a;在多個字段中執行同一查詢&#xff0c;支持多種匹配策略。 - **關鍵參數**&#xff1a…

多線之旅:wait 與 notify

今天小編繼續來分享下多線程中的一些內容。 在多線程環境下&#xff0c;由于線程調度的不確定性&#xff0c;所以我們有時候無法很好的去保證其線程的執行順序。 但是呢&#xff0c;我們又要實現這個順序執行&#xff0c;所以我們可以使用到這兩個方法&#xff0c;wait 和 no…

批量修改mysql字符串字段子字符串

替換子字符串 使用 REPLACE 函數替換字段中的特定子字符串。 示例&#xff1a; 將 table_name 表中 column_name 字段的所有 old_value 替換為 new_value。 UPDATE table_name SET column_name REPLACE(column_name, old_value, new_value) WHERE column_name LIKE %old_val…

達夢:AWR 生成

目錄標題 AWR 性能診斷與報告生成1. 檢查 AWR 系統狀態2. 查看數據庫中的所有表空間3. 查看現有的 AWR 快照4. 設置 AWR 快照的時間間隔5. 創建 AWR 快照6. 查看最新的 AWR 快照7. 生成 AWR HTML 報告8. 將 AWR 報告保存到指定文件鏈接總結 自動工作集負載信息庫 AWR 報告解析指…

股票數據接口API實例代碼python、JAVA等多種語言演示免費獲取實時數據、歷史數據、CDMA、KDJ等指標數據配有API說明文檔

? 本文中所有接口均可直接在瀏覽器打開獲取數據&#xff0c;為了便于大家驗證有效性&#xff0c;已經做好了超鏈接&#xff0c;直接點擊即可&#xff01; 滬深兩市股票列表 API接口鏈接&#xff08;可點擊驗證&#xff09;&#xff1a;https://api.mairui.club/hslt/list/b…

深入理解DOM:22個核心知識點與代碼示例

本文系統介紹DOM相關的22個核心概念&#xff0c;每個知識點均提供代碼示例及簡要說明&#xff0c;幫助開發者全面掌握DOM操作技巧。 一、DOM基礎概念 1. DOM概念 DOM&#xff08;Document Object Model&#xff09;是HTML/XML的編程接口&#xff0c;通過JavaScript可動態修改…

【Map vs Set】:Java數據存儲的“雙子星”對決

個人主頁&#xff1a;?喜歡做夢 歡迎 &#x1f44d;點贊 ?關注 ??收藏 &#x1f4ac;評論 目錄 &#x1f370;一、搜索 &#x1f36e;1.概念 &#x1f36e;2.模型 &#x1f370;二、Map &#x1f368;1.什么是Map&#xff1f; &#x1f368;2.Map的實例化 &…

【C語言 】C語言 桌游開發數字競拍(源碼)【獨一無二】

&#x1f449;博__主&#x1f448;&#xff1a;米碼收割機 &#x1f449;技__能&#x1f448;&#xff1a;C/Python語言 &#x1f449;專__注&#x1f448;&#xff1a;專注主流機器人、人工智能等相關領域的開發、測試技術。 【C語言 】C語言 桌游開發數字競拍&#xff08;源碼…

Reinforcement Learning Heats Up 強化學習持續升溫

Reinforcement Learning Heats Up 強化學習持續升溫 核心觀點&#xff1a;強化學習正成為構建具有高級推理能力大語言模型&#xff08;LLMs&#xff09;的重要途徑。 最新進展 模型示例&#xff1a;近期出現了如DeepSeek - R1及其變體&#xff08;DeepSeek - R1 - Zero&#xf…

Whisper+T5-translate實現python實時語音翻譯

1.首先下載模型&#xff0c;加載模型 import torch import numpy as np import webrtcvad import pyaudio import queue import threading from datetime import datetime from faster_whisper import WhisperModel from transformers import AutoTokenizer, AutoModelForSeq2…

湖倉分析|浙江霖梓基于 Doris + Paimon 打造實時/離線一體化湖倉架構

導讀&#xff1a;浙江霖梓早期使用 CDH 產品套件搭建了大數據系統&#xff0c;面臨業務邏輯冗余、查詢效率低下等問題&#xff0c;基于 Apache Doris 進行整體架構與表結構的重構&#xff0c;并基于湖倉一體和查詢加速展開深度探索與實踐&#xff0c;打造了 Doris Paimon 的實…

git bash在github的庫中上傳或更新本地文件

一、將本地文件上傳到 GitHub 倉庫 1. 創建 GitHub 倉庫 如果你還沒有在 GitHub 上創建倉庫&#xff0c;首先需要創建一個新的倉庫&#xff1a; 登錄到 GitHub。點擊右上角的 按鈕&#xff0c;選擇 New repository。給你的倉庫起個名字&#xff0c;并選擇 Public 或 Privat…

Jmeter壓測怎么控制TPS

壓測固定TPS的接口 有些任務需要我們控制接口的TPS&#xff0c;例如每秒請求一次。 TPS定時器 然后1個并發持續運行 壓測結果 需要注意TPS在1.0/s左右&#xff0c;有時可能是1.2、1.3&#xff0c;定時器會自動調整壓力&#xff0c;讓TPS保持在1.0左右。

ArcGISPro 新建shp+數據結構

import arcpy# 設置工作空間和 Shapefile 存放路徑 shp_path r"C:\path\to\your\folder\PolygonZY.shp" # Shapefile 存放路徑 fields [("CHBH", "TEXT", 20),("ZCMC", "TEXT", 100),("ZCLX", "TEXT"…

理解WebGPU 中的 GPUAdapter :連接瀏覽器與 GPU 的橋梁

在 WebGPU 開發中&#xff0c; GPUAdapter 是一個至關重要的對象&#xff0c;它作為瀏覽器與 GPU 之間的橋梁&#xff0c;為開發者提供了請求 GPU 設備、查詢 GPU 特性以及獲取適配器信息的能力。本文將詳細介紹 GPUAdapter 的核心屬性和方法&#xff0c;并通過實際代碼…

信呼OA辦公系統sql注入漏洞分析

漏洞描述 信呼OA辦公系統uploadAction存在SQL注入漏洞&#xff0c;攻擊者可利用該漏洞獲取數據庫敏感信息。 環境搭建 源碼下載地址&#xff1a;https://github.com/rainrocka/xinhu 下載后解壓到本地網站根目錄下&#xff0c;配置好數據庫&#xff0c;然后安裝即可 默認密…

vue框架生命周期詳細解析

Vue.js 的生命周期鉤子函數是理解 Vue 組件行為的關鍵。每個 Vue 實例在創建、更新和銷毀過程中都會經歷一系列的生命周期階段&#xff0c;每個階段都有對應的鉤子函數&#xff0c;開發者可以在這些鉤子函數中執行特定的操作。 Vue 生命周期概述 Vue 的生命周期可以分為以下幾…

一文深入了解DeepSeek-R1:模型架構

本文深入探討了 DeepSeek-R1 模型架構。讓我們從輸入到輸出追蹤 DeepSeek-R1 模型&#xff0c;以找到架構中的新發展和關鍵部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架構。本文旨在涵蓋其設計的所有重要方面。 &#x1f4dd; 1. 輸入上下文長度 DeepSeek-R1的輸入上下文長…

開發基礎(8):鴻蒙圖表開發

mpchart mpchart是一個包含各種類型圖表的圖表庫,主要用于業務數據匯總,例如銷售數據走勢圖,股價走勢圖等場景中使用,方便開發者快速實現圖表UI,mpchart主要包括線形圖、柱狀圖、餅狀圖、蠟燭圖、氣泡圖、雷達圖、瀑布圖等自定義圖表庫。 柱狀圖 導入import {BarChart, …