Python-DdddOcr的简单使用

前言:

  我们在做WEB端UI自动化时,会遇到图片验证码校验的登录方式。

  我在之前的文章也做过介绍:

  https://www.cnblogs.com/TSmagic/p/16082799.html (Pillow + pytesseract + tesseract-ocr 破解简单的图形验证码)

  https://www.cnblogs.com/TSmagic/p/16117861.html(Python + 超级鹰 识别图形验证码)

  今天来介绍一个开源的OCR通用验证码离线本地识别库DdddOcr

 

一、简介

都在这:https://github.com/sml2h3/ddddocr

 

二、使用

1、测试页面

 

2、代码

# coding: utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import tempfile, os
import ddddocr

URL = "${URL}"                     # 登录页 URL
XPATH_USERNAME = "${username}"     # 账号输入框 XPath
XPATH_PASSWORD = "${password}"     # 密码输入框 XPath
XPATH_CODE     = "${code}"         # 验证码输入框 XPath
ID_CAPTCHA_IMG = "${img}"          # 验证码图片元素 ID
CSS_LOGIN_BTN  = "${login}"        # 登录按钮 CSS 选择器
ACCOUNT = "${lit}"                 # 账号
PASSWORD = "${lit888}"             # 密码

def login():
    options = webdriver.ChromeOptions()
    # options.add_argument("--headless=new")  # 如需无头模式可开启
    driver = webdriver.Chrome(options=options)
    wait = WebDriverWait(driver, 10)

    try:
        driver.maximize_window()
        driver.get(URL)

        wait.until(EC.visibility_of_element_located((By.XPATH, XPATH_USERNAME))).send_keys(ACCOUNT)
        wait.until(EC.visibility_of_element_located((By.XPATH, XPATH_PASSWORD))).send_keys(PASSWORD)

        # 保存验证码到临时文件
        with tempfile.NamedTemporaryFile(delete=False, suffix=".png") as tmp:
            img_path = tmp.name
        wait.until(EC.presence_of_element_located((By.ID, ID_CAPTCHA_IMG))).screenshot(img_path)

        ocr = ddddocr.DdddOcr(show_ad=False)
        with open(img_path, "rb") as f:
            img_bytes = f.read()
        result = ocr.classification(img_bytes)
        print("识别结果:", result)

        wait.until(EC.visibility_of_element_located((By.XPATH, XPATH_CODE))).send_keys(result)

        wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, CSS_LOGIN_BTN))).click()

        # 可在此添加登录成功标识的显式等待
        # wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "...成功标识...")))
    except TimeoutException as e:
        print(f"超时:{e}")
    finally:
        if os.path.exists(img_path):
            os.remove(img_path)
        # driver.quit()  # 如需保留浏览器观察,可暂时注释
    return driver  # 如需后续操作可返回 driver

if __name__ == "__main__":
    login()

 

posted @ 2024-12-28 12:26  莲(LIT)  阅读(849)  评论(0)    收藏  举报