安装组件
pip install ddddocr
# 如果安装失败,可使用国内使用
pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple
在使用前,将打印内容注释,要不在每次使用时都会打印内容
from playwright.sync_api import Playwright, sync_playwright, expect, TimeoutError
import ddddocr
import time
from datetime import datetime
# 获取当前时间戳和日期字符串
current_timestamp = int(time.time())
datetime_now = datetime.now()
new_time = datetime_now.strftime("%Y-%m-%d")
ocr = ddddocr.DdddOcr(show_ad=False)
URL = "http://172.0.0.1:8081" # 替换访问URL
DEFAULT_TIMEOUT = 2000
class LoginManager:
def __init__(self):
"""初始化登录管理器"""
self.ocr = ddddocr.DdddOcr()
self.timestamp = int(time.time())
self.date_str = datetime.now().strftime("%Y-%m-%d")
def launch_browser(self, playwright):
"""
启动浏览器并创建一个新的页面上下文。
:param playwright: Playwright 实例
:return: 浏览器实例、上下文实例和页面实例
"""
browser = playwright.chromium.launch(headless=False) # 设置 headless=False 以便查看操作过程
context = browser.new_context() # 创建新的浏览器上下文
context.set_default_timeout(DEFAULT_TIMEOUT) # 设置默认超时时间为10秒
page = browser.new_page() # 打开一个新的页面
return browser, context, page
def take_screenshot_and_ocr(self, page, locator, timestamp):
"""
截图并使用 OCR 识别验证码。
:param page: 页面实例
:param locator: 验证码元素的定位器
:param timestamp: 时间戳用于生成唯一的文件名
:return: 识别出的验证码文本
"""
path_img = f"../img/loginMaskLi{timestamp}.png"
page.locator(locator).screenshot(path=path_img) # 截图验证码区域
with open(path_img, 'rb') as f:
img_bytes = f.read()
result = ocr.classification(img_bytes) # 使用 OCR 识别验证码
return result
def login(self, page):
"""
登录系统。
:param page: 页面实例
"""
page.goto(URL + "/asset/#/login") # 导航到登录页面
page.wait_for_timeout(DEFAULT_TIMEOUT)
page.fill("input[formcontrolname='username']", username) # 填写用户名 输入内容
page.fill("input[formcontrolname='password']", password) # 填写密码
for attempt in range(10): # 最多尝试3次
captcha_text = self.take_screenshot_and_ocr(page, '#loginMaskLi', current_timestamp) # 识别验证码
print(f"识别的验证码为: {captcha_text}")
page.fill('input[formcontrolname="code"]', captcha_text) # 输入验证码
备注:
元素根据实际情况更改