使用Python RPA构建与桌面系统交互的机器人

4,407次阅读
没有评论

共计 10388 个字符,预计需要花费 26 分钟才能阅读完成。

你可能已经了解了一些工具和框架,可以帮助你构建与 Web 系统交互的自动化。但是,当涉及到桌面系统时,你该怎么做呢?我来向你展示如何使用 BotCity 的开源框架,在 Python RPA 中构建自动化,它具有多种功能。

准备开发环境

  • 在 BotCity 平台上创建您的免费账户;

  • 按照预先要求和 BotCity Studio SDK 安装指南的步骤跟踪安装过程;

  • 安装 Sicalc(如果您想要使用相同的示例程序来跟随本教程)。

  • 适用于离线操作的 Sicalc 桌面程序不会生成有效的发票;

  • Sicalc 适用于 Windows 操作系统,但整个流程和框架的使用也可以应用于 Linux 和 MacOS 发行版;

  • 第一次打开 Sicalc 时,将要求输入一个城市代码。在我们的例子中,我们将输入 7107 代表圣保罗,但也可以是其他城市代码。

开始开发我们的机器人的第一步

从 Botity 模板创建项目

在您的计算机终端中,在您想要创建项目的文件夹中,执行以下命令来安装 cookiecutter 包(因为提供的模板是基于它创建的)。

要安装 cookiecutter 包,请执行以下命令:

python -m pip install --upgrade cookiecutter

为了使用该模板创建项目,我们将调用 cookiecutter,并将 BotCity 模板的存储库 URL 作为参数提供:

python -m cookiecutter https://github.com/botcity-dev/bot-python-template/archive/v2.zip

在执行此命令期间,您需要提供两个信息:

  • project_type:指的是您要创建的项目类型。模板将提供一些选项,但在这种情况下,我们将选择 1,因为我们要构建一个桌面机器人;

  • bot_id:指的是您要为项目设置的标识。在这个例子中,我们将其命名为 bot-sicalc。

完成上述过程后,将会出现一个名为 bot-sicalc 的新文件夹。您可以阅读文档中的指南,了解一些关于结构和功能的更多信息。

安装项目的依赖项

通常,开发项目可能有一些依赖项,如使用的框架、重要的软件包等。我们的项目也有依赖项,您可以在 requirements.txt 文件中找到它们。您会注意到至少有这两个依赖项:

botcity-framework-core 是一个用于开发自动化的框架。botcity-maestro-sdk 是用于自动化编排的 BotCity Maestro 的 API。

在运行您的项目之前,很重要的一步是安装依赖项。为此,请执行以下命令:

pip install --upgrade -r requirements.txt

第一次执行我们的机器人

如果您打开 bot.py 文件,您会发现已经有一些预先编写的代码和一些注释,其中包含了有关如何进行下一步的重要指导。

了解代码在做什么

请找出以下带有以下命令的行。它们在导入我们在 requirements.txt 文件中提到的库,以便您可以在代码中使用它们。

from botcity.core import DesktopBot
from botcity.maestro import *

在下面的行中,我们正在为机器人创建一个使用 Desktop 框架的对象,并要求它在 BotCity 网站上打开一个浏览器。

bot = DesktopBot()
bot.browse("http://www.botcity.dev")

运行机器人

要看机器人执行,请使用您使用的 IDE 或以下命令行:

python bot.py

成功了吗?您的计算机上的浏览器是否打开了 BotCity 网站?以下是预期执行后的结果示例:

一个有趣的建议是你测试一下发生的事情是否符合预期。尝试逐步进行测试,以便你能够理解正在发生的事情。这也会帮助你更好地理解并处理任何可能出现的错误。

一个有趣的建议是你测试一下发生的事情是否符合预期。尝试逐步进行测试,以便你能够理解正在发生的事情。这也会帮助你更好地理解并处理任何可能出现的错误。

如果第一次尝试没有成功,不要担心。

当你第一次开发或学习一些全新的东西时,经历一些错误是很正常的。我邀请你阅读这篇文章,了解一些可能发生的错误,并鼓励你分享你遇到的错误以及如何解决它们。

如果你在开发中遇到其他困难,请随时进入我们的论坛或 Slack 社区寻求帮助和解答你的疑问。

