在自動化測試中,處理驗證碼往往是一個挑戰,尤其是圖形驗證碼。每次重新整理生成的驗證碼內容各不相同。獲取驗證碼的方法通常有兩種:
獲取驗證碼圖片連結:例如 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('登入失敗,驗證碼可能輸入錯誤。')