验证码处理在自动化测试中的应用

在进行自动化测试时,处理验证码是一项常见的挑战,特别是图形验证码。每次刷新都会生成新的验证码,因此我们可以采用以下两种方法来获取验证码:

  获取验证码图片链接:例如 src="http://example.com/getcaptcha/123",但这种方式并不总是可靠,因为通过链接访问的验证码可能与当前页面显示的不一致。

  使用Selenium截屏:首先截取整个页面,然后定位验证码元素的位置和大小,接着使用Java的图像处理库裁剪出验证码图像,最后进行图像识别。

  方法一:获取验证码图片地址并下载

  以下是获取验证码图片地址并下载的代码示例:

 import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.URL;import java.util.Random;public class CaptchaDownloader {public static void main(String[] args) {System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");WebDriver driver = new ChromeDriver();driver.get("http://example.com/login");String captchaSrc = driver.findElement(By.id("captchaImage")).getAttribute("src");String imgUrl = captchaSrc + ".png";  // 拼接下载地址String fileName = String.valueOf(new Random().nextInt(100000));  // 生成随机文件名String filePath = "img/login/";saveImage(imgUrl, fileName, filePath);  // 下载图片driver.quit();}private static void saveImage(String imgUrl, String fileName, String filePath) {try {URL url = new URL(imgUrl);InputStream in = url.openStream();FileOutputStream fos = new FileOutputStream(new File(filePath + fileName + ".png"));byte[] buffer = new byte[2048];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {fos.write(buffer, 0, bytesRead);}in.close();fos.close();System.out.println("图片保存成功");} catch (Exception e) {System.err.println("保存图片时发生错误: " + e.getMessage());}}}

方法二:使用Selenium截屏并裁剪验证码

  除了直接下载验证码,我们还可以在页面上截屏并裁剪验证码。这是更常用的方法,具体步骤如下:

 import org.openqa.selenium.OutputType;import org.openqa.selenium.TakesScreenshot;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import org.openqa.selenium.WebElement;import org.openqa.selenium.By;import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.util.Random;public class CaptchaCutter {public static void main(String[] args) throws Exception {System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");WebDriver driver = new ChromeDriver();driver.get("http://example.com/login");// 截取整个页面File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);BufferedImage fullImg = ImageIO.read(screenshot);// 定位验证码元素WebElement captchaElement = driver.findElement(By.id("captchaImage"));int x = captchaElement.getLocation().getX();int y = captchaElement.getLocation().getY();int width = captchaElement.getSize().getWidth();int height = captchaElement.getSize().getHeight();// 裁剪验证码BufferedImage captchaImg = fullImg.getSubimage(x, y, width, height);String captchaFileName = "img/login/" + new Random().nextInt(100000) + "_captcha.png";ImageIO.write(captchaImg, "png", new File(captchaFileName));System.out.println("验证码裁剪并保存成功");driver.quit();}}

输入验证码并登录

  接下来,我们可以使用图像识别库(例如 Tesseract)来识别验证码的内容,并将其输入到登录框中。这里提供一个示例:

import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.openqa.selenium.chrome.ChromeDriver;import java.io.File;import java.io.IOException;import net.sourceforge.tess4j.Tesseract;import net.sourceforge.tess4j.TesseractException;public class LoginWithCaptcha {public static void main(String[] args) {System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");WebDriver driver = new ChromeDriver();driver.get("http://example.com/login");// 输入用户名和密码driver.findElement(By.id("username")).sendKeys("your_username");driver.findElement(By.id("password")).sendKeys("your_password");// 识别验证码并输入String captchaFilePath = "img/login/your_captcha_file.png"; // 替换为实际文件路径String captchaText = recognizeCaptcha(captchaFilePath);driver.findElement(By.id("captchaInput")).sendKeys(captchaText);// 提交登录driver.findElement(By.id("loginButton")).click();// 检查登录状态if (driver.getPageSource().contains("欢迎")) {System.out.println("登录成功!");} else {System.out.println("登录失败,验证码可能输入错误。");}driver.quit();}private static String recognizeCaptcha(String filePath) {Tesseract tesseract = new Tesseract();tesseract.setDatapath("path/to/tessdata");try {return tesseract.doOCR(new File(filePath));} catch (TesseractException e) {System.err.println("识别验证码时发生错误: " + e.getMessage());return "";}}}

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

云计算在智能交通系统中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 云计算在智能交通系统中的应用 云计算在智能交通系统中的应用 云计算在智能交通系统中的应用 引言 云计算概述 定义与原理 发展历…

全球碳循环数据集(2000-2023)包括总初级生产力、生态系统净碳交换和生态系统呼吸变量

全球碳循环数据集(2000-2023) 数据介绍 PFTs_XGB FLUX 是一个基于 XGBOOST 机器学习模型的全球碳循环数据集。该数据集通过对全球植被功能类型(PFTs)的分类,结合了 FLUXNET、AmeriFlux 和 ICOS 通量站点的现场观测数据…

Kafka经典面试题

1、kafka消息发送的流程? producer发送过程中启动两个线程 一个main线程 一个sender线程,在main线程中先创建一个双端队列(RecordAccumlator、producerbatch),main将我们需要发送的东西经过拦截器,序列化&a…

HTB:Photobomb[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行端口开放扫描 再次使用nmap对靶机开放端口进行脚本、服务扫描 使用ffuf进行简单的子域名扫描 使用浏览器直接访问该域名 选取一个照片进行下载,使用Yakit进行抓包 USER_FLAG:a9afd9220ae2b5731…

蓝桥杯c++算法学习【1】之枚举与模拟(卡片、回文日期、赢球票、既约分数:::非常典型的比刷例题!!!)

别忘了请点个赞收藏关注支持一下博主喵!!! 关注博主,更多蓝桥杯nice题目静待更新:) 枚举与模拟 一、卡片: 【问题描述】 小蓝有很多数字卡片,每张卡片上都是一个数字(0到9)。 小蓝…

html页面中的内容替换,或改变某些字的颜色

1. html页面中的内容替换,或改变某些字的颜色 前端使用innnerHtml显示返回值+innerHtml文字显示两种不同的颜色(两部分显示颜色不一样) 1.1. html字符串改变某些字的颜色 需求:要文本框的字体部分改变颜色、大小、换行等功能。在了解需求后,文本框input发现完全满足不了现需…

Linux——简单认识vim、gcc以及make/Makefile

前言:大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。 1、vim操作: 默认打开vim时,vim处于命令模式。(在其他模式中,Esc就能够返回命令模式) 常用的命令有: n gg:跳转到n行&…

C++基础(12.红黑树实现)

目录 红黑树的概念: 红黑树规则: 红黑树如何确保最长路径不超过最短路径的2倍的? 红黑树的效率: 红黑树的插入: 红黑树树插入⼀个值的大概过程: 情况1:变色 情况2:单旋变色: 情况3&…

Spark 的容错机制:保障数据处理的稳定性与高效性

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…

Linux内核编程(二十)RTC子系统一驱动rx8010

本文目录 一、基础知识点1.什么是RTC?2. RTC方案3. 电路原理图 二、RTC芯片(RX8010)移植三、关于时间的一些命令四、应用层使用1. 使用RTC驱动2. 使用time.h库(额外知识点) 一、基础知识点 1.什么是RTC? R…

GESP4级考试语法知识(贪心算法(一))

海盗船代码&#xff1a; #include<iostream> #include<algorithm> using namespace std; int data[21]; int main() {int n;cin>>n;for(int i0;i<n;i)cin>>data[i];sort(data,datan);int temp0,sum0;for(int i0;i<n;i){tempdata[i];if(temp>…

036 RabbitMQ消息确认 死信队列 延时队列

文章目录 生产者确认模式application.propertiesMessageController.javaMessageConfirmRallback.java 生产者回退模式application.propertiesMessageConfirmRallback.javaMessageController.java 消费者手动确认application.propertiesConsumerAckQueueListener.java 死信队列延…

Unity 插件 - Project窗口资源大小显示

Unity 插件 - Project窗口资源大小显示 &#x1f354;功能&#x1f32d;安装 &#x1f354;功能 &#x1f4a1;.显示Project Assets 和Packages下所有文件的大小&#xff08;右侧显示&#xff09; &#x1f4a1;.统计选中文件夹及其子文件夹下所有文件的大小并显示&#xff08…

Maven 中央仓库地址 mvnrepository.com

下载一些 jar 包驱动&#xff0c;不需用去官网下了&#xff0c;直接去 Maven 中央仓库&#xff0c;高效、简单 Maven 中央仓库地址 https://mvnrepository.com/open-source 我们下期见&#xff0c;拜拜&#xff01;

制作自己的刷题小题库,提高刷题效率

日常刷题 乱序/背题多种模式 组队刷题 查看小组的刷题统计 在线考试 创建考试多人同时答题 ----这是一条分割线----- 土著刷题&#xff0c;是一款可以导入题库的在线刷题学习小&#x1f34a;序&#xff0c;提供一套以【搭建题库-组建小组-刷题练习-在线考试】为中心的完整服务…

WPF在MVVM模式下怎么实现导航功能

在mvvm的模式下wpf通过frame实现页面跳转_哔哩哔哩_bilibili 视频讲解同步可观看 如下图&#xff0c;我们要实现点击左侧的菜单&#xff0c;在右侧展示不同的页面 实现代码如下&#xff1a; 一、如何从主窗体跳转到页面。 1、在mainwindow.xaml的菜单栏代码里加入如下代码 …

VSCode中python插件安装后无法调试

问题 VSCode中python插件安装后无法调试&#xff0c;如下&#xff0c;点击调试&#xff0c;VScode中不报错&#xff0c;也没有调试 解决方法 1、查看配置 打开所在路径 2、拷贝 将整个文件夹拷贝到vscode默认路径下 3、问题解决 再次调试&#xff0c;可以正常使用了…

光模块基础知识

1. 光模块的封装 光模块是光收发模块的简称&#xff0c;主要根据不同的外型来区分&#xff0c;而在同一外型中&#xff0c;又有着多种规格&#xff1b;在数据通信领域&#xff0c;最常见的光模块&#xff08;根据外型区分&#xff09;分别是SFF、GBIC、SFP、和XFP、QSFP 、XEN…

【GPTs】MJ Prompt Creator:轻松生成创意Midjourney提示词

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;MJ Prompt Creator主要功能适用场景优点缺点 &#x1f4af; 小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; 任务说明 您是一款为幻灯片工…

uniapp路由与页面跳转详解:API调用与Navigator组件实战

UniApp路由与页面跳转详解&#xff1a;API调用与Navigator组件实战 路由 uniapp页面路由为框架统一管理&#xff0c;开发者需要在page.json里面配置每个路由页面的路径及页面样式。 路由跳转 uniapp有两种页面路由跳转方式&#xff0c;调用API跳转和navigator组件跳转。 调…