概述
结合OCR图片文本识别与Uiautomator2图片点击的方法进行appUI自动化
"""
@author: Kahoku
@date: 2024/01
@function: 结合OCR文字识别AI模型 与Uiautomator2的图片点击方法实现绕过定位元素, 通过文字、图片做APP UI自动化。
@ |- OCR模型: CnOcr; pip install cnocr onnxruntime
|- Uiautomator2 图片点击环境安装如下
|- pip install uiautomator2
|- pip3 install -U "uiautomator2[image]" -i https://pypi.doubanio.com/simple
|- Uiautomator2 图片核心功能
|- device = u2.connect(device_name)
|- 获取图片的坐标位置与匹配的相似度: img_dict = device.image.match(image)
|- 点击图片: self.device.image.click(image, timeout=5.0)
"""
import cv2
import uiautomator2 as u2
from cnocr import CnOcr
from difflib import SequenceMatcher
''' 暂时只支持英文的OCR识别, 中文的OCR识别不稳定 '''
class UiautomatorOCR:
def __init__(self, device_name=None) -> None:
self.device = u2.connect(device_name)
# OCR英文识别模型
self.govee_ocr_en = CnOcr(det_model_name='en_PP-OCRv3_det', rec_model_name='en_PP-OCRv3',context='cpu') # context='cuda:0'
# OCR中文识别模型
# self.govee_ocr_zh = CnOcr(rec_model_name='ch_PP-OCRv3'
def text_similarity(self, a, b):
return SequenceMatcher(None, a, b).ratio()
def show_phone_screen(self,screen, width, height):
cv2.namedWindow('Image', cv2.WINDOW_NORMAL)
# Resize the window
cv2.resizeWindow('Image', width, height)
cv2.imshow('Image', screen)
if (cv2.waitKey(1) & 0xFF) == 27: # Check for "ESC" key
cv2.destroyAllWindows()
def text_click(self, text):
""" 文本点击 """
def _get_text_position_ocr(text, image):
ocr_results = self.govee_ocr_en.ocr(image)
for ocr_result in ocr_results:
if ocr_result["text"] == text:
top_left = [int(x) for x in tuple(ocr_result["position"][0])]
bottom_right = [int(x) for x in tuple(ocr_result["position"][2])]
x = (top_left[0] + bottom_right[0]) / 2
y = (top_left[1] + bottom_right[1]) / 2
return x, y
image = self.get_phone_screenshot()
x, y = _get_text_position_ocr(text, image)
self.device.click(x, y)
def image_click(self, image):
""" Icon 图片点击 """
self.device.image.click(image, timeout=5.0)
def get_phone_screenshot(self):
return self.device.screenshot(format='opencv')
if __name__ == "__main__":
d = UiautomatorOCR()
text = "Hello" # 手机屏幕出现的内容
d.text_click(text) # 点击手机屏幕上的文字