开发桌面机器人

在这个开发过程中,我们将使用 BotCity Studio,并借助计算机视觉来帮助我们对系统屏幕上的元素进行映射,以便我们的机器人能够与其互动。

在 BotCity Studio 中加载 BotSicalc 项目

保持你的集成开发环境(IDE)打开,并同时打开 BotCity Studio。在顶部菜单中,选择“File”,然后选择“Load Project”。

在 BotCity Studio 中加载 BotSicalc 项目

打开 一个新的窗口,在该窗口中,您需要点击“浏览”并找到您的项目文件夹的位置。

打开一个新的窗口,在该窗口中,您需要点击“浏览”并找到您的项目文件夹的位置。

接下来,找到扩展名为.botproj 的文件。选择这个文件以便 BotCity Studio 加载您的项目。在这个例子中,文件名将是“bot-sicalc.botproj”。然后,点击“打开”,然后点击“启动”。现在,您的项目已经成功加载到 BotCity Studio 中。

继续开发

在接下来的步骤中,我们将保持两个工具的打开状态,您的集成开发环境(IDE)和 BotCity Studio,以便在两个平台上同步代码。

到目前为止,我们只保留了以下代码在我的 “bot.py” 文件中。请注意,我们删除了 bot.browse(“http://www.botcity.dev”) 这行代码,因为它不再需要。

# 导入 Desktop Bot
from botcity.core import DesktopBot

# 导入与 BotCity Maestro SDK 集成需要的库
from botcity.maestro import *

# 若未连接到 Maestro SDK,则禁用错误报告
BotMaestroSDK.RAISE_NOT_CONNECTED = False

def main():

    bot = DesktopBot()


def not_found(label):
    print(f"Element not found: {label}")

if __name__ == '__main__':
    main()

保存这段代码到我的 IDE 中,在再次点击 BotCity Studio 时,您会注意到它也已经更新。

在 bot = DesktopBot()这行的下面,我们要加入 execute 命令,让机器人打开 Sicalc,代码如下:

bot.execute(r"C:Program Files (x86)Programas RFBSicalc Auto AtendimentoSicalcAA.exe")

一个有趣的建议是测试一下发生的情况是否符合预期。

例如,现在我们可以保存代码并通过 IDE 运行机器人来验证命令是否实际起作用。

尝试逐步进行测试,以便更好地理解发生的情况。这也会在发生错误时更容易理解。

如果这个步骤成功,机器人将会执行,并且 Sicalc 会显示在这个屏幕上:

例如,现在我们可以保存代码并通过 IDE 运行机器人来验证命令是否实际起作用。尝试逐步进行测试,以便更好地理解发生的情况。这也会在发生错误时更容易理解。

💡 在继续之前,请确保将光标放在机器人在 BotCity Studio 中打开 Sicalc 的代码行的下方。这是因为它将开始为您的项目生成代码。代码将添加到光标所在的位置。

识别主屏弹出窗口

当我们第一次运行 Sicalc 应用程序时,会弹出一个包含警告的弹出窗口。我们的任务是识别这个窗口并立即关闭它。

我们将使用的策略是搜索一个锚点,并对“继续”按钮进行相对点击。

在 BotCity Studio 中,我们将光标定位在生成代码的那一行。

在 UI 选项卡中,我们点击要识别的元素附近,工具将放大以便我们选择元素。我们使用鼠标进行选择,点击并拖动以此方式进行选择:

识别主屏弹出窗口

💡 如果缩放不适合您进行所需的选择,只需在键盘上按下 Esc 键,然后再次点击元素附近即可重新选择。

在选择后,我们将填写 Name 字段为值 ”popup-esclarecimento” 和 Action 字段为值 ”Click_relative”。”mode” 字段应保持选择了 ”Image” 选项。然后,我们点击提交按钮。

在选择后,我们将填写 Name 字段为值"popup-esclarecimento"和 Action 字段为值"Click_relative"。"mode"字段应保持选择了"Image"选项。然后,我们点击提交按钮。

点击 ” 提交 ” 后,当你拖动鼠标时,你会发现有一条红线随着移动。我们需要告诉 BotCity Studio 点击的相对位置。在这种情况下,位置是 ” 继续 ” 按钮。所以我们将鼠标光标拖动到该按钮上并点击它。

完成这个步骤后,BotCity Studio 将生成以下代码段:

# 打开 SiCalc 应用程序
bot.execute(path_sicalc)

if not bot.find("popup-esclarecimento", matching=0.97, waiting_time=10000):
    not_found("popup-esclarecimento")
bot.click_relative(195, 211)

记得在 BotCity Studio 中保存代码,可以使用快捷键 ”ctrl + s”。这将使您的 IDE 与生成的新代码同步更新。

在通过 IDE 再次运行此代码后,在打开 Sicalc 应用程序之后,机器人将对上面选择的元素执行相对点击操作。从那时起,我们可以继续填写 DARF 的过程。

选择菜单选项

在 Sicalc 应用程序中,我们需要访问菜单的“功能”选项,然后选择“填写 DARF”选项。然后,我们需要对 Sicalc 屏幕进行新的截图,在 BotCity Studio 中,我们可以剪切这些元素。

我们先从“功能”项目开始。对于此选项,我们将命名为 ”funcoes”,动作 (action) 将为点击 (click)。模式(mode) 选项应保持为图片(image)。

在 Sicalc 应用程序中,我们需要访问菜单的“功能”选项,然后选择“填写 DARF”选项。然后,我们需要对 Sicalc 屏幕进行新的截图,在 BotCity Studio 中,我们可以剪切这些元素

在“功能”子菜单选项打开的情况下,让我们进行新的截图,以便我们可以选择并执行“填写 DARF”选项的点击操作,将其命名为 ”preenchimento-darf”。

在“功能”子菜单选项打开的情况下,让我们进行新的截图,以便我们可以选择并执行“填写 DARF”选项的点击操作,将其命名为"preenchimento-darf"。

BotCity Studio 生成的代码将类似于以下代码:

if not bot.find("funcoes", matching=0.97, waiting_time=10000):
    not_found("funcoes")
bot.click()

if not bot.find("preenchimento-darf", matching=0.97, waiting_time=10000):
    not_found("preenchimento-darf")
bot.click()

填写初始表单

在前面的步骤之后,将打开一个初始表单,我们只需要填写税收代码。

再次,让我们对更新后的屏幕进行新的截图,以便我们可以在 BotCity Studio 中选择正确的元素。

在这种情况下,我们将找到税收代码输入框的锚点,并在其前面执行相对点击操作,以便进行填写:

填写初始表单

在找到并点击与该元素相关的字段后,我们使用 paste()命令插入我们的数据。然后,我们将使用 tab()命令跳转到下一个表单。

您可以直接在 BotCity Studio 中添加包含 paste()和 tab()命令的代码,并保存以更新到您的 IDE 中,或者直接通过 IDE 添加。只需记住同时保存代码以确保两个工具都得到更新。

下面是示例代码的一部分:

if not bot.find("codigo-receita", matching=0.97, waiting_time=10000):
    not_found("codigo-receita")
bot.click_relative(128, 10)

# Inserindo no campo um código fictício
bot.paste("5629")

# Tecla "tab" avança para o próximo formulário
bot.tab()

填写 DARF 的数据

在执行上述代码后,将打开第二个表单。在这个表单中,我们需要填入 DARF 的其他数据。此时,屏幕将类似于以下内容:

执行上述代码后,将打开第二个表单

请根据实际情况进行适当的调整,并使用实际的截图文件名和数据来选择和填写相关字段。

更新 BotCity Studio 中的屏幕截图后,我们需要找到与计算期间(PA 字段)和文件金额(以巴西货币表示的字段)相关的元素,并在其各自的字段上执行相对点击操作:

更新 BotCity Studio 中的屏幕截图后,我们需要找到与计算期间(PA 字段)和文件金额(以巴西货币表示的字段)相关的元素,并在其各自的字段上执行相对点击操作

更新 BotCity Studio 中的屏幕截图后,我们需要找到与计算期间(PA 字段)和文件金额(以巴西货币表示的字段)相关的元素,并在其各自的字段上执行相对点击操作

同样地,我们将使用框架的 paste()命令来帮助我们在当前正在填写的字段中输入数值。请注意,在这个阶段,代码将如下所示:

if not bot.find("periodo-apuracao", matching=0.97, waiting_time=10000):
    not_found("periodo-apuracao")
bot.click_relative(15, 25)
# Inserindo PA
bot.paste("310120")

if not bot.find("valor", matching=0.97, waiting_time=10000):
    not_found("valor")
bot.click_relative(17, 27)
# Inserindo valor
bot.paste("10000")

下一步是点击 ” 计算 ” 按钮,以便我们可以进入最终的表单。有两种方法可以完成这一步骤。首先,我们可以添加 enter()命令,因为在填写字段后按下回车键会触发 ” 计算 ” 按钮。

bot.enter()

另一种方法是通过计算机视觉和 BotCity Studio 的支持来解决。然后,我们进行新的截图,选择 ” 计算 ” 按钮,并指定动作为点击(click)。

请根据实际情况进行适当的调整,并使用实际的截图文件名来选择和点击 ” 计算 ” 按钮。

请根据实际情况进行适当的调整,并使用实际的截图文件名来选择和点击" 计算 "按钮。

if not bot.find("calcular", matching=0.97, waiting_time=10000):
    not_found("calcular")
bot.click()

填写最终表单内容

在计算过程完成后,我们需要访问最终的表单。为此,我们将点击 ”DARF” 按钮:

请根据实际情况进行适当的调整,并使用实际的截图文件名来选择和点击 ”DARF” 按钮。

填写最终表单内容

if not bot.find("botao-darf", matching=0.97, waiting_time=10000):
    not_found("botao-darf")
bot.click()

在打开最终表单后,让我们更新 BotCity Studio 中的屏幕截图,以便我们可以选择最后几个元素:

在打开最终表单后,让我们更新 BotCity Studio 中的屏幕截图,以便我们可以选择最后几个元素:

在这个阶段,我们将继续使用与之前步骤相同的策略,找到锚点并在需要填写的字段上进行相对点击操作。

我们需要在最后一个表单中填写以下数据:

姓名:Petrobras

电话:1199991234

CNPJ:33000167000101

参考:0

根据已经映射的所有锚点,生成的代码将类似于以下内容

if not bot.find("nome", matching=0.97, waiting_time=10000):
    not_found("nome")
bot.click_relative(0, 24)

# 在字段中插入姓名
bot.paste("Petrobras")

if not bot.find("telefone", matching=0.97, waiting_time=10000):
    not_found("telefone")
bot.click_relative(1, 27)

# 在字段中插入电话
bot.paste("1199991234")
if not bot.find("cnpj", matching=0.97, waiting_time=10000):
    not_found("cnpj")
bot.click_relative(123, 9)
# 在字段中插入 CNPJ
bot.paste("33000167000101")
if not bot.find("referencia", matching=0.97, waiting_time=10000):
    not_found("referencia")
bot.click_relative(121, 8)
# 在字段中插入参考信息
bot.paste("0")

保存文件

最后一步是保存生成的 DARF 文件。在显示最后一个表单的屏幕上,填写完数据后,我们将点击 ”Imprimir” 按钮:

点击"Imprimir"按钮:

if not bot.find("imprimir", matching=0.97, waiting_time=10000):
    not_found("imprimir")
bot.click()

点击按钮后,如果没有直接配置打印机,则将打开 Windows 文件管理器窗口。

为了模拟这一行为,你可以使用以下代码:

点击按钮后,如果没有直接配置打印机,则将打开 Windows 文件管理器窗口。

在这种情况下,我们可以找到并点击窗口的引用,使其获得焦点:

在这种情况下,我们可以找到并点击窗口的引用,使其获得焦点:

在这之后,我们可以使用 paste()来指定文件路径,并使用 enter()来保存文件。以下是代码示例:

if not bot.find("janela-salvar", matching=0.97, waiting_time=10000):
    not_found("janela-salvar")
bot.click()

# Inserindo o caminho do arquivo
bot.paste(r"C:UsersusernameDocumentsDARF.pdf")
bot.enter()

完成保存文件后,我们的流程就结束了!

可以使用 wait()命令等待 2 秒钟,以确保文件已保存,然后使用 alt_f4()命令关闭表单和 Sicalc 窗口。

def main():
    bot = DesktopBot()

    # Implement here your logic...
    # Caminho onde está o executável SiCalc
    path_sicalc = r"C:Program Files (x86)Programas RFBSicalc Auto AtendimentoSicalcAA.exe"

    # Abre o aplicativo do SiCalc
    bot.execute(path_sicalc)

    if not bot.find("popup-esclarecimento", matching=0.97, waiting_time=10000):
        not_found("popup-esclarecimento")
    bot.click_relative(195, 211)

    if not bot.find("funcoes", matching=0.97, waiting_time=10000):
        not_found("funcoes")
    bot.click()

    if not bot.find("preenchimento-darf", matching=0.97, waiting_time=10000):
        not_found("preenchimento-darf")
    bot.click()

    if not bot.find("codigo-receita", matching=0.97, waiting_time=10000):
        not_found("codigo-receita")
    bot.click_relative(128, 10)

    # Inserindo no campo um código fictício
    bot.paste("5629")

    # Tecla "tab" avança para o próximo formulário
    bot.tab()

    if not bot.find("periodo-apuracao", matching=0.97, waiting_time=10000):
        not_found("periodo-apuracao")
    bot.click_relative(15, 25)
    # Inserindo PA
    bot.paste("310120")

    if not bot.find("valor", matching=0.97, waiting_time=10000):
        not_found("valor")
    bot.click_relative(17, 27)
    # Inserindo valor
    bot.paste("10000")

    if not bot.find("calcular", matching=0.97, waiting_time=10000):
        not_found("calcular")
    bot.click()

    if not bot.find("botao-darf", matching=0.97, waiting_time=10000):
        not_found("botao-darf")
    bot.click()

    if not bot.find("nome", matching=0.97, waiting_time=10000):
        not_found("nome")
    bot.click_relative(0, 24)
    # Inserindo nome
    bot.paste("Petrobras")

    if not bot.find("telefone", matching=0.97, waiting_time=10000):
        not_found("telefone")
    bot.click_relative(1, 27)
    # Inserindo telefone
    bot.paste("1199991234")

    if not bot.find("cnpj", matching=0.97, waiting_time=10000):
        not_found("cnpj")
    bot.click_relative(123, 9)
    # Inserindo CNPJ
    bot.paste("33000167000101")

    if not bot.find("referencia", matching=0.97, waiting_time=10000):
        not_found("referencia")
    bot.click_relative(121, 8)
    # Inserindo referência
    bot.paste("0")

    if not bot.find("imprimir", matching=0.97, waiting_time=10000):
        not_found("imprimir")
    bot.click()

    if not bot.find("janela-salvar", matching=0.97, waiting_time=10000):
        not_found("janela-salvar")
    bot.click()

    # Inserindo path do arquivo
    bot.paste(r"C:UsersusernameDocumentsDARF.pdf")
    bot.enter()

    # Aguarda 2 segundos
    bot.wait(2000)

    # Fechando janela do formulário
    bot.alt_f4()

    # Fechando app do SiCalc
    bot.alt_f4()

def not_found(label):
    print(f"Element not found: {label}")

if __name__ == '__main__':
    main()

当然可以!桌面框架提供了多种命令,您可以探索和利用这些命令来构建桌面自动化。您可以在以下链接中查看完整的文档:BotCity 桌面框架文档(https://documentation.botcity.dev/pt/frameworks/desktop/)

在构建完自己的自动化流程后,为何不与社区分享您所学到的知识以及构建的机器人呢?只需将其分享给社区的机器人存储库即可。

文章来源地址 https://www.toymoban.com/diary/share/325.html

其他相关:

什么是 RPA?

了解代码、无代码和低代码自动化

聊天机器人、机器人和 RPA:它们有什么区别?

如何使用 GitHub Actions 来保持您的 Python RPA 项目更新

Hello World 的挑战:使用 BotCity 制作我的第一个 Python RPA 机器人

为什么在你的 RPA 项目中使用 Python?

使用 Python RPA 构建与桌面系统交互的机器人

到此这篇关于使用 Python RPA 构建与桌面系统交互的机器人的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计10388字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)