当前位置:首页 > 技术分析 > 正文内容

Selenium:UI自动化过程中验证码解决方案

ruisui884个月前 (03-10)技术分析21

引言

在Selenium UI自动化测试中,图形验证码和短信验证码是一个常见的情况。验证码的主要目的是防止机器自动访问系统,但这也给自动化测试带来了挑战。本文主要从以下几个方面进行阐述,提供一些验证码的解决方案。

人工干预方式

  • 手动输入验证码

在自动化测试过程中,当遇到图形验证码或者手机验证码时,采用sleep()暂停测试脚本的执行,此时,测试人员手动查看图形验证码内容或者手机验证码,并将验证码手动输入到相应的输入框中,然后继续执行测试脚本。

我们还可以采用类似于系统发出提示音的方式,进行验证码的输入。例如,在windows环境下,可以采用winsound.Beep(1500,30000)进行提示,然后手动输入验证码。

#系统提示,手动输入验证码
import time
import winsound

# 发出一个频率为 1500Hz,持续 30 秒的蜂鸣声
winsound.Beep(1500,30000)
 
time.sleep(10)

这两种方法适用于测试频率较低、对测试效率要求不高的场景。其有点是简单直接,不需要复杂的技术手段。缺点是高度依赖人工,效率低下,并且在无人值守的自动化测试场景中无法使用。

代码层面处理

  • 特定环境配置,使用万能验证码

如果是图形验证码的情形,在测试环境中,通过修改服务器端的配置,设置一个万能验证码,这个万能验证码可以绕过图形验证码的验证环节。

# 找到用户名、密码和验证码输入框以及登录按钮
username_input = driver.find_element(By.ID, "username")
password_input = driver.find_element(By.ID, "password")
captcha_input = driver.find_element(By.ID, "captcha")

# 输入用户名、密码和万能验证码
username_input.send_keys("test_user")
password_input.send_keys("test_password")
captcha_input.send_keys("1234")

如果是短信验证码的情况,在测试环节中,使用专门的测试手机号,并将短信验证码固定未一个已知的值。这样在自动化测试过程中,可以直接输入这个固定的验证码来完成验证。

# 找到手机号、密码和验证码输入框
phone_input = driver.find_element(By.ID, "phone")
password_input = driver.find_element(By.ID, "password")
captcha_input = driver.find_element(By.ID, "captcha")

# 输入测试手机号、密码和固定验证码
phone_input.send_keys("138xxxx5678")
password_input.send_keys("test_password")
captcha_input.send_keys("1234")

万能验证码的处理方式只适用于特定的环境(比如测试环境)。优点是实现相对简单,能够有效地绕过验证码,提高测试效率。缺点是需要开发人员配合修改服务端配置,不适用于生产环境操作。如果生产环境配置了万能验证码,会影响系统的安全性。

  • 隐藏验证码功能

此方法类似于设置万能验证码,需要后端开发人员通过修改服务器端的配置,隐藏验证码的验证功能,这样可以绕过证码的验证环节。

  • 利用代码实现

在UI自动化过程中,针对于图形验证码的情况,我们可以采用OCR技术来识别图形验证码中的内容。首先,需要安装OCR第三方库,例如ddddocr库;然后,再自动化测试脚本中,当遇到图形验证码时,使用Selenium获取验证码图片的截图,并将其保存为文档文件;接着,使用OCR库对保存的验证码图片进行识别,将识别的内容提取出来,再输入到验证码输入框中。

import ddddocr

def login(self,username,passwd):
        # 输入用户名
        self.input_text(self.username_input_ele,username)
        # 输入密码
        self.input_text(self.passwd_input_ele,passwd)
        # 图形验证码保存本地
        captcha_image = self.get_element(self.captcha_img_ele)
        captcha_image.screenshot('captcha.jpg')
        # OCR技术识别图形验证码
        ocr = ddddocr.DdddOcr()
        with open('captcha.jpg','rb') as f:
            img_bytes = f.read()
        res = ocr.classification(img_bytes)
        # 输入图形验证码
        self.input_text(self.captcha_input_ele,res)
        # 登录
        self.click_element(self.login_button_ele)

如果是存在手机验证码的情况下,开发人员一般会将短信服务返回的验证码临时存储在redis中,测试人员可以通过Python连接redis,获取对应key的值,然后在验证码输入框中输入。注意,生产环境的配置信息要妥当存储,切勿泄露。

import redis

#redis连接,获取验证码
def get_cache(phone):
    rds = redis.Redis(host=rds_host,port=rds_port,password=rds_passwd,decode_responses=True)
    return rds.get(f'xxxx:captcha:{phone}')

def login(self,username):
      #点击登录/注册按钮
      self.click_element(self.login_button_element)
      #输入用户名
      self.input_text(self.username_input_element,username)
      #点击发送验证码按钮
      self.click_element(self.verify_code_element)
      self.wait_time(1000)
      #通过连接redis,获取验证码
      code = get_cache(username)
      #输入验证码
      self.input_text(self.login_code_element,code)

总结

本文主要通过手工干预和代码处理两种方式阐述了验证码的解决方案,在实际的工作中,我们可以灵活选择方法处理,提高自动化测试效率。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/2680.html

分享给朋友:

“Selenium:UI自动化过程中验证码解决方案” 的相关文章

Linux 最主要的发行分支

Linux 有数百个发行分支。主要的有以下四个。slackwareSlackware 是由 Patrick Volkerding 在 1992 年推出的,它是全球现存最古老的 Linux 发行版。Slackware 被设计为高度可定制和强大的,并且要求用户了解 每个元素,它的包系统是不支持依赖的。...

el-table内容\n换行解决办法

问题请求到的数据带有换行符 '\n'但页面展示时不换行statusRemark: "\"1、按期完成计划且准确率100%,得100分;\n2、各项目每延误1天,扣1分;每失误1次或者员工投诉1次,扣3分,失误层面达到公司级影响较大的,该项绩效分数为0\"\n&...

2024年,不断突破的一年

迈凯伦F1车队不久前拿下了2024年度总冠军,距离上一次还是二十几年前。在此期间,另一领域内,一个充满革新活力的腕表品牌——RICHARD MILLE理查米尔,正不断发展,与F1运动、帆船、古董车展等领域,共享着对速度与极限的无尽向往。RICHARD MILLE的发展与F1车手们在赛道上的卓越表现交...

快来看看重构了 365 天的 vue3.5 这次到底更新了啥

新人求关注?,点击右上角 ↗? 关注,博主日更,全年无休,您的关注是我的最大的更新的动力~ 感谢大家了 就在 9 月 1 号,迭代了一年多的 Vue 3.5 终于发布了,这次发布的代号是 "天元突破 红莲螺岩"。这是一个机器人动画片的名字,相信喜欢看动漫的小伙伴应该很熟悉从更新的 C...

详解编程中的同步和异步

本文主要总结一些自己对异步的理解,话不多说 下面开始。一. 单线程 我们常说“JavaScript是单线程的”,所谓单线程,是指在JS引擎中负责解释和执行JavaScript代码的线程只有一个。不妨叫它主线程 但是实际上还存在其他的线程。例如:处理AJAX请求的线程、处理DOM事件的线程、定时器线程...

一篇文章搞懂同步与异步、阻塞与非阻塞

要想掌握好Java NIO需要涉及了解同步与异步、阻塞与非阻塞,本文通过相关例子让你深入理解其本质@mikechen阻塞阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。举一个例子:当一...