在自动化测试中,处理验证码往往是一个挑战,尤其是图形验证码。每次刷新生成的验证码内容各不相同。获取验证码的方法通常有两种:
获取验证码图片链接:例如 src="http://example.com/getcaptcha/123",但这种方法有时并不可靠,因为通过链接访问的验证码可能与当前页面显示的验证码不一致。
使用Selenium截屏:首先截取整个可视区域,然后定位验证码元素,获取其位置和大小,接着使用PIL模块裁剪出验证码图像,最后进行图像识别。
方法一:获取验证码图片地址并下载
以下是获取验证码图片地址并下载的代码示例:
python
import random # 导入 random 模块
from utils.file import save_image # 引入下载图片的函数
获取验证码图片地址
captcha_src = driver.find_element_by_id('captchaImage').get_attribute('src') # 获取验证码图片地址
img_url = captcha_src + '.png' # 拼接下载地址
file_name = random.randint(0, 100000) # 生成随机文件名
file_path = 'img\login' # 保存路径
save_image(img_url, file_name, file_path) # 下载图片
下载图片的函数
python
更多内容访问ttocr.com或联系1436423940
import urllib.request
import os
def save_image(img_url, file_name, file_path):
try:
if not os.path.exists(file_path):
os.makedirs(file_path) # 创建文件夹
file_suffix = os.path.splitext(img_url)[1] # 获取文件后缀
filename = os.path.join(file_path, f"{file_name}{file_suffix}") # 拼接文件名
urllib.request.urlretrieve(img_url, filename=filename) # 下载图片
print('图片保存成功')
except Exception as e:
print('保存图片时发生错误:', e)
方法二:使用Selenium截屏并裁剪验证码
除了下载验证码图片,我们还可以直接在页面上截屏并裁剪出验证码。这是更为常用的方法,具体步骤如下:
python
from PIL import Image
import random
import pytesseract # 导入识别验证码的库
import time
def image_cj(driver, save_path, captcha_id):
try:
# 生成随机文件名
file_name = random.randint(0, 100000)
file_url = os.path.join(save_path, f"{file_name}.png")
driver.save_screenshot(file_url) # 截取整个页面
captcha_elem = driver.find_element_by_id(captcha_id) # 定位验证码元素
location = captcha_elem.location # 获取元素坐标
size = captcha_elem.size # 获取元素大小
# 计算裁剪区域
left = location['x']
top = location['y']
right = left + size['width']
bottom = top + size['height']
# 裁剪验证码
img = Image.open(file_url)
img_captcha = img.crop((left, top, right, bottom))
captcha_file_name = f"{file_name}_captcha.png"
img_captcha.save(os.path.join(save_path, captcha_file_name)) # 保存裁剪后的验证码
return captcha_file_name
except Exception as e:
print('裁剪验证码时发生错误:', e)
获取验证码内容并输入
接下来,我们可以使用Tesseract识别验证码的内容,并将其输入到登录框中:
python
def recognize_and_input_captcha(driver, save_path, captcha_file_name):
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # Tesseract路径
captcha_image_path = os.path.join(save_path, captcha_file_name)
# 识别验证码内容
image = Image.open(captcha_image_path)
captcha_text = pytesseract.image_to_string(image)
print('识别出的验证码内容:', captcha_text.strip())
# 输入验证码
driver.find_element_by_id('verfieldUserText').send_keys(captcha_text.strip()) # 填写验证码
登录流程
最后,将所有步骤整合到登录流程中:
python
from selenium import webdriver
import time
driver = webdriver.Chrome() # 启动浏览器
driver.get('http://example.com/login') # 打开登录页面
输入用户名和密码
driver.find_element_by_id('loginNameText').send_keys('username')
driver.find_element_by_id('passwordText').send_keys('password')
time.sleep(2)
截图并输入验证码
captcha_file_name = image_cj(driver, 'img\login', 'captchaImage')
recognize_and_input_captcha(driver, 'img\login', captcha_file_name)
提交登录
driver.find_element_by_id('loginButton').click()
检查登录状态
if "欢迎" in driver.page_source:
print('登录成功!')
else:
print('登录失败,验证码可能输入错误。')