Selenium获取动态图片验证码

本文涉及的产品
企业资质识别,企业资质识别 200次/月
OCR统一识别,每月200次
文档理解,免费额度 各100页
简介: Selenium获取动态图片验证码

关于图片验证码的文章,我想大家都有一定的了解了。


在我们做UI自动化的时候,经常会遇到图片验证码的问题。

13.jpg

image

当开发不给咱们提供万能验证码,或者测试第三方网站比如知乎的时候,我们就需要自己去识别验证码

OCR


OCR是一种图像文字识别的技术,例如图中的验证码,我们用肉眼识别就是c5s3,但机器可不比咱们肉眼。所以我们要利用ocr技术,让我们的Python脚本自动通过图片识别出对应的文字

常见的识别类库


在Python中其实有许多识别类库,这里只介绍博主自己实践过的成功率还不错的: 百度ocr

简单的说,就是百度提供了一个SDK,让我们传入图片数据,从而拿到识别的结果。ocr的细节我们不需要关心。

申请开通OCR


首先我们得有一个百度账号,这个相信大家都有,没有的可以申请一个。

14.jpg

左上角展开->产品服务->文字识别


  • 创建应用

15.jpg

点击创建应用按钮


  • 填写相关应用信息

16.jpg

简单描述下应用是干嘛的就行,因为我们只需要识别文字,所以其他也不用勾上

17.jpg

image

创建好了之后可以看到具体的应用信息,记住这3个关键信息。待会会用到。

  • appid
  • apikey
  • secret key

熟悉OCR文档


官方文档地址: https://cloud.baidu.com/doc/OCR/s/wkibizyjk

文档会写的比较清楚,简单的说就是通过你的appid,api key和secret key获取一个client,接着你就可以调用client的api去获取图片中的文字了。官方的SDK还是比较贴心的。

  • 安装SDK


pip install baidu-aip

讲完了文字怎么识别,接着就来说说标题中的动态图片验证码

动态图片验证码


这个概念是我自己命名的,一般来说,我们的一张图片都是对应唯一一个url的,比如:

https://yuque.com?image=dshqadiau

(这个地址是我编的)

一般来说image字段的值不同,图片也就不同,都是一串随机的或者规律的不重复数据,确保图片不会重复

但是博主最近遇到了这样一种情况:

输入一个url,每次输入,拿到的图片都不一样。

这样就会带来一个很严重的问题,页面上你虽然读取了图片的信息。我们把图片的url传递给百度sdk的时候,url由于再次调用,导致图片发生了变化。

比如网站上显示的是: c5s3,调用百度sdk的时候,百度会通过url读取图片,但再次读取,图片可能变成了lfew

不信大家可以看看这个图片地址:

18.PNG

每次刷新,这个图片都会变,但是url不变

怎么解决呢?


好在百度sdk,他不仅仅支持url,还支持图片文件和base64的图片数据。我们看看官方文档:

19.jpg

所以此时我们用图片的base64数据就行了

再回到Selenium里面,我们怎么才能获取到验证码那张图片呢?

思考一下:

  1. 读取img标签的src,然后下载图片,保存图片文件再转为base64

很显然这个方法行不通,为什么呢?

因为img的src属性就是刚才这个url,你去获取一遍url,它同样会变化。

  1. 截图,裁剪出验证码部分,扔给百度去识别

可行是可行,但是会不会太复杂了??

如果我只对验证码的img元素进行截图,生成base64的数据是不是更方便?

其实呢,selenium作为一款老牌的自动化测试工具,很多方法供大于求了。所以它是有这样的功能的!

Selenium对指定区域截图


我们都知道,selenium有一些截图方法。


driver.get_screenshot_as_file(filename)

但其实,针对元素,也是有截图方法的。

伪代码如下:


# 通过id获取到图片
img = driver.find_element_by_id("image")
# 调用WebElement的screenshot_as_png属性方法,获取到png的数据,因为百度需要png
data = img.screenshot_as_png

接着我们就可以用这个获取到的图片数据去找百度要答案了!

完整版代码:


from aip import AipOcr 
from selenium import webdriver
client = AipOcr("你的appid", "你的app_key", "你的secret_key")
driver = webdriver.Chrome()
driver.get("https://iam.pt.ouchn.cn/am/UI/Login")
img = driver.find_element_by_id("kaptchaImage")
data = img.screenshot_as_png
res = client.basicGeneral(data, {})
print(res)

20.jpg

