• 0
  • 2
分享
  • 在我们做UI自动化的时候,经常会遇到图片验证码的问题——软件测试圈
  • 恬恬圈 2022-08-01 11:45:02 字数 2176 阅读 6983 收藏 2

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

1.png

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

OCR

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

常见的识别类库

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

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

申请开通OCR

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

  • 登录百度控制台

进入https://login.bce.baidu.com/并登录。

  • 选择文字识别

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

2.png

  • 创建应用

点击创建应用按钮

3.png

  • 填写相关应用信息

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

4.png

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

  • appid

  • apikey

  • secretkey

熟悉OCR文档

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

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

  • 安装SDK

pip install baidu-aip

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

动态图片验证码

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

https://yuque.com?image=dshqadiau

(这个地址是我编的)

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

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

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

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

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

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

5.gif

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

怎么解决呢?

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

6.png

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

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

思考一下:

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

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

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

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

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

如果我只对验证码的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

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

完整版代码:

fromaipimportAipOcr
fromseleniumimportwebdriver
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)

7.png

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

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

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

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

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


作者:软件测试木木

原文链接:https://blog.csdn.net/m0_67419887/article/details/123450829

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 在之前的文章和视频中,我分享过Groovy语法中def关键字的基本使用方法。当时对def理解是:不定类型变量,资料中也有说是无类型变量,感觉两个意思大差不差,就是不显式声明对象类型。基本使用方式如下:def a = 1def b = "FunTester"类似这样的方式,当时Java新版也已经支持了var可以替代一些显式声明变量类型的代码,但是除了使用范围上,Groovy的def还是明显优于var,而且功能上也是强不少(当然有人理解为弱不少,后续讲解)。本质区别在于Groovy的def不仅可以替代显式的类型声明,还...
            0 0 926
            分享
          •   应用场景  测试用例一遍一遍的执行,没有新意了,没有Bug了。突然来了一位小白,同样的用例就“逮”着了一只Bug。一回放,原来手误,输入了不同的测试数据,误打误撞。  这也证明了测试数据在测试执行中起到的关键作用。输入的数据不同,得到的结果就不一样。Bug是与你擦肩而过,还是不期而遇呢?有时候还真的就在你手指轻弹、输入数据的一瞬间。  今天的强调无非是想给大家介绍一款好用的API Mock 服务器 工具,以便大家在测试中更加方便地配置自己的动态数据。  温馨提示  如果您要按着示例一起做,请务必配置如下工具。  结尾的用例主要是结合Rest-Assured来介绍Json Serv...
            14 14 1755
            分享
          • 在我们测试过程中,需要把发现的bug纳入系统,并指派给对应的开发人员修改,开发修改完成后更新bug状态,bug回到测试手中,进行验证,验证完毕关闭bug或重新打开bug。在这个过程中就需要借助bug管理工具,目前常用的是tapd软件缺陷管理系统。点开缺陷详情,右侧更多里面有针对这个缺陷的一系列功能,比如重新编辑缺陷,删除缺陷,复制缺陷,移动缺陷,合并缺陷,关联缺陷,转需求,转用例等。常用的是复制,移动和关联缺陷,当提交完bug发现bug对应的项目选错了,这个时候我们可以用移动功能把bug移动到对应的项目中,当发现的问题与之前提交的一个问题比较类似,这个时候就可以用复制功能,把问题的主体复制过去...
            1 1 23234
            分享
          •   对这个问题只想说:裁员不可怕,岗位少也不可怕,可怕的是,软件测试行业已经发生巨变,而你却原地踏步!  经济寒冬放大了软件测试工程师职业危机,也加速推动了行业发展  经济大环境不好,投资和业务盈利预期收紧,企业出于生存本能,会勒紧裤腰带,减员增效,即裁掉多数低端人才,保留或重新招募少数高端人才,让公司的运营成本、人力效率和业务质量达到最佳平衡点。尤其是,前些年互联网热潮红利造成 IT 技术人才平均薪资有溢价水分,企业人力成本高企,也让裁员成为过冬最直接有效的手段。  在软件测试领域,这一现象或许更为明显。为了降低人力成本,企业会更多的使用外包测试服务,而外包市场的发展壮大,又会进一步推动企业...
            0 0 776
            分享
          • 即使测试在工作中已经小心再小心了,但有时还是可能会出现线上问题,真是个悲伤的故事,然而纵然悲伤也需要有个结局,那么项目上线出现bug,测试人员该肿么办呢?首先要做的是重现这个问题并反馈给研发人员,尽快出patch或者解决方案。当BUG解决且上线没有问题之后,我们再看后续的处理。追查原因及处理方法:这个BUG出现的原因是什么。这有分为几种情况:1)测试环境无法重现:可能是线上的环境造成的BUG或者是测试环境无法模拟的情况。解决方法:尽量完善测试方法、尽量模拟测试环境、增加线上测试。2)漏测:a、测试用例裁剪过度:错误预估优先级或者时间过于紧迫裁剪了用例解决方法:在后续版本或者其他项目启动时重新评...
            1 0 2705
            分享
      • 51testing软件测试圈微信