程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

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

hfteth 2025-03-14 17:25:45 技术文章 18 ℃

引言

在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)

总结

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

最近发表
标签列表