中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • 怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

發布時間:2022-07-19 11:20:09 來源:億速云 閱讀:265 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題”,在日常操作中,相信很多人在怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1、滑塊驗證思路

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

被測對象的滑塊對象長這個樣子。相對而言是比較簡單的一種形式,需要將左側的拼圖通過下方的滑塊進行拖動,嵌入到右側空槽中,即完成驗證。

要自動化完成這個驗證過程,關鍵點就在于確定滑塊滑動的距離。

根據上面的分析,驗證的關鍵點在于確定滑塊滑動的距離。但是看似簡單的一個需求,完成起來卻并不簡單。

如果使用自然邏輯來分析這個過程,可以拆解如下:

1. 定位到左側拼圖所在的位置,由于拼圖的形狀和大小固定,那么其實只需要定位其左邊邊界離背景圖片的左側距離。(實際在本例中,拼圖的起始位置也是固定的,節省了不少工夫)

2. 定位到右側凹槽所在位置,同樣其形狀和大小是固定的,那么只需要定位其左邊邊界離背景圖片的左側距離。

3. 用2中探測到的距離減去1中的距離,既是滑塊需要被拖動的距離。

要完成上述的探測計算,首先我們想到的是使用元素定位的方法定位到拼圖和凹槽的位置。

然而這一想法是不可行的,原因在于這個驗證模塊是使用兩個canvas即畫布元素實現的:

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

拼圖和凹槽都是“畫”在畫布上的,其本身并不是一個頁面元素,不能使用元素定位的方法。

因此我們考慮使用圖片解析的方法,分析畫布圖像本身,來確定相應圖形的位置。

2、使用OpenCV進行圖片解析

這里我們將引入OpenCV庫,來幫我完成圖片解析過程:

OpenCV是一個基于Apache2.0許可(開源)發行的跨平臺計算機視覺和機器學習軟件庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。 

它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。
OpenCV用C++語言編寫,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要傾向于實時視覺應用,并在可用時利用MMX和SSE指令, 如今也提供對于C#、Ch、Ruby,GO的支持。

2.1 OpenCV引入項目

1:下載 OpenCV

進入到官網 https://opencv.org/releases/ 下載對應系統的 openCV 軟件包后,解壓放置到本地。

使用Maven依賴并不能引入正確的OpenCV外部依賴,這里需使用外部

2:工程中添加 jar 包

Intellij 中選擇 File -> Project Structure -> Modules -> Dependencies

點擊 add -> JARS or directories... 選擇

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

3. 新建滑塊驗證工具類,引入OpenCV動態鏈接庫文件:opencv_java450.dll

public class slideUtil {
 
    public static String dllPath = "D:\\AutoTest\\src\\main\\resources\\lib\\opencv\\opencv_java450.dll";
 
    public static void main(String[] args) {
 
        //getDistance();//調試用的main方法,調用一個getDistance方法,獲取拼圖和凹槽之間的距離,返回double類型數值。
    }

2.2 實現圖片解析,計算所需距離

由于本項目的特點,拼圖的形狀和位置是固定的,首先我們將拼圖和凹槽圖片下載到本地,方便后續處理。(其它項目可能出現圖片形狀不固定的情況,可以直接用selenium實時下載圖片,這過程比較簡單,因此不贅述)。

下載完的圖片如下:

凹槽圖片:

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

拼圖圖片:

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

下面直接上代碼再做說明:

