自動化測試中的驗證碼處理

啊飒飒大苏打發表於2024-11-01

在自動化測試中,處理驗證碼往往是一個挑戰,尤其是圖形驗證碼。每次重新整理生成的驗證碼內容各不相同。獲取驗證碼的方法通常有兩種:

獲取驗證碼圖片連結:例如 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('登入失敗,驗證碼可能輸入錯誤。')

相關文章