网站首页 > 技术文章 正文
引言
在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)
总结
本文主要通过手工干预和代码处理两种方式阐述了验证码的解决方案,在实际的工作中,我们可以灵活选择方法处理,提高自动化测试效率。
猜你喜欢
- 2025-03-14 「2022 年」崔庆才 Python3 爬虫 - OpenCV图像匹配识别滑动验证码缺口
- 2025-03-14 70个Python练手项目列表,偷偷练习卷死他们,得不到的永远在骚动
- 2025-03-14 使用Python编写手机短信压测脚本(python模拟手机发送短信)
- 2025-03-14 基于python计算缺口滑块验证码所需滑动距离
- 2025-03-14 简单识别验证码,无复杂步骤,不依赖第三方模块
- 2025-03-14 盘点一个Python网络爬虫过验证码的问题
- 2025-03-14 能跑源码,还提供数据集:这里有一个入门企业级验证码识别项目
- 2025-03-14 python爬虫-31-python图形验证码进阶,识别中文(二)
- 2025-03-14 70个超火的Python练手项目(python爬虫 70个python练手项目列表)
- 2025-03-14 OCR通用验证码识别SDK免费开源版ddddocr
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 90℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)