当前位置:

首页 > 编程开发 > 怎么使用Java+Selenium+OpenCV解决自动化测试中的滑块验证问题

怎么使用Java+Selenium+OpenCV解决自动化测试中的滑块验证问题

1、滑块验证思路被测对象的滑块对象长这个样子。相对而言是比较简单的一种形式,需要将左侧的拼图通过下方的滑块进行拖动,嵌入到右侧空槽中,即完成验证。要自动化完成这个验证过程,关键点就在于确定滑块滑动的距离。根据上面的分析,验证的关键点在于确定滑块滑动的距离。但是看似简单的一个需求,完成起来却并不简单。如果使用自然逻辑来分析这个过程,可以拆解如下:1.定位到左侧拼图所在的位置,由于拼图的形状和大小固定,那么其实只需要定位其左边边界离背景图片的左侧距离。(实际在本例中,拼图的起始位置也是固定的,节省了不少工夫)

本文目录

    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);
    //对滑动背景图进行处理③         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);
    
    //滑动,分两次进行①         actions.moveByOffset(((int)slideDistance - 11)/2,0);         Thread.sleep(1000);         Thread.sleep(500);         actions.release();         actions.perform();     }

    ①这里进行滑动时,首先滑动距离之所以要减去11,是因为本例中拼图的初始位置固定离整体图形的左边距是11.

    分两次滑行并且中间sleep了一个时间,是为了防止全匀速拖动而被识别为机器人。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java OpenCV Selenium
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。