java、selenium、图片滑块验证,底部附本地可测试代码
准备
本地Chrome版本对应WebDriver驱动:http://chromedriver.storage.googleapis.com/index.html
maven包
<!-- selenium-->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.9.0</version>
</dependency>
思路
1、获取背景图片元素
WebElement bimg= webDriver.findElement(By.xpath(""));
xpath:f12定位背景图片元素右键copy--->Copy Xpath
截图指定元素将图片下载到本地,这里之所以不通过url获取图片是因为图片大小与图片在页面实际大小可能并不一致,我们需要操作页面所以以页面为准。
File bFile = new File("C:\\Users\\jyk\\Desktop\\bFile.jpg");
FileTool.screenshotsWebElement(bimg, bFile);
/**
* 元素截图
* @param webElement
* @param out
* @throws IOException
*/
public static void screenshotsWebElement(WebElement webElement, File out) throws IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
File screenshotAs = webElement.getScreenshotAs(OutputType.FILE);
//读取文件
fis = new FileInputStream(screenshotAs);
int available = fis.available();
byte[] bytes = new byte[available];
fis.read(bytes);
//输出文件
fos = new FileOutputStream(out);
fos.write(bytes);
fis.close();
fos.close();
}
定义正则,难点之一,需要自己去找规律设置对应的正则
//正则
//101,010
String z1 = "01{54}0";
String z2 = "10{54}1";
//11000011,两端短中间长
String z3 = "1{1,5}0{45,54}1{1,5}";
String z4 = "0{1,5}1{45,54}0{1,5}";
//0000000011100000000,两端长中间短
String z5 = "1{5,}0{1,45}1{5,}";
String z6 = "0{5,}1{1,45}0{5,}";
//01*10
String z7 = "10【0-1】{52}01";
String z8 = "01【0-1】{52}10"; List<String> zs = new ArrayList<>();
zs.add(z1);
zs.add(z2);
zs.add(z3);
zs.add(z4);
zs.add(z5);
zs.add(z6);
zs.add(z7);
zs.add(z8);
List<Pattern> patterns = new ArrayList<>();
for (String z : zs) {
Pattern pattern = Pattern.compile(z);
patterns.add(pattern);
}
解析图片
BufferedImage bgBI = ImageIO.read(bFile);
//获取图片长宽
int minX = bgBI.getMinX();
int maxX = bgBI.getWidth();
int minY = bgBI.getMinY();
int maxY = bgBI.getHeight();
StringBuilder sb = new StringBuilder();
//对每一个像素二值化处理
for (int Y = minY; Y < maxY; Y++) {
for (int X = minX; X < maxX; X++) {
int rgb = bgBI.getRGB(X, Y);
Color col = new Color(rgb, true);
int r = col.getRed();
int g = col.getGreen();
int b = col.getBlue();
int threshold = (r + g + b) / 3;
//颜色范围为0-255,取中为阈值
if (threshold > 125) {
sb.append(0);
} else {
sb.append(1);
}
}
for (Pattern p : patterns) {
int index = 0;
Matcher matcher = p.matcher(sb);
boolean find = matcher.find();
if (find) {
index = matcher.start();
}
if (index > 80) {
Integer count = indexMap.get(index);
if (count != null) {
indexMap.put(index, (count + 1));
} else {
indexMap.put(index, 1);
}
}
}
// System.out.println(sb);
sb.delete(0, sb.length());
}
二值化处理后
2、定位
难点为如何告诉计算机阴影位置。
思路------肉眼之所以能判断出阴影位置是因为阴影位置色差小,并且存在边缘线条,所以通过二值化处理后阴影所在区域必然有大量相似数据,且边缘数据相同y(竖着的1或0)
以下面两个正则为例:通过观察发现存在大量以1、0开头结尾长度为56的数据
通过一行一行正则匹配,阴影所在位置x(横)是不变的,只有y(竖)是变化的,累积x的权重,x为横向所以等于偏移量
String z1 = "01{54}0";
String z2 = "10{54}1";
//代码片段,仅讲解,不可直接复制
//计数
Map<Integer, Integer> indexMap = new HashMap<>();
for (Pattern p : patterns) {
int index = 0;
Matcher matcher = p.matcher(sb);
boolean find = matcher.find();
if (find) {
index = matcher.start();
}
if (index > 80) {
Integer count = indexMap.get(index);
if (count != null) {
indexMap.put(index, (count + 1));
} else {
indexMap.put(index, 1);
}
}
}
int k = 0;
int v = 0;
Iterator<Map.Entry<Integer, Integer>> iterator = indexMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, Integer> next = iterator.next();
if (next.getValue() > v) {
v = next.getValue();
k = next.getKey();
}
}
System.out.println(k);
3、模拟拖拽
//模拟轨迹
//获取滑块元素
WebElement himg= webDriver.findElement(By.xpath(""));
Actions actions = new Actions(webDriver);
actions.clickAndHold(himg);
for (int i = 0; i < 10; i++) {
actions.moveByOffset(k / 10, 0);
Thread.sleep(100);
}
actions.moveByOffset(40, 0);
Thread.sleep(200);
actions.moveByOffset(-40, 0);
Thread.sleep(200);
//这里多出的20是滑块大小需要自行调整
actions.moveByOffset(20, 0);
actions.release(himg).perform();
本地可测试代码
spring boot环境
下载上面的图片,保存到本地进行测试,其它图片可以自己从新定义正则表达式。
联网代码因为每个网站都不一样就不发了,提供思路
1、加载驱动、打开网址
2、点击验证获取背景图片
3、解析图片获取偏移量:主要难点在需要找规律、从而定义正则表达式
4、获取滑块元素,模拟拖拽
@Test
void testimg3() throws IOException {
File bFile = new File("本地图片地址");
//正则
//101,010
String z1 = "0{1}1{54}0";
String z2 = "1{1}0{54}1";
//11000011,两端短中间长
String z3 = "1{1,5}0{45,54}1{1,5}";
String z4 = "0{1,5}1{45,54}0{1,5}";
//0000000011100000000,两端长中间短
String z5 = "1{5,}0{1,45}1{5,}";
String z6 = "0{5,}1{1,45}0{5,}";
//01*10
String z7 = "10【0-1】{52}01";
String z8 = "01【0-1】{52}10";
List<String> zs = new ArrayList<>();
zs.add(z1);
zs.add(z2);
zs.add(z3);
zs.add(z4);
zs.add(z5);
zs.add(z6);
zs.add(z7);
zs.add(z8);
List<Pattern> patterns = new ArrayList<>();
for (String z : zs) {
Pattern pattern = Pattern.compile(z);
patterns.add(pattern);
}
//计数
Map<Integer, Integer> indexMap = new HashMap<>();
//解析图片
BufferedImage bgBI = ImageIO.read(bFile);
int minX = bgBI.getMinX();
int maxX = bgBI.getWidth();
int minY = bgBI.getMinY();
int maxY = bgBI.getHeight();
StringBuilder sb = new StringBuilder();
for (int Y = minY; Y < maxY; Y++) {
for (int X = minX; X < maxX; X++) {
int rgb = bgBI.getRGB(X, Y);
Color col = new Color(rgb, true);
int r = col.getRed();
int g = col.getGreen();
int b = col.getBlue();
//像素平均值
int threshold = (r + g + b) / 3;
//颜色范围0-255,取中为阈值进行二值化
if (threshold > 125) {
sb.append(0);
} else {
sb.append(1);
}
}
//进行正则匹配累计权重
for (Pattern p : patterns) {
int index = 0;
Matcher matcher = p.matcher(sb);
boolean find = matcher.find();
if (find) {
index = matcher.start();
}
//80为滑块大小、排除滑块
if (index > 80) {
Integer count = indexMap.get(index);
if (count != null) {
indexMap.put(index, (count + 1));
} else {
indexMap.put(index, 1);
}
}
}
//输出一行图片像素,复制控制台输出数据到文本,缩小文本观察规律
System.out.println(sb);
sb.delete(0, sb.length());
}
int k = 0;
int v = 0;
Iterator<Map.Entry<Integer, Integer>> iterator = indexMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, Integer> next = iterator.next();
if (next.getValue() > v) {
v = next.getValue();
k = next.getKey();
}
}
//偏移量,可用qq截图判断阴影边缘到左侧边缘距离是否准确
System.out.println(k);
}
java、selenium、图片滑块验证,底部附本地可测试代码的更多相关文章
- 关于selenium实现滑块验证
关于selenium实现滑块验证 python2.7+selenium2实现淘宝滑块自动认证参考链接:https://blog.csdn.net/ldg513783697/article/detail ...
- java selenium爬取验证图片是否加载完成
爬虫任务里发现有部分图片没有加载完成就进行文件流上传,导致有一些图片是空白,需要判断一下: 首选获取image标签元素: WebElement image = driver.findElement(B ...
- Java+Selenium 如何参数化验证Table表格数据
场景: 当我们编写脚本时候,需要验证某个表格某一列数据,或者多个列数据. 如果每验证一个就写一个方法,实在是太费事, 因此我们需要有参数化的思想,把某列数据看成固定的元素,然后去验证即可. 1. 示例 ...
- java多图片上传--前端实现预览--图片压缩 、图片缩放,区域裁剪,水印,旋转,保持比例。
java多图片上传--前端实现预览 前端代码: https://pan.baidu.com/s/1cqKbmjBSXOhFX4HR1XGkyQ 解压后: java后台: <!--文件上传--&g ...
- Java + Selenium + OpenCV解决自动化测试中的滑块验证
最近工作过程中,一个常用的被测网站突然增加了滑块验证环节,导致整个自动化项目失效了. 为了解决这个滑块验证问题,在网上查阅了一些资料后,总结并实现了解决方案,现记录如下. 1.滑块验证思路 被测对象的 ...
- selenium滑块验证
使用selenium模拟登录解决滑块验证问题 本次主要是使用selenium模拟登录网页端的TX新闻,本来最开始是模拟请求的,但是某一天突然发现,部分账号需要经过滑块验证才能正常登录,如果还是模拟 ...
- [Android实例] 拖动滑块进行图片拼合验证方式的实现
该篇文章从eoeAndroid搬迁过来的,原文地址:[Android实例] 拖动滑块进行图片拼合验证方式的实现 现在网站上有各种各样的验证码验证方式,比如计算大小,输入图片内容等,今天在一家网站上看到 ...
- 使用Python + Selenium破解滑块验证码
在前面一篇博客<使用 Python + Selenium 打造浏览器爬虫>中,我介绍了 Selenium 的基本用法和爬虫开发过程中经常使用的一些小技巧,利用这些写出一个浏览器爬虫已经完全 ...
- java+selenium自动化实践
git+java+selenium+testng +maven+idea 1.git之代码维护(下载.分支切换.上传) 下载命令 "git clone git@github.com:Luna ...
随机推荐
- java后端使用token处理表单重复提交
保证接口幂等性,表单重复提交 前台解决方案:提交后按钮禁用.置灰.页面出现遮罩后台解决方案: 使用token,每个token只能使用一次1.在调用接口之前生成对应的Token,存放至redis 2 ...
- centos 安装solr6
1.到solr官网下载.tgz 结尾的文件 2.tar zxvf solr*.tgz 解压文件 3.进入solr的解压目录里的bin目录 执行 ./solr start -force 执行成功后 可访 ...
- springboot项目中的日志输出
#修改默认输出级别,trace < debug < info < warn < errorlogging.level.com.lagou=trace#控制台输出logging. ...
- 遇到过的问题之“解决 No qualifying bean of type 问题”
1.问题 解决 No qualifying bean of type 问题 2.思路: 1 检查是否添加了对应注解 2 检查配置是否正确,扫描包名, 类名及id是否正确 一 . 传统SSM项目 ssm ...
- glusterfs架构和原理
分布式存储已经研究很多年,但直到近年来,伴随着谷歌.亚马逊和阿里等互联网公司云计算和大数据应用的兴起,它才大规模应用到工程实践中.如谷歌的分布式文件系统GFS.分布式表格系统google Bigtab ...
- Linux ftp服务器部署(最简单的ftp教程)
之前在阿里云领了一个ECS服务器(顺便说一句,白嫖的,真香~),就想着做点什么,然后试着做个 ftp 站点,因为第一次尝试,结果走了不少弯路.最后终于完成了,研究了两天(哎~,脑壳笨没办法)就想着记录 ...
- 12_非线性理论基础_Lyapunov直接方法
- USB与电池切换电路图
- 一文读懂充电宝usb接口电路及制作原理详细
转自:http://www.elecfans.com/dianlutu/dianyuandianlu/20180511675801.html USB充电器套件,又名MP3/MP4充电器,输入AC160 ...
- hive从入门到放弃(四)——分区与分桶
今天讲讲分区表和分桶表,前面的文章还没看的可以点击链接: hive从入门到放弃(一)--初识hive hive从入门到放弃(二)--DDL数据定义 hive从入门到放弃(三)--DML数据操作 分区 ...