 public static double getDistance(){
 
        // 加載OpenCV本地庫
        System.load(dllPath);
        //System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//對拼圖圖形進行處理,存儲為Mat類型①
        Mat slideBlockMat=Imgcodecs.imread("slide_blk.png");//由于本項目的特點,拼圖的形狀和位置是固定的,因此直接將拼圖圖片保存到本地進行使用了
//Step1、灰度化圖片②
        Imgproc.cvtColor(slideBlockMat,slideBlockMat,Imgproc.COLOR_BGR2GRAY);
        imwrite("cvt_blk.png",slideBlockMat);
//Step2、去除周圍黑邊
        for (int row = 0; row < slideBlockMat.height(); row++) {
            for (int col = 0; col < slideBlockMat.width(); col++) {
                if (slideBlockMat.get(row, col)[0] == 0) {
                    slideBlockMat.put(row, col, 96);
                }
            }
        }
        imwrite("nsr_blk.png",slideBlockMat);
//Step3、轉黑白圖
        Core.inRange(slideBlockMat, Scalar.all(96), Scalar.all(96), slideBlockMat);
        imwrite("ezh_blk.png",slideBlockMat);<br>
//對滑動背景圖進行處理③
        Mat slideBgMat = Imgcodecs.imread("slide_bg.png");//背景凹槽圖片需要動態獲取,見下面的解析
//Step1、灰度化圖片④
        Imgproc.cvtColor(slideBgMat,slideBgMat,Imgproc.COLOR_BGR2GRAY);
        imwrite("hdh_bg.png",slideBgMat);
//Step2、二值化
        //Core.inRange(slideBgMat, Scalar.all(96), Scalar.all(96), slideBgMat);
        Imgproc.threshold(slideBgMat,slideBgMat,127,255, Imgproc.THRESH_BINARY);
        imwrite("ezh_bg.png",slideBgMat);
        Mat g_result = new Mat();
        /*
         * 將凹槽背景和拼圖圖形進行匹配⑤
         */
        Imgproc.matchTemplate(slideBgMat,slideBlockMat,g_result, Imgproc.TM_CCOEFF_NORMED);
        Point matchLocation= Core.minMaxLoc(g_result).maxLoc;
//返回匹配點的橫向距離
        System.out.println(matchLocation.x);
        return matchLocation.x;
    }

2.3 算法解析說明

①什么是Mat類型:

Mat 是 OpenCV 中用來存儲圖像信息的內存對象。Mat 對象中除了存儲圖像的像素數據外,還包括圖像的其它屬性:寬、高、類型、維度、大小、深度等。可以認為在OpenCV中,一個Mat對象就定義了一個圖像。②對于slide_blk.png的處理經過了以下過程:灰度化:

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

去黑邊:

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

二值化:

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

最終的目的在于將圖形轉化為黑白分明的圖形,便于后續匹配。

③本項目中,由于背景凹槽圖片,凹槽的位置是動態的,所以需要實時動態獲取:(如果遇到拼圖也需要動態獲取,可以同樣處理)

WebElement bg_canvas = driver.findElement(slide_ver_bg_by);//元素定位,定位到背景圖片
 
        Object base64 = ((JavascriptExecutor) driver)
                .executeScript("return arguments[0].toDataURL('image/png').substring(21);", bg_canvas);//頁面元素轉Base64
        String base64Str = base64.toString();
        generateImage(base64Str , "slide_bg.png");// 將base64把字符串裝換成圖片

④對于slide_bg.png的處理經過了以下過程:

灰度化:

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

二值化:

怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題

這里省略了去黑邊這一過程,因為實踐發現,經過上述兩部后,我們已經能夠進行較為準確的圖片匹配了。

⑤matchTemplate:在模板和輸入圖像之間尋找匹配,獲得匹配結果圖像

esult:保存匹配的結果矩陣

TM_CCOEFF_NORMED標準相關匹配算法

minMaxLoc:在給定的結果矩陣中尋找最大和最小值,并給出它們的位置

3、Selenium處理滑塊滑動

Selenium的滑塊處理是庫里的標準玩法,使用actions類或者javaScript的方式都可以實現,本例采用的是actions類方法:

public void slide_verify(WebDriver driver) throws InterruptedException {
 
        double  slideDistance = getDistance();//此處就是調用2中的OpenCV計算拼圖和凹槽距離
        System.out.println("滑動距離是" + slideDistance);
        WebElement dragElement = driver.findElement(slide_obj_by);//定位到滑塊
        Actions actions = new Actions(driver);
        actions.clickAndHold(dragElement);//模擬鼠標動作,按住滑塊
        Thread.sleep(300);
<br>//滑動,分兩次進行①
        actions.moveByOffset(((int)slideDistance - 11)/2,0);
        Thread.sleep(1000);
        Thread.sleep(500);
        actions.release();
        actions.perform();
    }

①這里進行滑動時,首先滑動距離之所以要減去11,是因為本例中拼圖的初始位置固定離整體圖形的左邊距是11.

分兩次滑行并且中間sleep了一個時間,是為了防止全勻速拖動而被識別為機器人。

到此,關于“怎么使用Java+Selenium+OpenCV解決自動化測試中的滑塊驗證問題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

聂拉木县| 平武县| 尚志市| 屏边| 临漳县| 托克托县| 南安市| 克什克腾旗| 青海省| 乌恰县| 区。| 封开县| 张北县| 竹溪县| 陵川县| 赤水市| 滨州市| 广汉市| 大荔县| 深泽县| 霍林郭勒市| 三台县| 瑞丽市| 银川市| 绥德县| 西昌市| 米泉市| 沙雅县| 灵台县| 定西市| 鲁甸县| 保亭| 临猗县| 稷山县| 新绛县| 察哈| 龙门县| 九台市| 油尖旺区| 义马市| 法库县|