共计 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”。
打开 一个新的窗口,在该窗口中,您需要点击“浏览”并找到您的项目文件夹的位置。
接下来,找到扩展名为.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 会显示在这个屏幕上:
💡 在继续之前,请确保将光标放在机器人在 BotCity Studio 中打开 Sicalc 的代码行的下方。这是因为它将开始为您的项目生成代码。代码将添加到光标所在的位置。
识别主屏弹出窗口
当我们第一次运行 Sicalc 应用程序时,会弹出一个包含警告的弹出窗口。我们的任务是识别这个窗口并立即关闭它。
我们将使用的策略是搜索一个锚点,并对“继续”按钮进行相对点击。
在 BotCity Studio 中,我们将光标定位在生成代码的那一行。
在 UI 选项卡中,我们点击要识别的元素附近,工具将放大以便我们选择元素。我们使用鼠标进行选择,点击并拖动以此方式进行选择:
💡 如果缩放不适合您进行所需的选择,只需在键盘上按下 Esc 键,然后再次点击元素附近即可重新选择。
在选择后,我们将填写 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)。
在“功能”子菜单选项打开的情况下,让我们进行新的截图,以便我们可以选择并执行“填写 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 字段)和文件金额(以巴西货币表示的字段)相关的元素,并在其各自的字段上执行相对点击操作:
同样地,我们将使用框架的 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 中的屏幕截图,以便我们可以选择最后几个元素:
在这个阶段,我们将继续使用与之前步骤相同的策略,找到锚点并在需要填写的字段上进行相对点击操作。
我们需要在最后一个表单中填写以下数据:
姓名: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” 按钮:
if not bot.find("imprimir", matching=0.97, waiting_time=10000):
not_found("imprimir")
bot.click()
点击按钮后,如果没有直接配置打印机,则将打开 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
其他相关:
如何使用 GitHub Actions 来保持您的 Python RPA 项目更新
Hello World 的挑战:使用 BotCity 制作我的第一个 Python RPA 机器人
使用 Python RPA 构建与桌面系统交互的机器人 文章来源:https://www.toymoban.com/diary/share/325.html
到此这篇关于使用 Python RPA 构建与桌面系统交互的机器人的文章就介绍到这了, 更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持 TOY 模板网!