更多图片识别的配置可以查看度娘文档哦

可以看到,只识别到了CFX,而且图片没有继续变化了。

毕竟文字识别是从图片里面找文字,而且文字会有一些横线这样的干扰,所以如果一次不行,可以多试几次。


思路就是写一个while循环,不断尝试去识别验证码并登录,接着判断是否登录成功,没成功则重复上一个步骤

以我个人的经验,一般1-10次就可以成功。


好了,以上是博主简单替大家尝试一下UI自动化过程中对于验证码的识别。主要重点在于验证码的识别和对部分区域截图。


有兴趣的同学可以联系博主探讨哦。上一篇给点工们的进阶教程好像漏发了一些人,这里补发一下,希望大家都能够取得进步!~




相关文章
|
4月前
|
数据采集 JavaScript 前端开发
深度剖析Selenium与Scrapy的黄金组合:实现动态网页爬虫
深度剖析Selenium与Scrapy的黄金组合:实现动态网页爬虫
|
数据采集 Web App开发 存储
使用 Scrapy + Selenium 爬取动态渲染的页面
使用 Scrapy + Selenium 爬取动态渲染的页面
467 0
使用 Scrapy + Selenium 爬取动态渲染的页面
|
Web App开发 JavaScript 开发者
Python+selenium 自动化-chrome页面静止、冻结技术,获取web动态页面的Xpath方法,查看浏览器动态dom节点
Python+selenium 自动化-chrome页面静止、冻结技术,获取web动态页面的Xpath方法,查看浏览器动态dom节点
509 0
Python+selenium 自动化-chrome页面静止、冻结技术,获取web动态页面的Xpath方法,查看浏览器动态dom节点
|
11天前
|
Web App开发 Java 测试技术
自动化测试的利器:Selenium WebDriver入门与实践
【9月更文挑战第8天】在软件开发的海洋中,测试是确保我们不会溺水的那根救生索。Selenium WebDriver,作为自动化测试的明星工具,让这根救生索更加结实可靠。本文将带你快速上手Selenium WebDriver,从基础设置到实际操作,再到实战演练,让你的开发之旅更加平稳顺畅。
|
5天前
|
敏捷开发 Java 测试技术
探索自动化测试的奥秘:从Selenium到Appium
【9月更文挑战第14天】软件测试,这个看似枯燥乏味却至关重要的领域,正经历着一场革命。随着技术的进步,自动化测试工具如Selenium和Appium已成为质量保证的利器。本文将带你一探这些工具的神秘面纱,了解它们如何简化测试流程、提升效率,并确保软件产品的质量。准备好,我们将深入自动化测试的世界,解锁其背后的原理和实践技巧。
|
6天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:如何用Selenium和Python打造高效测试脚本
【9月更文挑战第13天】在软件开发的海洋中,自动化测试是那抹不可或缺的亮色。它不仅提升了测试效率,还保障了产品质量。本文将带你领略使用Selenium和Python构建自动化测试脚本的魅力所在,从环境的搭建到脚本的编写,再到问题的排查,每一步都是对软件质量把控的深刻理解和实践。让我们开始这段探索之旅,解锁自动化测试的秘密吧!
8 0
|
7天前
|
JavaScript 前端开发 测试技术
Selenium2Library实现基于GUI的测试
Selenium2Library实现基于GUI的测试
15 0
|
20天前
|
Web App开发 Java 测试技术
自动化测试的新篇章:使用Selenium WebDriver进行高效测试
【8月更文挑战第31天】 在软件开发的海洋中,自动化测试犹如一艘航船,带领着质量保证团队驶向效率与精准的彼岸。本文将揭开Selenium WebDriver的神秘面纱,通过实际案例引导您掌握这一强大的自动化测试工具。我们将从Selenium WebDriver的基础概念出发,逐步深入到代码示例,最后探讨其在现实项目中的应用场景和优势,旨在为您的软件测试之旅提供清晰的指南。
|
20天前
|
Web App开发 测试技术 持续交付
探索自动化测试:以Selenium和Python为例
【8月更文挑战第31天】自动化测试在现代软件开发中扮演着不可或缺的角色。本文将通过一个简化的示例,展示如何使用Selenium和Python进行Web应用的自动化测试。我们将从安装必要的工具开始,逐步构建一个简单的测试脚本,并执行它来验证其功能。通过这个过程,我们旨在揭示自动化测试的价值,并激励读者深入探索这一领域。