在 Windows 上做 RPA,不必一上来上商业平台。Python 里这三套库通常够用:

  • pyautogui:鼠标键盘、截图、坐标点击
  • pywinauto:按窗口/控件名称操作,比纯坐标稳
  • opencv-python:模板匹配,处理没有控件树的界面

最小示例

import time, logging, pyautogui
from pywinauto.application import Application
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("rpa")
pyautogui.PAUSE = 0.5

class DesktopRPA:
    def __init__(self):
        self.app = None
        self.window = None
    def start(self, path: str) -> bool:
        try:
            self.app = Application(backend="uia").start(path)
            return True
        except Exception as e:
            logger.error("启动失败: %s", e); return False
    def connect(self, title: str, timeout: int = 10) -> bool:
        try:
            self.window = self.app.window(title=title)
            self.window.wait("visible", timeout=timeout)
            return True
        except Exception as e:
            logger.error("连接窗口失败: %s", e); return False
    def click_by_name(self, name: str) -> bool:
        try:
            self.window.child_window(title=name, control_type="Button").click_input()
            return True
        except Exception as e:
            logger.error("点击控件失败: %s", e); return False
    def click_by_image(self, image_path: str, confidence: float = 0.9) -> bool:
        pos = pyautogui.locateCenterOnScreen(image_path, confidence=confidence)
        if not pos: return False
        pyautogui.click(pos); return True

if __name__ == "__main__":
    rpa = DesktopRPA()
    rpa.start(r"C:\Program Files\Your\App.exe")
    time.sleep(2)
    rpa.connect("Your Application Title")
    rpa.click_by_name("确定")

实践建议

  1. 能拿到控件树就优先 pywinauto,少用绝对坐标。
  2. 坐标/图像方案要处理 DPI 缩放与分辨率差异。
  3. 关键步骤加日志和超时,避免 UI 卡顿时死循环。