robocorp-windows 从路径中带有空格的可执行文件中查找窗口

问题描述 投票:0回答:1

我想构建一个 RPA 来自动化不同 Windows 计算机中的一些任务。我一直在寻找在 Python 中执行此操作的框架或库,并且 robocorp-windows 似乎比其他选项更强大(我见过用 PyAutoGUI 编写的 RPA,但我不想依赖图像匹配来查找元素)。

我想要自动化的任务需要打开其他可执行文件。由于我不熟悉这个库,我正在编写一些测试来熟悉它:

from robocorp import windows
from robocorp.windows import WindowElement

import logging
from sys import stdout

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
console_handler = logging.StreamHandler(stdout)
formatter = logging.Formatter(
    "\033[95m%(levelname)s\033[0m[%(lineno)s - %(funcName)s] %(message)s"
)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)


def execute(executable: str) -> WindowElement:
    """
    Execute a program and retrieve its window element
    """
    desktop = windows.desktop()
    logger.debug(f"opening {executable}...")
    desktop.windows_run(executable)

    logger.debug(f"searching for window with executable:{executable}")
    return windows.find_window(f"executable:{executable.replace(' ', '%20')}")


program_x = "C:\\Users\\me\\AppData\\Local\\Programs\\Launcher\\Launcher.exe"
firefox = "C:\\Users\\me\\AppData\\Local\\Mozilla Firefox\\firefox.exe"


program_x_window = execute(program_x)
firefox_window = execute(firefox)

问题

我希望这段代码能够打开两个程序并将它们各自的窗口存储在变量中以供以后操作。但是,程序无法找到 Firefox 的句柄,因为路径包含空格(如果未替换空格,它将改为搜索定位器

name:"Firefox\firefox.exe"
)。

python python-3.x
1个回答
0
投票

解决方案是简单地将定位器用双引号引起来。而不是以下内容:

def execute(executable: str) -> WindowElement:
    """
    Execute a program and retrieve its window element
    """
    desktop = windows.desktop()
    logger.debug(f"opening {executable}...")
    desktop.windows_run(executable)

    logger.debug(f"searching for window with executable:{executable}")
    return windows.find_window(f"executable:{executable.replace(' ', '%20')}")

这解决了问题:

def execute(executable: str) -> WindowElement:
    """
    Execute a given executable and retrieve the generated window element
    """
    desktop = windows.desktop()
    logger.debug(f"opening {executable}...")
    desktop.windows_run(executable)

    logger.debug(f"searching for window with executable:{executable}")
    return windows.find_window(f'executable:"{executable}"') # note the double quotes wrapping the executable variable
© www.soinside.com 2019 - 2024. All rights reserved.