连接app的封装方法

monkeyDragon / 2023-06-23 / 原文

import psutil
from pywinauto.application import Application
from pywinauto import Desktop, WindowSpecification


class ConnApp:

    @staticmethod
    def conn_single_proc_app(proc_name: str, proc_path: str, app_backend: str = "win32",
                             wait_time: int | float | None = None,
                             retry_freq: int | float | None = None) -> Application:
        """
        连接单进程应用
        :param proc_name: 进程名
        :param proc_path: 进程路径
        :param app_backend: 应用后端
        :param wait_time: 等待时间
        :param retry_freq: 重试频率
        :return: 应用
        """
        # 获取进程id
        proc_id = None
        for proc in psutil.process_iter():
            if proc.name() == proc_name:
                proc_id = proc.pid
                break

        app = Application(backend=app_backend)

        # 连接应用
        if proc_id is None:
            app.start(cmd_line=proc_path, timeout=wait_time, retry_interval=retry_freq)
        else:
            app.connect(process=proc_id, timeout=wait_time, retry_interval=retry_freq)

        return app

    @staticmethod
    def conn_multi_proc_app(app_backend: str = "win32", **kwargs) -> WindowSpecification:
        """
        连接多进程应用
        :param app_backend: 应用后端
        :param kwargs: 匹配对话框的参数,例如dlg_title、dlg_title_re
        :return: 对话框
        """
        desktop = Desktop(backend=app_backend)

        # 获取对话框
        dlg = None
        if kwargs.get("dlg_title", None):
            dlg = desktop.window(title=kwargs["dlg_title"])
        elif kwargs.get("dlg_title_re", None):
            dlg = desktop.window(title_re=kwargs["dlg_title_re"])

        return dlg