在进行UI自动化测试过程中,有些情况下登录可能需要进行验证码验证
自动化测试中图片验证码是一个很常见的问题,解决的方法也有很多,比如:
- 使用OCR识别的技术,对验证码的图片进行字符识别
- 让开发提供一个万能验证码,只要输入万能验证码就能通过,或者测试服去掉图片验证码的验证
- 让开发人员提供一个测试接口,或者自己写一个,通过这个接口可以获取到图片验证码
- 还有其它等等·····················
我这边用的是通过获取Redis缓存验证码,来解决UI自动化登录需验证码的问题
- 安装Redis库
- 安装完成后,先试试是否能成功连接Redis获取验证码
# coding=utf-8
from redis import StrictRedis
# 这里我用的StrictRedis()方法进行连接,网上看别人还有只用用redis()方法,我这里报错
# host:IP,port:端口号,db:0, password:密码
redisPool = StrictRedis(
host = 'xxxxxxx',
port = xxxx,
db = 0,
password = 'xxxx')
# 连接OK后,获取对应键的值,我们内部键的格式是'XXXX:XXX',我需要获取它对应的值
# 然后打印键对应的值,也就是我们的验证码
code = redisPool.get('XXXX:XXX')
print(code)
然后直接写成方法,登录时调用即可
# coding=utf-8
from redis import StrictRedis
from Utils.YamlUtil import write_yaml
def redisCode(account):
"""
:param account:对应键的值
:return:获取Redis的验证码
"""
# host:IP,port:端口号,db:0, password:密码
redisPool = StrictRedis(
host = 'xxxxxxxxx',
port = xxxx,
db = 0,
password='xxxx')
get_code = redisPool.get(account).decode('UTF-8')
if get_code == "None":
print("验证码失败")
else:
# print(get_code)
code_value = {
"VerificationCode": get_code
}
write_yaml('../Data/GetValue/VerificationCode.yaml', code_value)
进行登录时,直接获取yaml文件写入的验证码
# 登录页面操作
def login(self, username, password):
# 访问url
self.open(self.url)
time.sleep(0.5)
# 输入账号
self.find_element(*self.username_loc).send_keys(username)
# 输入密码
self.find_element(*self.password_loc).send_keys(password)
# 获取对应键的值,格式是'xxxx:xxx'
account = 'xxxx:xxx'
redisCode(account)
code = read_yaml("../Data/GetValue/VerificationCode.yaml")['VerificationCode']
# 输入获取的code
self.find_element(*self.code_loc).send_keys(code)
time.sleep(0.5)
# 点击登录
self.find_element(*self.login_loc).click()
if __name__ == '__main__':
lp = LoginPage(DriverUtil.getWebDriver())
lp.login('woke', '123456')
以上是Web自动化测试中解决图片验证码的方法,方法本身都有一定优缺点和局限性,至于采取何种方式则需要结果具体的项目情况和需求进行考虑~