<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: BotCity</title>
    <description>The latest articles on DEV Community by BotCity (@botcitydev).</description>
    <link>https://dev.to/botcitydev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F6999%2F8cbc5dd8-68f7-4275-8653-76ae84487a81.png</url>
      <title>DEV Community: BotCity</title>
      <link>https://dev.to/botcitydev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/botcitydev"/>
    <language>en</language>
    <item>
      <title>Trilha de estudos para ser uma pessoa desenvolvedora Python RPA</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Fri, 29 Mar 2024 21:23:00 +0000</pubDate>
      <link>https://dev.to/botcitydev/trilha-de-estudos-para-ser-uma-pessoa-desenvolvedora-python-rpa-3o85</link>
      <guid>https://dev.to/botcitydev/trilha-de-estudos-para-ser-uma-pessoa-desenvolvedora-python-rpa-3o85</guid>
      <description>&lt;p&gt;Python tem ganhado cada vez mais força no mundo da automação RPA e é importante, como profissionais, estudarmos também essa tecnologia para atender as demandas da melhor maneira possível.&lt;/p&gt;

&lt;p&gt;Mas quais são os passos para aprender Python RPA?&lt;/p&gt;

&lt;p&gt;Que tal seguir essas dicas de uma trilha para o seu desenvolvimento e ainda ter certificados para compartilhar suas novas skills técnicas?&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 Comece pela linguagem de programação Python
&lt;/h3&gt;

&lt;p&gt;Este curso totalmente prático vai te guiar de forma clara e objetiva através das principais funcionalidades do Python.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://developers.botcity.dev/academy/devpro_python" rel="noopener noreferrer"&gt;Python Basics - Introdução e Mão na Massa&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para mais conteúdos para você aprender Python, siga as dicas do artigo "&lt;a href="https://dev.to/feministech/como-iniciar-meus-estudos-em-python-2aii"&gt;Como iniciar meus estudos em Python&lt;/a&gt;".&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 Desenvolva sua primeira automação Python
&lt;/h3&gt;

&lt;p&gt;Este curso ministrado durante a Python Brasil de 2022 vai te ensinar a criar automações com visão computacional para qualquer sistema.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://developers.botcity.dev/academy/pybr2022" rel="noopener noreferrer"&gt;Criando automações com visão computacional&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 Segurança com Python RPA
&lt;/h3&gt;

&lt;p&gt;Este curso vai te guiar de forma clara e objetiva através dos principais conceitos de segurança da informação e como aplicar esses conceitos em projetos Python com um foco especial em projetos de RPA.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://developers.botcity.dev/academy/seguranca_rpa_python" rel="noopener noreferrer"&gt;Segurança com Python RPA&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 Aprenda como fazer orquestração da sua automação Python
&lt;/h3&gt;

&lt;p&gt;Aprenda na prática de forma clara e objetiva as principais funcionalidades do orquestrador. Veja os benefícios e vantagens de usar cada recurso nos seus processos de automação.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://developers.botcity.dev/academy/orchestration" rel="noopener noreferrer"&gt;Orquestração de Python RPA&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 Desenvolva uma automação com um importante sistema do mercado
&lt;/h3&gt;

&lt;p&gt;Explore a automação SAP com Python e BotCity neste curso prático. Aprenda técnicas essenciais para agilizar os processos SAP de forma eficiente e eficaz.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://developers.botcity.dev/academy/sap_automation_pt" rel="noopener noreferrer"&gt;Automação de SAP com Python&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🤖 Pratique bastante e compartilhe sua evolução e seus aprendizados com a comunidade
&lt;/h3&gt;

&lt;p&gt;Conheça o repositório de bots da comunidade, para aprender com o desenvolvimento de outras pessoas e compartilhar os seus projetos open source.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://repository.botcity.dev/" rel="noopener noreferrer"&gt;Repositório de bots da comunidade&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;O que achou dessas dicas? Bora começar esses estudos e sermos profissionais cada vez melhores!&lt;/p&gt;

&lt;p&gt;E se tiver mais dicas, deixe nos comentários para complementar o conteúdo!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>rpa</category>
      <category>beginners</category>
      <category>automation</category>
    </item>
    <item>
      <title>O papel da pessoa desenvolvedora muito além do código</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Fri, 29 Mar 2024 18:25:59 +0000</pubDate>
      <link>https://dev.to/botcitydev/o-papel-da-pessoa-desenvolvedora-muito-alem-do-codigo-149h</link>
      <guid>https://dev.to/botcitydev/o-papel-da-pessoa-desenvolvedora-muito-alem-do-codigo-149h</guid>
      <description>&lt;p&gt;Estava acompanhando uma postagem no LinkedIn sobre como os times e as empresas precisam entender a importância do gerenciamento de projetos de automação. Você pode acompanhar a &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7179064607423029248/" rel="noopener noreferrer"&gt;postagem neste link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Entendo que é crucial que essa discussão ocorra entre as pessoas dos times de negócio e gestão. Mas essa preocupação deveria ser também considerada para pessoas desenvolvedoras e também outros papéis de pessoas tecnologistas.&lt;/p&gt;

&lt;p&gt;Quando nos tornamos pessoas desenvolvedoras (independente do tipo de projeto que vamos desenvolver), colocamos na cabeça que &lt;em&gt;somos pessoas que fazemos apenas código&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Mas na verdade, &lt;em&gt;somos pessoas resolvedoras de problemas&lt;/em&gt;. Precisamos lembrar de exercitar esse papel, levando para os times que trabalhamos soluções que fazem mais sentido de acordo com os requisitos e projetos que temos que atender.&lt;/p&gt;

&lt;p&gt;Além disso, resolver problemas não significa que vamos apenas desenvolver um código e acabou. Devemos encontrar soluções no mercado que nos ajudem, afinal de contas, nosso objetivo também é levar valor aos projetos que atuamos. Por isso é tão importante quando fazemos POCs (Proof of Concept, ou Prova de Conceito em português) das ferramentas que pesquisamos.&lt;/p&gt;

&lt;p&gt;É nesse momento que testamos, avaliamos as funcionalidades e tentamos considerar quais serão os ganhos com aquela ferramenta. E isso vai muito além do que queremos. Por isso temos que entender o que as demais áreas precisam e o que de fato terá valor em nossa automação.&lt;/p&gt;

&lt;p&gt;Um projeto de automação também é um projeto de software. E tal como um projeto de software, precisa de gerenciamento. Não basta entregar um executável para as pessoas usuárias. O que elas querem, no final do dia, é ter uma forma de orquestrar o que será executado.&lt;/p&gt;

&lt;p&gt;Repare nas perguntas que as pessoas usuárias fazem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como eu sei se deu certo?&lt;/li&gt;
&lt;li&gt;Como faço para agendar a execução?&lt;/li&gt;
&lt;li&gt;E se der erro?&lt;/li&gt;
&lt;li&gt;E se não executar?&lt;/li&gt;
&lt;li&gt;Como eu levo uma comunicação eficaz para o time sobre o que está acontecendo com as automações?&lt;/li&gt;
&lt;li&gt;Mas eu tenho uma planilha enorme de dados para consumir, e se falhar no meio do caminho?&lt;/li&gt;
&lt;li&gt;Quem pode acessar as informações?&lt;/li&gt;
&lt;li&gt;Onde eu coloco as senhas para autenticação nos sistemas?&lt;/li&gt;
&lt;li&gt;Eu posso executar mais de uma automação por vez?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Entre tantas outras. E unir código com uma solução que te permita proporcionar todo esse gerenciamento é de extrema importância, principalmente porque a operação de automações pode ser facilmente escalada. E como vamos gerenciar isso?&lt;/p&gt;

&lt;p&gt;Aproveitando a discussão, quero compartilhar com vocês uma trilha de estudos que pode te ajudar a entender melhor como seguir essas práticas e o nosso papel: &lt;a href="https://dev.to/botcitydev/trilha-de-estudos-para-ser-uma-pessoa-desenvolvedora-python-rpa-3o85"&gt;trilha de estudos para Python RPA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;E o que você acha isso? Compartilhe suas experiências com a comunidade nos comentários e vamos trocar uma ideia.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>discuss</category>
      <category>rpa</category>
    </item>
    <item>
      <title>Dicas sobre desenvolvimento de automação com visão computacional</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Sun, 17 Mar 2024 19:50:16 +0000</pubDate>
      <link>https://dev.to/botcitydev/dicas-sobre-desenvolvimento-de-automacao-com-visao-computacional-1132</link>
      <guid>https://dev.to/botcitydev/dicas-sobre-desenvolvimento-de-automacao-com-visao-computacional-1132</guid>
      <description>&lt;p&gt;Existem diversos casos de uso em que o desenvolvimento das automações RPA podem ter um melhor resultado utilizando o apoio da linguagem de programação Python e a tecnologia &lt;a href="https://blog.botcity.dev/pt-br/2023/11/28/visao-computacional/" rel="noopener noreferrer"&gt;visão computacional&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é visão computacional
&lt;/h2&gt;

&lt;p&gt;A visão computacional é uma tecnologia que utiliza-se da Inteligência Artificial, Aprendizado de Máquina (ou Machine Learning) e reconhecimento óptico de caracteres (também conhecido como OCR) para desenvolver sistemas que possam interpretar e classificar imagens.&lt;/p&gt;

&lt;p&gt;Por trás dessa tecnologia, existem algoritmos capazes de entender padrões apenas visualizando imagens e vídeos. E isso pode ser um grande poder para nos ajudar a automatizar tarefas e processos que precisam acessar sistemas que nem sempre nos permitem acessar o backend da aplicação desktop ou ainda a DOM (Document Object Model de uma página HTML) de uma página Web e temos que partir para a visão computacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como usar a visão computacional para desenvolver automações
&lt;/h2&gt;

&lt;p&gt;Vou deixar aqui como sugestão, um conteúdo bem interessante em formato de curso rápido com o passo a passo de como desenvolver a sua automação com visão computacional: &lt;a href="https://developers.botcity.dev/academy/pybr2022/" rel="noopener noreferrer"&gt;Criando automações com visão computacional&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;E como dica extra, vou deixar aqui também disponível acesso para a &lt;a href="https://documentation.botcity.dev/pt/studio/vscode/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; de maneira gratuita de uma extensão que está em pré-release que você pode utilizar no Visual Studio Code para desenvolver suas automações com o apoio dessa tecnologia, visão computacional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dicas sobre como resolver problemas ao desenvolver com visão computacional
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Elemento não encontrado
&lt;/h3&gt;

&lt;p&gt;Algo que pode ajudar na investigação de elementos não encontrados pela visão computacional, é utilizar o seguinte comando logo após chamar a função find() e antes de executar operações como o click():&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save_screenshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;debug_find.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso pode te ajudar a analisar como estava a tela e talvez te dar um direcionamento de qual é o motivo do elemento não estar sendo encontrado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resolução da tela
&lt;/h3&gt;

&lt;p&gt;Outra questão muito importante dentro do desenvolvimento com visão computacional é a resolução da tela. Caso esteja desenvolvendo uma automação que utiliza máquina virtual &lt;a href="https://blog.botcity.dev/pt-br/2024/03/01/como-construir-uma-automacao-desktop-em-python-para-acessar-vms-por-conexao-rdp/" rel="noopener noreferrer"&gt;acessando via RDP&lt;/a&gt;, você pode seguir algumas dicas do artigo linkado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sugestões para avaliar problemas
&lt;/h3&gt;

&lt;p&gt;Você pode analisar os pontos a seguir para descobrir o que pode estar acontecendo nas falhas do seu robô:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Talvez o período configurado no parâmetro &lt;code&gt;waiting_time&lt;/code&gt; da função &lt;code&gt;find()&lt;/code&gt; esteja muito curto e isso pode acontecer caso ainda não tenha dado tempo de carregar a tela, então você poderia ajustar esse item;&lt;/li&gt;
&lt;li&gt;Talvez o sistema sendo automatizado possua algum bloqueio contra captura de telas (esse tipo de problema pode ser bastante comum em telas que envolvam Bancos, por exemplo);&lt;/li&gt;
&lt;li&gt;Talvez algum outro elemento esteja na frente do elemento buscado, então a sugestão de tirar um print da tela citada acima, pode ajudar a entender se isso está acontecendo;&lt;/li&gt;
&lt;li&gt;Pode ser que o recorte foi feito com outra resolução que não a do sistema atual. Lembre-se de tentar desenvolver num ambiente igual ou ao menos o mais parecido possível, principalmente ao que se refere às configurações de resolução;&lt;/li&gt;
&lt;li&gt;Verifique se você está fazendo os recortes necessários em um ambiente com tema dark, por exemplo, porque isso pode fazer diferença se em outro momento, o ambiente estiver com o tema light;&lt;/li&gt;
&lt;li&gt;E outra dica seria verificar a acurácia do algoritmo de visão computacional. Na função &lt;code&gt;find()&lt;/code&gt;, ajuste, se necessário, o parâmetro &lt;code&gt;matching&lt;/code&gt;. Ele costuma estar com o valor máximo 0.97. Esse valor poderia ser ajustado a, no mínimo, 0.90. Isso pode ajudar nas questões levantadas neste tópico. Mas cuidado para não diminuir muito mais que isso, a ponto do algoritmo perder a sua eficiência para encontrar o elemento que precisa ser identificado.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Já fez alguma automação com visão computacional?
&lt;/h2&gt;

&lt;p&gt;Compartilhe suas experiências com essa forma de desenvolvimento e, caso tenha passado por algum problema ou erro, compartilhe também como solucionou ocorrido. Sempre bom aprender com experiências diferentes.&lt;/p&gt;

&lt;p&gt;E não deixe de participar da &lt;a href="https://documentation.botcity.dev/pt/community/" rel="noopener noreferrer"&gt;comunidade&lt;/a&gt; para mais trocas e conteúdos.&lt;/p&gt;

</description>
      <category>rpa</category>
      <category>braziliandevs</category>
      <category>automation</category>
      <category>visaocomputacional</category>
    </item>
    <item>
      <title>Como identificar problemas de ambiente ao tentar instalar BotCity Studio SDK</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Tue, 12 Mar 2024 17:14:57 +0000</pubDate>
      <link>https://dev.to/botcitydev/como-identificar-problemas-de-ambiente-ao-tentar-instalar-botcity-studio-sdk-17k8</link>
      <guid>https://dev.to/botcitydev/como-identificar-problemas-de-ambiente-ao-tentar-instalar-botcity-studio-sdk-17k8</guid>
      <description>&lt;p&gt;Para utilizar qualquer tecnologia e/ou linguagem de programação, você deve preparar o ambiente para que seu código funcione adequadamente conforme você o desenvolve. E as orientações sobre como fazer isso, normalmente constam nas primeiras etapas da documentação dessa tecnologia.&lt;/p&gt;

&lt;p&gt;No caso do desenvolvimento de automações RPA com as ferramentas da BotCity também funciona dessa maneira. As orientações estão na &lt;a href="https://documentation.botcity.dev/getting-started/prerequisites/" rel="noopener noreferrer"&gt;documentação com os pré-requisitos&lt;/a&gt;. Mas dependendo do computador que estamos utilizando, pode ser que tenhamos algumas dificuldades para instalar algo.&lt;/p&gt;

&lt;p&gt;Isso pode acontecer por alguns motivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;algumas tecnologias podem ter pré-requisitos para funcionar;&lt;/li&gt;
&lt;li&gt;alguns computadores podem ter bloqueios para instalar algo, caso você não seja a pessoa administradora da máquina.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas questões ressaltam quando estamos lidando com computadores que são da empresa na qual trabalhamos que, por segurança, adiciona bloqueios nesses equipamentos.&lt;/p&gt;

&lt;p&gt;Caso você esteja tentando preparar o ambiente para desenvolvimento de suas automações utilizando as ferramentas da BotCity e enfrente alguma dificuldade, é importante que você conheça também a &lt;a href="https://documentation.botcity.dev/getting-started/botcity-studio-sdk/#diagnostic-tool" rel="noopener noreferrer"&gt;ferramenta Diagnostic&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Essa ferramenta acompanha o mesmo pacote que você realiza o &lt;a href="https://documentation.botcity.dev/getting-started/botcity-studio-sdk/#download" rel="noopener noreferrer"&gt;download do Wizard para instalação do BotCity Studio SDK&lt;/a&gt;. Seu objetivo é validar se o ambiente atende os pré-requisitos para que você utilize esse SDK sem problemas e se é possível a instalação das ferramentas em seu computador, além de confirmar se será possível estabelecer uma conexão de sucesso com o BotCity Orquestrador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como executar o diagnóstico
&lt;/h2&gt;

&lt;p&gt;Ao fazer o dowload do BotCity Studio SDK, você terá uma pasta compactada chamada Wizard. Ao descompactá-la, um dos arquivos disponíveis será o &lt;code&gt;diagnostic.jar&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;⚠️ Para executar o Diagnostic no Linux ou no MacOS, é necessário ter o Java instalado. Se você for executar no ambiente Windows, pode executar sem essa preocupação.&lt;/p&gt;

&lt;p&gt;A janela do Diagnostic se abrirá e você deverá adicionar o seu login da conta criada para utilizar o SDK e o Orquestrador. No campo "Email" preencha o seu e-mail cadastrado e no campo "Password" adicione a sua senha. Após isso clique no botão localizado do lado direito da janela, chamado “Run”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e37cvcqao2o23jfwr3u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e37cvcqao2o23jfwr3u.png" alt="Print da tela do Diagnostic ao ser aberto" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso você não preencha e-mail e senha, o Diagnostic não fará os testes de login com o Orquestrador, deixando essa informação como resultado do teste: "E-mail ou senha não informados. Essa etapa foi pulada".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbw1df9bvf4qzsyadnhc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftbw1df9bvf4qzsyadnhc.png" alt="Print do Diagnostic após execução sem o e-mail e sem a senha, com destaque na linha do teste " width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após clicar em "Run", o Diagnostic começará os testes do ambiente. Se terminar com tudo funcionando corretamente, uma janela de confirmação aparecerá em cima informando que o diagnóstico finalizou e que o sistema está pronto para o desenvolvimento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9riab307rudvtl4pag1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy9riab307rudvtl4pag1.png" alt="Print do Diagnostic após execução, quando mostra uma nova janela de confirmação de que os testes terminaram e que o sistema está pronto para desenvolvimento." width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Status dos resultados do diagnóstico
&lt;/h2&gt;

&lt;p&gt;Pode ser que você perceba três diferentes status após a execução. São eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PASS:&lt;/strong&gt; significa que o teste passou;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FAIL:&lt;/strong&gt; significa que o teste falhou e será necessário averiguar o problema;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SKIP:&lt;/strong&gt; significa que o teste anterior com o SSL (certificado) habilitado, funcionou, então o Diagnostic não precisou executar um novo teste com o SSL desabilitado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Caso receba o resultado FAIL em algum teste de conexão, possivelmente há algum bloqueio no ambiente que você está utilizando. E, neste caso, é necessário solicitar ao time responsável da empresa onde você trabalha, as liberações descritas na &lt;a href="https://documentation.botcity.dev/pt/getting-started/prerequisites/#problemas-com-bloqueios-do-ambiente" rel="noopener noreferrer"&gt;documentação de problemas com bloqueios de ambiente&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como exportar o resultado dos testes
&lt;/h2&gt;

&lt;p&gt;Se for necessário, você pode exportar o resultado dos testes em formato .csv. Para fazer isso, clique no botão "Export" localizado na parte debaixo da janela, do lado direito. Feito isso, uma nova janela se abrirá para você ter acesso ao arquivo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frt6utiwbht1xk57245cz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frt6utiwbht1xk57245cz.png" alt="Print do Diagnostic com a janela em cima para acesso ao arquivo csv criado a partir dos testes executados." width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ficou alguma dúvida?
&lt;/h2&gt;

&lt;p&gt;Você pode acessar o nosso &lt;a href="https://documentation.botcity.dev/pt/faq/" rel="noopener noreferrer"&gt;FAQ&lt;/a&gt; para dúvidas frequentes, ou ainda entrar em contato com a comunidade global no &lt;a href="https://join.slack.com/t/communitybotcitydev/shared_invite/zt-1yvjzlce9-esRSoWfAIXPse4L21bzjAQ" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;. Caso prefira, também temos o &lt;a href="https://community.botcity.dev/" rel="noopener noreferrer"&gt;fórum&lt;/a&gt; disponível para dúvidas.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>botcity</category>
      <category>automation</category>
      <category>rpa</category>
    </item>
    <item>
      <title>Como identificar se a automação está executando localmente ou no BotCity Orquestrador?</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Wed, 06 Mar 2024 20:31:41 +0000</pubDate>
      <link>https://dev.to/botcitydev/como-identificar-se-a-automacao-esta-executando-localmente-ou-no-botcity-orquestrador-3kh8</link>
      <guid>https://dev.to/botcitydev/como-identificar-se-a-automacao-esta-executando-localmente-ou-no-botcity-orquestrador-3kh8</guid>
      <description>&lt;h2&gt;
  
  
  A dúvida surgiu
&lt;/h2&gt;

&lt;p&gt;Enquanto estávamos em nossa &lt;a href="https://www.youtube.com/live/VCOYDfLRhoY?si=ZA1kITat9XfnnAJm" rel="noopener noreferrer"&gt;live coding&lt;/a&gt; desenvolvendo uma automação com Python e fazendo integração com e-mail e Google Sheets, surgiu uma dúvida:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Como identificar se a automação está executando localmente ou no BotCity Orquestrador?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Essa dúvida surgiu por causa da seguinte situação: quando estamos executando nossa automação localmente, ou seja, em nosso computador ou máquina virtual, e queremos conectá-la com o &lt;a href="https://developers.botcity.dev/" rel="noopener noreferrer"&gt;BotCity Orquestrador&lt;/a&gt;, precisamos utilizar o BotCity Maestro SDK para fazer login na plataforma. Mas quando fazemos deploy no Orquestrador, esse trecho de código para o login não precisa existir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exemplo prático
&lt;/h2&gt;

&lt;p&gt;Criei um robô seguindo a &lt;a href="https://documentation.botcity.dev/pt/tutorials/python-automations/web/" rel="noopener noreferrer"&gt;documentação do framework web&lt;/a&gt; para exemplo. Abaixo temos o código principal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Import for the Web Bot
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;botcity.web&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WebBot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;By&lt;/span&gt;

&lt;span class="c1"&gt;# Import for integration with BotCity Maestro SDK
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;botcity.maestro&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="c1"&gt;# Disable errors if we are not connected to Maestro
&lt;/span&gt;&lt;span class="n"&gt;BotMaestroSDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RAISE_NOT_CONNECTED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Runner passes the server url, the id of the task being executed,
&lt;/span&gt;    &lt;span class="c1"&gt;# the access token and the parameters that this task receives (when applicable).
&lt;/span&gt;    &lt;span class="n"&gt;maestro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BotMaestroSDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_sys_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;## Fetch the BotExecution with details from the task, including parameters
&lt;/span&gt;    &lt;span class="n"&gt;execution&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maestro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_execution&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task ID is: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task Parameters are: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;WebBot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Configure whether or not to run on headless mode
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headless&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="c1"&gt;# Uncomment to change the default Browser to Firefox
&lt;/span&gt;    &lt;span class="c1"&gt;# bot.browser = Browser.FIREFOX
&lt;/span&gt;
    &lt;span class="c1"&gt;# Uncomment to set the WebDriver path
&lt;/span&gt;    &lt;span class="c1"&gt;# bot.driver_path = "&amp;lt;path to your WebDriver binary&amp;gt;"
&lt;/span&gt;
    &lt;span class="c1"&gt;# Opens the BotCity website.
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.botcity.dev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Implement here your logic...
&lt;/span&gt;    &lt;span class="bp"&gt;...&lt;/span&gt;

    &lt;span class="c1"&gt;# Wait 3 seconds before closing
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Finish and clean up the Web Browser
&lt;/span&gt;    &lt;span class="c1"&gt;# You MUST invoke the stop_browser to avoid
&lt;/span&gt;    &lt;span class="c1"&gt;# leaving instances of the webdriver open
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop_browser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Uncomment to mark this task as finished on BotMaestro
&lt;/span&gt;    &lt;span class="c1"&gt;# maestro.finish_task(
&lt;/span&gt;    &lt;span class="c1"&gt;#     task_id=execution.task_id,
&lt;/span&gt;    &lt;span class="c1"&gt;#     status=AutomationTaskFinishStatus.SUCCESS,
&lt;/span&gt;    &lt;span class="c1"&gt;#     message="Task Finished OK."
&lt;/span&gt;    &lt;span class="c1"&gt;# )
&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Element not found: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E assim fica o código do &lt;code&gt;requirements.txt&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;botcity-framework-web&amp;gt;=0.8.0,&amp;lt;1.0
botcity-maestro-sdk&amp;gt;=0.3.3,&amp;lt;1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que eu fiz para poder executar esse código, foi descomentar a linha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FIREFOX&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E adicionar o &lt;a href="https://github.com/mozilla/geckodriver/releases" rel="noopener noreferrer"&gt;geckodriver&lt;/a&gt; na configuração do WebDriver, deixando-o na pasta &lt;code&gt;resources&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;driver_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resources\geckodriver.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse bot é apenas um exemplo e o que ele faz ao ser executado é abrir o navegador Firefox (poderia ter sido o Chrome, Edge, entre outros) com o site da &lt;a href="https://www.botcity.dev/" rel="noopener noreferrer"&gt;BotCity&lt;/a&gt; e, depois de três segundos, fecha o navegador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conexão com BotCity Orquestrador
&lt;/h2&gt;

&lt;p&gt;Se você precisar se conectar com a plataforma para orquestração, você precisará adicionar o seguinte código para fazer &lt;a href="https://documentation.botcity.dev/pt/maestro/maestro-sdk/setup/#estabelecendo-uma-conexao-com-o-maestro" rel="noopener noreferrer"&gt;login no BotCity Orquestrador&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;maestro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAESTRO_SERVER&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAESTRO_LOGIN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAESTRO_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por serem dados sensíveis, uma saída para ocultar os dados é utilizando &lt;code&gt;dotenv&lt;/code&gt; do Python e o OS. Para isso, basta importar da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E no arquivo &lt;code&gt;requirements.txt&lt;/code&gt; precisa adicionar a biblioteca dotenv:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;botcity-framework-web&amp;gt;=0.8.0,&amp;lt;1.0
botcity-maestro-sdk&amp;gt;=0.3.3,&amp;lt;1.0

python-dotenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso também é necessário termos um arquivo chamado &lt;code&gt;.env&lt;/code&gt;, pois é de lá que o código buscará as informações. E esse arquivo ficará da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MAESTRO_SERVER = "coloque o server aqui"
MAESTRO_LOGIN = "coloque o login aqui"
MAESTRO_KEY = "coloque a key aqui"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essas informações ficam disponíveis em &lt;a href="https://documentation.botcity.dev/pt/maestro/features/dev-environment/" rel="noopener noreferrer"&gt;Dev. Environment&lt;/a&gt;, no BotCity Orquestrador.&lt;/p&gt;

&lt;p&gt;OBS: É importante lembrar de não disponibilizar o &lt;code&gt;.env&lt;/code&gt; ao versionar em plataformas como o GitHub, Gitlab, entre outras. Para facilitar, adicione &lt;code&gt;.env&lt;/code&gt; ao arquivo &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qual a diferença entre o ambiente local e o orquestrador
&lt;/h2&gt;

&lt;p&gt;Quando executamos nossa automação dentro do Orquestrador, uma tarefa é criada, atrelada a automação que fizemos o deploy, então por ele nós temos o ID da tarefa (ou task_id). Já no ambiente local, não temos essa informação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como validar em qual ambiente está sendo executado
&lt;/h2&gt;

&lt;p&gt;Então podemos, por exemplo, fazer a seguinte validação: se task_id for igual a 0, estamos executando localmente e precisamos fazer o processo de login com o Orquestrador. Caso contrário, o task_id existe e, então, não precisamos fazer o login.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="n"&gt;maestro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BotMaestroSDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_sys_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;## Fetch the BotExecution with details from the task, including parameters
&lt;/span&gt;    &lt;span class="n"&gt;execution&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maestro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_execution&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Running locally so we need to login to BotCity Orchestrator.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;maestro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAESTRO_SERVER&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
            &lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAESTRO_LOGIN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
            &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAESTRO_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Running with BotCity Orchestrator.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Execução local
&lt;/h2&gt;

&lt;p&gt;Ao testar a execução do robô localmente, percebemos que retorna a mensagem correta no terminal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tf95sjajig9fygf2vvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8tf95sjajig9fygf2vvl.png" alt="print do terminal do Visual Studio Code com foco na mensagem " width="800" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Execução no Orquestrador
&lt;/h2&gt;

&lt;p&gt;Ao testar a execução do robô no Orquestrador, percebemos que retorna a mensagem correta no terminal:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqjbaic64yhy0pkix4sj7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqjbaic64yhy0pkix4sj7.png" alt="print do log do Runner com foco na mensagem " width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Código completo
&lt;/h2&gt;

&lt;p&gt;Caso queira validar como ficou o código principal completo, segue abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Import for the Web Bot
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;botcity.web&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WebBot&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;By&lt;/span&gt;

&lt;span class="c1"&gt;# Import for integration with BotCity Maestro SDK
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;botcity.maestro&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="c1"&gt;# Disable errors if we are not connected to Maestro
&lt;/span&gt;&lt;span class="n"&gt;BotMaestroSDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RAISE_NOT_CONNECTED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Runner passes the server url, the id of the task being executed,
&lt;/span&gt;    &lt;span class="c1"&gt;# the access token and the parameters that this task receives (when applicable).
&lt;/span&gt;    &lt;span class="n"&gt;maestro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BotMaestroSDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_sys_args&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;## Fetch the BotExecution with details from the task, including parameters
&lt;/span&gt;    &lt;span class="n"&gt;execution&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maestro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_execution&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Running locally so we need to login to BotCity Orchestrator.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;maestro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAESTRO_SERVER&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
            &lt;span class="n"&gt;login&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAESTRO_LOGIN&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; 
            &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MAESTRO_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Running with BotCity Orchestrator.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;WebBot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Configure whether or not to run on headless mode
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headless&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

    &lt;span class="c1"&gt;# Uncomment to change the default Browser to Firefox
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FIREFOX&lt;/span&gt;

    &lt;span class="c1"&gt;# Uncomment to set the WebDriver path
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;driver_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resources\geckodriver.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Opens the BotCity website.
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.botcity.dev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Implement here your logic...
&lt;/span&gt;    &lt;span class="bp"&gt;...&lt;/span&gt;

    &lt;span class="c1"&gt;# Wait 3 seconds before closing
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Finish and clean up the Web Browser
&lt;/span&gt;    &lt;span class="c1"&gt;# You MUST invoke the stop_browser to avoid
&lt;/span&gt;    &lt;span class="c1"&gt;# leaving instances of the webdriver open
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop_browser&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Uncomment to mark this task as finished on BotMaestro
&lt;/span&gt;    &lt;span class="n"&gt;maestro&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finish_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;execution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;task_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AutomationTaskFinishStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SUCCESS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task Finished OK.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Element not found: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O que achou?
&lt;/h2&gt;

&lt;p&gt;Espero que tenha curtido a dica e possa adaptá-la de acordo com a necessidade da sua execução. Qualquer dúvida, basta entrar em contato pela nossa &lt;a href="https://documentation.botcity.dev/pt/community/" rel="noopener noreferrer"&gt;comunidade&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>rpa</category>
      <category>automation</category>
      <category>python</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Sites para praticar RPA</title>
      <dc:creator>Bruna Ferreira</dc:creator>
      <pubDate>Wed, 08 Nov 2023 01:45:12 +0000</pubDate>
      <link>https://dev.to/botcitydev/sites-para-praticar-rpa-4k2l</link>
      <guid>https://dev.to/botcitydev/sites-para-praticar-rpa-4k2l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Para esse artigo você precisa ter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Conhecimento básico de programação&lt;/li&gt;
&lt;li&gt;Conhecimento básico da biblioteca Selenium&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qualquer dúvida, comente! &lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Robotic Process Automation&lt;/em&gt; (RPA) visa implementar soluções com automação robótica de processos para livrar pessoas de trabalhos repetitivos, trazendo mais agilidade e segurança para os negócios. Esses processos podem acontecer interagindo com aplicativos de computador como sistemas &lt;em&gt;Customer Relationship Management&lt;/em&gt; (CRM), &lt;em&gt;Enterprise Resource Planning&lt;/em&gt; (ERP) ou mesmo navegadores web, acessando portais comumente utilizados pelas organizações.&lt;/p&gt;

&lt;p&gt;Quando entramos no contexto de RPA, temos diversas ferramentas diferentes para atender nossas demandas, sendo elas plataformas “no-code” ou “low-code” e ainda existe a possibilidade de utilizar código em alguma linguagem de programação para criar sua automação. Nesse artigo eu apresento um site para praticar suas automações do tipo Web, utilizando código Python e interagindo com navegadores diretamente com o &lt;em&gt;Document Object Model&lt;/em&gt; (DOM) das páginas.&lt;/p&gt;

&lt;p&gt;Uma das formas de melhorar a habilidade de programar é praticando. Dentro da área de RPA não é diferente, precisamos aprender sobre como os processos funcionam e assim conseguir desenvolver um programa capaz de executar todos os passos necessários para realizar a tarefa proposta com sucesso.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://practicetestautomation.com/"&gt;Practice Test Automation&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Nesse site temos opções de fazer testes com nossa automação em contextos como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test Login Page:  preenchendo o login da página utilizando as credenciais disponíveis, podendo testar casos de login válido ou inválido&lt;/li&gt;
&lt;li&gt;Test Exceptions: tratamento de exceções mais comuns com base na ferramenta Selenium.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Abordando o primeiro caso, temos a possibilidade de preencher dois campos de texto, referentes a username e password e clicar um botão submit. Dependendo de como os campos foram preenchidos, teremos como respostas diferentes ao clicar no botão. A partir dessas respostas poderemos avaliar se a automação está passando pelas etapas corretas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como fica em código?
&lt;/h3&gt;

&lt;p&gt;É importante verificar se todas as dependências necessárias estão instaladas na máquina para executar o código.&lt;/p&gt;

&lt;p&gt;Para esse projeto utilizaremos as seguintes bibliotecas, nas versões fixadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;selenium==4.10.0
webdriver-manager==3.8.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando de instalação no terminal fica dessa forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight postscript"&gt;&lt;code&gt;&lt;span class="nf"&gt;python&lt;/span&gt; &lt;span class="nf"&gt;-m&lt;/span&gt; &lt;span class="nf"&gt;pip&lt;/span&gt; &lt;span class="nf"&gt;install&lt;/span&gt; &lt;span class="nf"&gt;selenium==4.10.0&lt;/span&gt; &lt;span class="nf"&gt;webdriver-manager==3.8.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criaremos um arquivo python com o nome de bot.py, nele descreveremos os passos para preencher o formulário em forma de instruções.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium.webdriver.common.by&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;By&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;selenium.webdriver.firefox.service&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Service&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Define o caminho do WebDriver executável do Firefox
&lt;/span&gt;        &lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;executable_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;geckodriver.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Cria uma instância do Navegador
&lt;/span&gt;        &lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;webdriver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Firefox&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Define a URL da página Practice Test Automation na área de login
&lt;/span&gt;        &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://practicetestautomation.com/practice-test-login/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="c1"&gt;# Acessa página definida
&lt;/span&gt;        &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pelo elemento input de nome de usuário
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;username&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Ação de digitar no elemento
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_usuario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;student&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pelo elemento input de senha
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_senha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;password&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Ação de digitar no elemento
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_senha&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Password123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pelo elemento botão submit
&lt;/span&gt;        &lt;span class="n"&gt;elemento_botao&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;submit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Ação de clicar
&lt;/span&gt;        &lt;span class="n"&gt;elemento_botao&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Aguarda 3 segundos para garantir
&lt;/span&gt;        &lt;span class="c1"&gt;# que carregou a página com resultado
&lt;/span&gt;        &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pela confirmação de login
&lt;/span&gt;        &lt;span class="n"&gt;elemento_logado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CSS_SELECTOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.post-title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Imprime o texto da confirmação
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elemento_logado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Busca pelo elemento botão log out
&lt;/span&gt;        &lt;span class="n"&gt;elemento_deslogado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CSS_SELECTOR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.wp-block-button__link&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="c1"&gt;# Ação de clicar no elemento
&lt;/span&gt;        &lt;span class="n"&gt;elemento_deslogado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Busca pelo elemento de mensagem de erro
&lt;/span&gt;        &lt;span class="n"&gt;error_alert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;By&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Imprime a mensagem de erro
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error_alert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Finaliza fechando o navegador
&lt;/span&gt;        &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Imprime mensagem de finalização
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Finally&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar esse código, o resultado deve ser a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight postscript"&gt;&lt;code&gt;&lt;span class="nf"&gt;PS&lt;/span&gt; &lt;span class="nf"&gt;C:\practice_test_automation&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;python&lt;/span&gt; &lt;span class="nf"&gt;.\bot.py&lt;/span&gt;
&lt;span class="nf"&gt;Logged&lt;/span&gt; &lt;span class="nf"&gt;In&lt;/span&gt; &lt;span class="nf"&gt;Successfully&lt;/span&gt;
&lt;span class="nf"&gt;Finally&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse caso, ocorreu tudo como esperado, a automação preencheu os campos com os valores corretos e clicou no botão de login, acessando a página de confirmação e depois clicou em logout para sair da página.&lt;/p&gt;

&lt;p&gt;Para testar outras validações, vamos alterar inicialmente o preenchimento do campo de nome de usuário, colocando um valor inválido.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;        &lt;span class="c1"&gt;# Ação de digitar no elemento
&lt;/span&gt;        &lt;span class="c1"&gt;# elemento_campo_usuario.send_keys("student")
&lt;/span&gt;        &lt;span class="c1"&gt;# Valor incorreto para teste de erro
&lt;/span&gt;        &lt;span class="n"&gt;elemento_campo_usuario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_keys&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;estudante&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse será o resultado ao executar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight postscript"&gt;&lt;code&gt;&lt;span class="nf"&gt;PS&lt;/span&gt; &lt;span class="nf"&gt;C:\practice_test_automation&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;python&lt;/span&gt; &lt;span class="nf"&gt;.\bot.py&lt;/span&gt;
&lt;span class="nf"&gt;Your&lt;/span&gt; &lt;span class="nf"&gt;username&lt;/span&gt; &lt;span class="nf"&gt;is&lt;/span&gt; &lt;span class="nf"&gt;invalid!&lt;/span&gt;
&lt;span class="nf"&gt;Finally&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Podemos notar que o site oferece algumas formas de busca e interação com os elementos da DOM. Como sugestão, tente fazer outras alterações como mudar a senha que retorna outra mensagem de validação, além da possibilidade de procurar por outros elementos e interagir com eles.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>python</category>
      <category>rpa</category>
      <category>botcity</category>
    </item>
    <item>
      <title>Why is it important to orchestrate your automation built in Python or other programming languages?</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Mon, 09 Oct 2023 14:03:16 +0000</pubDate>
      <link>https://dev.to/botcitydev/why-is-it-important-to-orchestrate-your-automation-built-in-python-or-other-programming-languages-2hb7</link>
      <guid>https://dev.to/botcitydev/why-is-it-important-to-orchestrate-your-automation-built-in-python-or-other-programming-languages-2hb7</guid>
      <description>&lt;p&gt;RPA automation projects have several stages. We must care for each of them to ensure maximum assertiveness and successful delivery, from defining and mapping processes through development to orchestration and management, monitoring executions, taking care of the support part, and monitoring what is happening. We will start a series of weekly articles explaining and focusing on orchestration and how you can do it step by step for every need.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is it possible to orchestrate automation built by code?
&lt;/h2&gt;

&lt;p&gt;Yes. The BotCity Maestro Orchestrator is a tool that helps you orchestrate your automation, regardless of the language or technology used, either using the interface or interacting with the API.&lt;/p&gt;

&lt;p&gt;Through BotCity Maestro Orchestrator, you can define which technologies you are using in your bot at the time of deployment or use our Command technology, through which you can enter a command that will activate your robot even if someone built it in a programming language.&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://documentation.botcity.dev/" rel="noopener noreferrer"&gt;our documentation&lt;/a&gt; and the &lt;a href="https://blog.botcity.dev/" rel="noopener noreferrer"&gt;next articles&lt;/a&gt; in this series to understand how to do each orchestration step according to your project’s needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is it important to orchestrate RPA automation?
&lt;/h2&gt;

&lt;p&gt;Keeping track of how your automations are working, especially when there are several executions, can help you monitor them. Not just by guaranteeing whether or not they have been carried out. But also making it possible to understand possible errors, when each robot should execute, in what sequence, etc. &lt;/p&gt;

&lt;p&gt;Orchestrating makes day-to-day life easier, allows you to act on potential problems, and can help your team improve automated processes.&lt;/p&gt;

&lt;p&gt;As well as running our robots, you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy your automation in execution environments;&lt;/li&gt;
&lt;li&gt;Schedule the execution of your automation;&lt;/li&gt;
&lt;li&gt;Manage tasks in queues according to their priority;&lt;/li&gt;
&lt;li&gt;Monitor the status of tasks;&lt;/li&gt;
&lt;li&gt;Monitor executions in real-time, following execution logs;&lt;/li&gt;
&lt;li&gt;Trigger alerts and notifications when necessary;&lt;/li&gt;
&lt;li&gt;Handle errors as quickly as possible;&lt;/li&gt;
&lt;li&gt;Having a credentials vault that facilitates the execution of specific process steps that require authentication in different systems;&lt;/li&gt;
&lt;li&gt;Audit and ensure the governance of the processes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We must go far beyond “it worked” or “it went wrong, now what do I do?”. Management can help ensure a scalable and centralized operation, coordinating workflow more efficiently and safely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is the automation orchestration process important for?
&lt;/h2&gt;

&lt;p&gt;Orchestration can involve the business or product area and the IT team (specifically the RPA center of excellence), whether they operate, consume, analyze processes, or develop automation. Managing executions is essential for several areas in the company, not least because all the information we discussed in the previous question needs to be attainable and easy to find.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to orchestrate using BotCity Maestro Orchestrator?
&lt;/h2&gt;

&lt;p&gt;You can follow the next articles here on our blog. Every week, we’ll show you how to use each one of the features. Create a &lt;a href="https://developers.botcity.dev/signup" rel="noopener noreferrer"&gt;free account&lt;/a&gt; and test the orchestrator. But you can also check out &lt;a href="https://documentation.botcity.dev/" rel="noopener noreferrer"&gt;our documentation&lt;/a&gt;, look for support in &lt;a href="https://join.slack.com/t/communitybotcitydev/shared_invite/zt-1yvjzlce9-esRSoWfAIXPse4L21bzjAQ" rel="noopener noreferrer"&gt;our community&lt;/a&gt;, or ask questions in the &lt;a href="https://community.botcity.dev/" rel="noopener noreferrer"&gt;forum&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>rpa</category>
      <category>python</category>
      <category>orchestration</category>
      <category>botcity</category>
    </item>
    <item>
      <title>Por que é importante orquestrar suas automações feitas em Python ou outras linguagens de programação?</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Mon, 09 Oct 2023 13:58:55 +0000</pubDate>
      <link>https://dev.to/botcitydev/por-que-e-importante-orquestrar-suas-automacoes-feitas-em-python-ou-outras-linguagens-de-programacao-4lgn</link>
      <guid>https://dev.to/botcitydev/por-que-e-importante-orquestrar-suas-automacoes-feitas-em-python-ou-outras-linguagens-de-programacao-4lgn</guid>
      <description>&lt;p&gt;Projetos de automações RPA possuem diversas etapas. Precisamos nos preocupar com cada uma delas para garantir o máximo de assertividade e sucesso na entrega. Desde o processo de definição e mapeamento de processos, passando pelo desenvolvimento, até a orquestração e gerenciamento, para acompanhar as execuções, cuidar da parte de sustentação e também para acompanhar o que está acontecendo. Vamos começar uma série de artigos semanais explicando e focando na orquestração de robôs e como você pode fazer o passo a passo para cada necessidade.&lt;/p&gt;

&lt;h1&gt;
  
  
  É possível fazer orquestração de automações feitas em código?
&lt;/h1&gt;

&lt;p&gt;Sim. Você pode conhecer, por exemplo, nossa ferramenta chamada BotCity Maestro Orchestrator. Trata-se de uma ferramenta que te ajuda a orquestrar suas automações, independente da linguagem ou da tecnologia utilizada, seja via interface ou interagindo pela API.&lt;/p&gt;

&lt;p&gt;Pelo BotCity Maestro Orchestrator você pode definir qual tecnologia está sendo utilizada no seu bot no momento do deploy, ou utilizar a nossa tecnologia Command, pela qual você pode informar um comando que ativará o seu robô mesmo que construído em alguma linguagem de programação.&lt;/p&gt;

&lt;p&gt;Acompanhe a &lt;a href="https://documentation.botcity.dev/" rel="noopener noreferrer"&gt;nossa documentação&lt;/a&gt; e os &lt;a href="https://blog.botcity.dev/" rel="noopener noreferrer"&gt;próximos artigos&lt;/a&gt; dessa série para entender como fazer cada etapa de orquestração de acordo com a necessidade do seu projeto.&lt;/p&gt;

&lt;h1&gt;
  
  
  Por que é importante orquestrar as automações RPA?
&lt;/h1&gt;

&lt;p&gt;Fazer o acompanhamento de como suas automações estão funcionando, principalmente quando são diversas execuções, pode te ajudar a monitorá-las. Não apenas trazendo uma garantia de saber se foram ou não foram executadas. Mas também possibilitando o entendimento de possíveis erros, em que momento cada robô deve ser executado, em qual sequência etc.&lt;/p&gt;

&lt;p&gt;Isso facilita o dia-a-dia, permite atuar onde possíveis problemas possam ocorrer e pode, inclusive, melhorar ainda mais processos que já foram automatizados.&lt;/p&gt;

&lt;p&gt;Além de executar os nossos robôs, precisamos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Realizar deploy de suas automações em ambientes de execução;&lt;/li&gt;
&lt;li&gt;Agendar a execução de suas automações;&lt;/li&gt;
&lt;li&gt;Gerenciar tarefas em filas de acordo com a prioridade de cada uma delas;&lt;/li&gt;
&lt;li&gt;Acompanhar os estados das tarefas;&lt;/li&gt;
&lt;li&gt;Monitorar execuções em tempo real, acompanhando logs de execução;&lt;/li&gt;
&lt;li&gt;Disparar alertas e notificações quando necessário;&lt;/li&gt;
&lt;li&gt;Tratar erros da forma mais rápida possível, com um local onde você possa identificá-los e saber onde atuar para corrigi-los;&lt;/li&gt;
&lt;li&gt;Ter um cofre de credenciais que facilite a execução de determinadas etapas de processo que precisam autenticar em sistemas diferentes;&lt;/li&gt;
&lt;li&gt;Fazer auditoria e garantir governança dos processos executados de acordo com as necessidades da área atendida.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Precisamos ir muito além do “deu certo” ou “deu erro, e agora?”. A gestão pode ajudar a garantir uma operação escalável e centralizada, coordenando o fluxo de trabalho de maneira mais eficiente e segura.&lt;/p&gt;

&lt;h1&gt;
  
  
  Para quem é importante o processo de orquestração de automações?
&lt;/h1&gt;

&lt;p&gt;A orquestração pode envolver tanto a área de negócios ou de produto, como o time de TI (ou especificamente o centro de excelência de RPA), seja quem opera, quem consome, quem analisa os processos ou quem desenvolve as automações. Gerenciar as execuções é importante para diversas áreas na empresa, até porque todas as informações que discutimos na questão anterior precisam ser atingidas e fáceis de serem buscadas.&lt;/p&gt;

&lt;h1&gt;
  
  
  Como orquestrar utilizando o BotCity Maestro Orchestrator?
&lt;/h1&gt;

&lt;p&gt;Você pode acompanhar os próximos artigos aqui em nosso blog. Semanalmente vamos demonstrar como utilizar cada uma das funcionalidades dentro da ferramenta. Mas você também pode verificar a &lt;a href="https://documentation.botcity.dev/" rel="noopener noreferrer"&gt;nossa documentação&lt;/a&gt;, buscar apoio em &lt;a href="https://join.slack.com/t/communitybotcitydev/shared_invite/zt-1yvjzlce9-esRSoWfAIXPse4L21bzjAQ" rel="noopener noreferrer"&gt;nossa comunidade&lt;/a&gt;, tirar suas dúvidas no &lt;a href="https://community.botcity.dev/" rel="noopener noreferrer"&gt;fórum&lt;/a&gt; ou ainda acompanhar esse &lt;a href="https://www.youtube.com/watch?v=rPlAtOp8_uw" rel="noopener noreferrer"&gt;workshop&lt;/a&gt; que realizamos online. Crie uma &lt;a href="https://developers.botcity.dev/signup" rel="noopener noreferrer"&gt;conta gratuita&lt;/a&gt; e faça os testes para a sua necessidade.&lt;/p&gt;

</description>
      <category>rpa</category>
      <category>python</category>
      <category>braziliandevs</category>
      <category>botcity</category>
    </item>
    <item>
      <title>Construindo um bot com Python RPA para interagir com sistemas desktop</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Wed, 20 Sep 2023 23:14:50 +0000</pubDate>
      <link>https://dev.to/botcitydev/construindo-um-bot-com-python-rpa-para-interagir-com-sistemas-desktop-54n9</link>
      <guid>https://dev.to/botcitydev/construindo-um-bot-com-python-rpa-para-interagir-com-sistemas-desktop-54n9</guid>
      <description>&lt;p&gt;Você já deve conhecer ferramentas e frameworks que podem te ajudar a construir automações para interagir com sistemas Web. Mas e quando se trata de &lt;strong&gt;sistemas desktop&lt;/strong&gt;, como você faz? Vim te mostrar como utilizar o framework Open Source da &lt;a href="https://botcity.dev/" rel="noopener noreferrer"&gt;BotCity&lt;/a&gt; com diversas funcionalidades para você construir a sua automação com Python RPA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparando o ambiente de desenvolvimento
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developers.botcity.dev/signup" rel="noopener noreferrer"&gt;Crie a sua conta gratuita&lt;/a&gt; na plataforma da BotCity;&lt;/li&gt;
&lt;li&gt;Acompanhe o passo a passo da instalação nas orientações da documentação de &lt;a href="https://documentation.botcity.dev/pt/getting-started/prerequisites/" rel="noopener noreferrer"&gt;pré-requisitos&lt;/a&gt; e da &lt;a href="https://documentation.botcity.dev/pt/getting-started/botcity-studio-sdk/" rel="noopener noreferrer"&gt;instalação do SDK BotCity Studio&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;Instale o &lt;a href="https://drive.google.com/drive/folders/1gpmqV3l0VuLEg1d8kOFFFpzq2gopq66U?usp=sharing" rel="noopener noreferrer"&gt;Sicalc&lt;/a&gt; (caso queira seguir o tutorial com o mesmo programa de exemplo utilizado).

&lt;ul&gt;
&lt;li&gt;o Sicalc desktop é utilizado de maneira offline, então não será gerada uma Nota Fiscal válida;&lt;/li&gt;
&lt;li&gt;o Sicalc funciona para sistema operacional Windows, contudo todo o processo e uso do framework pode ser aplicado também para distribuições Linux e MacOS sem problemas;&lt;/li&gt;
&lt;li&gt;ao abrir o Sicalc pela primeira vez, será solicitado um código de município. Para o nosso exemplo, vamos colocar o 7107 que representa São Paulo, mas poderia ser qualquer outro.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Primeiros passos do desenvolvimento do nosso robô
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Criando o projeto a partir do template da BotCity
&lt;/h3&gt;

&lt;p&gt;No terminal do seu computador, dentro da pasta em que você deseja criar o projeto, execute o seguinte comando para instalarmos o pacote &lt;a href="https://cookiecutter.readthedocs.io/en/stable/" rel="noopener noreferrer"&gt;cookiecutter&lt;/a&gt; (porque os templates oferecidos foram criados a partir dele).&lt;/p&gt;

&lt;p&gt;Para instalarmos o pacote do &lt;code&gt;cookiecutter&lt;/code&gt;, vamos executar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;upgrade&lt;/span&gt; &lt;span class="n"&gt;cookiecutter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para criarmos um projeto usando o modelo, vamos invocar o &lt;code&gt;cookiecutter&lt;/code&gt; e fornecer como argumento a URL do repositório onde os templates da BotCity estão localizados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;cookiecutter&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;botcity&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;archive&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;zip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Durante a execução deste comando, você precisará informar duas coisas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;project_type:&lt;/strong&gt; refere-se ao tipo de projeto que deseja criar. O template fornecerá algumas opções, mas neste caso, vamos escolher o número 1, pois vamos construir um bot Desktop;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;bot_id:&lt;/strong&gt; refere-se a uma identificação que você deseja dar para o seu projeto. Neste exemplo, chamaremos de bot-sicalc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após o término do processo acima, uma nova pasta chamada &lt;code&gt;bot-sicalc&lt;/code&gt; estará disponível. Você pode entender um pouco mais sobre a estrutura e como ele funciona com as orientações na documentação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalando as dependências do seu projeto
&lt;/h3&gt;

&lt;p&gt;Normalmente, projetos de desenvolvimento podem ter dependências como os frameworks utilizados, pacotes importantes, entre outros. O nosso também tem dependências e você poderá identificá-las no arquivo &lt;code&gt;requirements.txt&lt;/code&gt;. Você notará que há pelo menos essas duas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;botcity-framework-core&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# framework de desenvolvimento da automação&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;botcity-maestro-sdk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# API do BotCity Maestro para orquestração da automação&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de rodar o seu projeto, é importante fazermos a instalação dessas dependências. E para isso, devemos executar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--upgrade&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;requirements.txt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Primeira execução do nosso robô
&lt;/h2&gt;

&lt;p&gt;Se você entrar no arquivo bot.py, perceberá que já temos um código pré-pronto e alguns comentários com orientações importantes sobre como fazer alguns dos próximos passos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Entenda o que o código está fazendo
&lt;/h3&gt;

&lt;p&gt;Identifique as linhas com os comandos abaixo. Elas estão importando as bibliotecas que mencionamos do arquivo &lt;code&gt;requirements.txt&lt;/code&gt; para que consiga utilizá-las no seu código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;botcity.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DesktopBot&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;botcity.maestro&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E nas linhas abaixo, estamos criando um objeto para o bot com o framework Desktop e pedindo para ele abrir um navegador no site da BotCity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DesktopBot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;browse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;http://www.botcity.dev&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Execute o robô
&lt;/h3&gt;

&lt;p&gt;Para ver o robô sendo executado, você pode fazer isso pela IDE que estiver utilizando ou na linha de comando com o seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deu certo? Abriu o navegador do seu computador com o site da BotCity? Aqui está um exemplo de qual seria o resultado esperado após essa execução:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1f86m9xbdt9o1euc4n3s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1f86m9xbdt9o1euc4n3s.png" alt="Print da tela inicial do site da BotCity." width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Uma dica interessante é você testar se o que está acontecendo é o esperado. Tente fazer essa prática de testar aos poucos para você entender o que está acontecendo. Isso também facilitará no entendimento caso algum erro ocorra.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Como lidar com os erros
&lt;/h3&gt;

&lt;p&gt;Caso não tenha funcionado de primeira, não se preocupe. É normal você passar por alguns erros quando está desenvolvendo algo pela primeira vez ou aprendendo algo do zero. Te convido a acompanhar este &lt;a href="https://dev.to/botcitydev/os-desafios-do-hello-world-criando-meu-primeiro-bot-com-python-rpa-utilizando-botcity-1a0p"&gt;post sobre alguns erros&lt;/a&gt; que podem acontecer e te encorajar a compartilhar os erros que você teve e como os resolveu.&lt;/p&gt;

&lt;p&gt;Caso esteja com alguma outra dificuldade no desenvolvimento, fique à vontade para entrar em nosso &lt;a href="https://community.botcity.dev/" rel="noopener noreferrer"&gt;fórum&lt;/a&gt; ou em nossa &lt;a href="https://join.slack.com/t/communitybotcitydev/shared_invite/zt-1yvjzlce9-esRSoWfAIXPse4L21bzjAQ" rel="noopener noreferrer"&gt;comunidade no slack&lt;/a&gt; para pedir ajuda e tirar suas dúvidas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desenvolvendo o robô desktop
&lt;/h2&gt;

&lt;p&gt;Para esse desenvolvimento, vamos utilizar o BotCity Studio, que através de visão computacional, nos ajudará com o mapeamento dos itens na tela do sistema utilizado para que nosso robô possa interagir com ele.&lt;/p&gt;

&lt;h3&gt;
  
  
  Carregando o projeto BotSicalc no BotCity Studio
&lt;/h3&gt;

&lt;p&gt;Mantenha a sua IDE aberta com o seu projeto. Abra também o BotCity Studio e, no menu superior, escolha a opção "File" e, em seguida, "Load Project".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vr7ji29k5ouh0vm7c61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1vr7ji29k5ouh0vm7c61.png" alt="print do menu file aberto dentro do BotCity Studio mostrando a opção " width="103" height="160"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma nova janela se abrirá e, nela, você deverá clicar em "browse" e identificar onde está a pasta do seu projeto. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyvj6jvmymhpi40nsch5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxyvj6jvmymhpi40nsch5.png" alt="print da janela " width="420" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em seguida, identifique o arquivo com extensão &lt;code&gt;.botproj&lt;/code&gt;. Selecione este arquivo para o BotCity Studio carregar o seu projeto. No caso deste exemplo, o arquivo será “bot-sicalc.botproj”. Após isso, clique em "Open" e, em seguida, "Launch". Pronto, você já tem seu projeto carregado no BotCity Studio.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prosseguindo no desenvolvimento
&lt;/h3&gt;

&lt;p&gt;Para os próximos passos, vamos manter as duas ferramentas abertas, a sua IDE e o BotCity Studio, para que os códigos sejam sincronizados em ambas as plataformas.&lt;/p&gt;

&lt;p&gt;Até este momento, mantivemos apenas o seguinte código no meu arquivo "bot.py". Perceba que deletamos a linha &lt;code&gt;bot.browse("http://www.botcity.dev")&lt;/code&gt;, pois ela não será mais necessária.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Import for the Desktop Bot
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;botcity.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DesktopBot&lt;/span&gt;

&lt;span class="c1"&gt;# Import for integration with BotCity Maestro SDK
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;botcity.maestro&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="c1"&gt;# Disable errors if we are not connected to Maestro
&lt;/span&gt;&lt;span class="n"&gt;BotMaestroSDK&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RAISE_NOT_CONNECTED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DesktopBot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Element not found: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao salvar esse código na minha IDE, ao clicar novamente no BotCity Studio, você perceberá que também foi atualizado.&lt;/p&gt;

&lt;p&gt;Abaixo da linha &lt;code&gt;bot = DesktopBot()&lt;/code&gt;, vamos adicionar o comando execute para o robô abrir o Sicalc, conforme código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C:\Program Files (x86)\Programas RFB\Sicalc Auto Atendimento\SicalcAA.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma dica interessante é você testar se o que está acontecendo é o esperado. Neste momento, por exemplo, podemos salvar o código e &lt;strong&gt;executar o robô pela IDE&lt;/strong&gt; para verificarmos se, de fato, o comando funcionará. Tente fazer essa prática de testar aos poucos para você entender o que está acontecendo. Isso também facilitará no entendimento caso algum erro ocorra.&lt;/p&gt;

&lt;p&gt;Se essa etapa funcionar, o robô executará e o Sicalc ficará nessa tela:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57gu0xywqgvomnuxxl5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57gu0xywqgvomnuxxl5e.png" alt="print da tela inicial do sicalc aberta" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Antes de seguir em frente, lembre-se de deixar o cursor logo abaixo da linha de código que o bot abre o Sicalc no BotCity Studio. Isso é porque ele vai começar a gerar código para você utilizar em seu projeto. E o código será adicionado exatamente onde o cursor estiver posicionado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Identificando pop-up da tela inicial
&lt;/h3&gt;

&lt;p&gt;Ao executarmos o aplicativo Sicalc pela primeira vez, será exibido um pop-up contendo um aviso. A tarefa será identificarmos essa janela e fechá-la logo em seguida.&lt;/p&gt;

&lt;p&gt;A estratégia que vamos utilizar é procurar por uma âncora e realizar um clique relativo no botão &lt;strong&gt;Continuar&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Voltando ao BotCity Studio, no arquivo &lt;code&gt;bot.py&lt;/code&gt; posicionamos o cursor na linha onde o código deve ser gerado.&lt;/p&gt;

&lt;p&gt;Na aba &lt;code&gt;UI&lt;/code&gt;, clicamos próximo ao elemento que queremos identificar e a ferramenta dará um zoom para selecionarmos o elemento. A seleção do nosso recorte é feita com o mouse, clicando e arrastando até selecionar dessa maneira:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5l5ee8q06hrjwt7osid.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd5l5ee8q06hrjwt7osid.png" alt="print da tela esclarecimento ao contribuinte e a janela solicitando as informações de nome, ação e modo" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Se o zoom não estiver adequado para você fazer a seleção necessária, basta pressionar a tecla &lt;code&gt;esc&lt;/code&gt; no seu teclado e refazer o clique próximo ao elemento.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Após selecionado, vamos preencher os campos &lt;code&gt;Name&lt;/code&gt; com o valor "popup-esclarecimento" e &lt;code&gt;Action&lt;/code&gt; com o valor "Click_relative". O campo "mode" deve ser mantido com a opção "Image" selecionada. Em seguida, clicamos no botão &lt;strong&gt;Submit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fun6lirv0ge7gy6yg7m42.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fun6lirv0ge7gy6yg7m42.png" alt="print da tela para preenchimento de nome e ação " width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após clicar em Submit, ao arrastar o mouse, você perceberá que uma linha vermelha acompanhará o movimento. Nós devemos dizer para o BotCity Studio onde deverá ser o clique relativo. Neste caso, será o botão "Continuar". Então arrastamos o cursor do mouse até esse botão e clicamos nele.&lt;/p&gt;

&lt;p&gt;Com essa etapa concluída, o seguinte trecho de código será gerado pelo BotCity Studio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Abre o aplicativo do SiCalc
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_sicalc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;popup-esclarecimento&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;popup-esclarecimento&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;195&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lembre-se de salvar o código no BotCity Studio, que pode ser pelo atalho "ctrl + s". Isso fará com que a sua IDE também seja atualizada com o novo código gerado.&lt;/p&gt;

&lt;p&gt;Ao rodarmos novamente esse código pela IDE, depois de abrir o aplicativo Sicalc, o bot realizará o clique relativo no elemento que foi selecionado acima. A partir disso, conseguimos continuar o processo de preenchimento da DARF.&lt;/p&gt;

&lt;h3&gt;
  
  
  Selecionando opções do menu
&lt;/h3&gt;

&lt;p&gt;No aplicativo do Sicalc, precisaremos acessar a opção &lt;strong&gt;Funções&lt;/strong&gt; do menu e, em seguida, a opção &lt;strong&gt;Preenchimento de DARF&lt;/strong&gt;. Então devemos tirar um novo print da tela do Sicalc e, no BotCity Studio, podemos fazer o recorte desses elementos.&lt;/p&gt;

&lt;p&gt;Vamos começar pelo item "Funções". E para essa opção, vamos dar o nome &lt;code&gt;funcoes&lt;/code&gt; e a action será &lt;code&gt;click&lt;/code&gt;. A opção mode deve continuar como &lt;code&gt;image&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr71zl30opwguzvl46nhp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr71zl30opwguzvl46nhp.png" alt="print mostrando em destaque a parte de funções selecionada com nome e ação preenchidos conforme texto do tutorial" width="800" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o sub-menu de opções de Funções aberto, vamos tirar um novo print para fazermos a seleção e ação Click na opção Preenchimento de DARF, chamando-a de preenchimento-darf.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmctoyv42tzi2dmhkygr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmctoyv42tzi2dmhkygr.png" alt="print mostrando em destaque a parte de preenchimento de DARF selecionada" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O código gerado pelo BotCity Studio será parecido com o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;funcoes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;funcoes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preenchimento-darf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preenchimento-darf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Preenchendo do formulário inicial
&lt;/h3&gt;

&lt;p&gt;Após a etapa anterior, será aberto um formulário inicial onde precisaremos preencher somente o código da receita.&lt;/p&gt;

&lt;p&gt;Novamente, vamos tirar um novo print da tela atualizada para fazermos a seleção do elemento correto no BotCity Studio.&lt;/p&gt;

&lt;p&gt;Nesse caso, vamos encontrar a âncora do input &lt;strong&gt;Cód. Receita&lt;/strong&gt; e fazer um clique relativo dentro do campo, que fica logo na frente para ser preenchido:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsdqjdqj58xtlvow0us5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsdqjdqj58xtlvow0us5.png" alt="print com a tela em destaque para a parte de código da receira selecionada e a janela para preenchimento de nome e ação" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após encontrar e clicar no campo referente a esse elemento, utilizamos o comando &lt;code&gt;paste()&lt;/code&gt; para inserir nosso dado. Em seguida vamos utilizar o comando &lt;code&gt;tab()&lt;/code&gt; para avançarmos para o próximo formulário.&lt;/p&gt;

&lt;p&gt;Você pode adicionar o código com o comando &lt;code&gt;paste()&lt;/code&gt; e com o comando &lt;code&gt;tab()&lt;/code&gt; diretamente no BotCity Studio e salvar para atualizar na sua IDE, ou adicionar diretamente pela IDE. Apenas lembre-se de salvar o código para ambas as ferramentas seguirem atualizadas.&lt;/p&gt;

&lt;p&gt;Abaixo, o exemplo de como poderá ficar esse trecho do código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;codigo-receita&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;codigo-receita&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Inserindo no campo um código fictício
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5629&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Tecla "tab" avança para o próximo formulário
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Preenchendo os dados da DARF
&lt;/h3&gt;

&lt;p&gt;Ao executarmos o código acima, será aberto um segundo formulário. E nele, devemos inserir os demais dados da DARF. Neste momento, a tela será parecida com essa:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshiq852wd42qa3ww6a78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshiq852wd42qa3ww6a78.png" alt="print da tela do sicalc para preenchimento de informações conforme descrito no tutorial" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Atualizando o print da tela no BotCity Studio, vamos precisar encontrar os elementos referentes ao período de apuração (campo PA) e ao valor do documento (campo Valor em Reais) e fazer um clique relativo nos seus respectivos campos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v6ngurqm7a7wxjoepnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v6ngurqm7a7wxjoepnv.png" alt="print da tela do sicalc com destaque no campo PA" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr1kzol0ddykmtdtxsbzy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr1kzol0ddykmtdtxsbzy.png" alt="print da tela do sicalc com destaque no campo valor em reais" width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E da mesma forma que fizemos anteriormente, vamos utilizar o comando &lt;code&gt;paste()&lt;/code&gt; do framework para nos ajudar a digitar o valor dentro dos campos que estamos preenchendo neste momento. Perceba como o código ficará nessa etapa:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;periodo-apuracao&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;periodo-apuracao&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Inserindo PA
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;310120&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;valor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;valor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Inserindo valor
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O próximo passo é clicarmos no botão &lt;strong&gt;Calcular&lt;/strong&gt;, para conseguirmos acessar o formulário final. Temos duas formas de resolver essa etapa. A primeira delas seria adicionar o comando &lt;code&gt;enter()&lt;/code&gt;, pois essa ação no teclado de apertar a tecla enter, após o preenchimento dos campos, aciona o botão Calcular.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Outra forma é seguir pela visão computacional e apoio do BotCity Studio. Então tiramos um novo print, selecionamos o botão &lt;strong&gt;Calcular&lt;/strong&gt; e informamos que a ação deverá ser a de &lt;code&gt;click&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzytwxzrehfpcgem95d9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffzytwxzrehfpcgem95d9.png" alt="print da tela do sicalc com destaque no botão calcular e a janela para preencher o nome do botão e a ação de clique" width="800" height="339"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calcular&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calcular&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Preenchendo formulário final
&lt;/h3&gt;

&lt;p&gt;Após o processo de cálculo ser finalizado, precisamos acessar o formulário final. Para isso, vamos clicar no botão &lt;strong&gt;DARF&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynfhq36iihoau1z85bfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynfhq36iihoau1z85bfa.png" alt="print sicalc com destaque onde está o botão DARF e a janela para preencher o nome e ação para o botão" width="800" height="365"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;botao-darf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;botao-darf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com o formulário final aberto, vamos atualizar o print da tela no BotCity Studio para fazermos a seleção dos últimos elementos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapmaedchox1x02bsbmy7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fapmaedchox1x02bsbmy7.png" alt="print do sicalc mostrando o calculo feito e a janela para preencher nome, telefone e outros dados" width="800" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para essa etapa, vamos seguir utilizando a mesma estratégia das etapas anteriores, procurando pela âncora e fazendo um clique relativo no campo que precisamos preencher.&lt;/p&gt;

&lt;p&gt;Os dados que precisamos preencher nesse último formulário serão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nome: Petrobras&lt;/li&gt;
&lt;li&gt;Telefone: 1199991234&lt;/li&gt;
&lt;li&gt;CNPJ: 33000167000101&lt;/li&gt;
&lt;li&gt;Referência: 0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com todas as âncoras mapeadas, o código gerado será semelhante a esse:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Inserindo nome no campo
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Petrobras&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;telefone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;telefone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Inserindo telefone no campo
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1199991234&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cnpj&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cnpj&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Inserindo CNPJ no campo
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;33000167000101&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;referencia&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;referencia&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Inserindo referência no campo
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Salvando o arquivo
&lt;/h3&gt;

&lt;p&gt;O último passo é salvarmos o arquivo da DARF que será gerado. Ainda na tela do último formulário exibido, após preencher os dados vamos clicar no botão &lt;strong&gt;Imprimir&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1aduay0n8cct8fj56ra.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1aduay0n8cct8fj56ra.png" alt="print do sicalc com o botão imprimir em destaque e a janela para configurar a ação de clique" width="800" height="432"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;imprimir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;imprimir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clicando no botão, será aberto a janela do gerenciador de arquivos do Windows, caso não tenha diretamente uma impressora configurada:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8g2153e8osgulmiuespn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8g2153e8osgulmiuespn.png" alt="print da tela para salvar o arquivo pdf da DARF" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste caso, vamos encontrar a referência dessa janela e clicar para que ela fique em foco:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrlo9z8e0dvsuninc3te.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyrlo9z8e0dvsuninc3te.png" alt="print com zoom na tela " width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso, podemos utilizar o &lt;code&gt;paste()&lt;/code&gt; para informar qual será o caminho do arquivo e o &lt;code&gt;enter()&lt;/code&gt; para salvar. Abaixo temos o exemplo de como poderá ficar o código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;janela-salvar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;janela-salvar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Inserindo o caminho do arquivo
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C:\Users\username\Documents\DARF.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Finalizando o processo
&lt;/h3&gt;

&lt;p&gt;Após salvar o arquivo, nosso processo está finalizado!&lt;/p&gt;

&lt;p&gt;Podemos agora utilizar o comando &lt;code&gt;wait()&lt;/code&gt; para aguardar 2 segundos e garantir que tudo foi salvo e depois o comando &lt;code&gt;alt_f4()&lt;/code&gt; para fecharmos o formulário e a janela do Sicalc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Aguarda 2 segundos
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Fechando janela do formulário
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;alt_f4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Fechando app do SiCalc
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;alt_f4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 Essa estratégia do comando &lt;code&gt;wait()&lt;/code&gt; pode ser útil em algumas ocasiões, quando algum processo ou comando pode levar um tempo para acontecer ou atualizar antes de ir para a próxima etapa do processo. Então analise se no seu projeto isso pode te ajudar e utilize da maneira que for melhor para você.&lt;/p&gt;

&lt;h3&gt;
  
  
  Código final
&lt;/h3&gt;

&lt;p&gt;Caso queira validar como o código final deste tutorial poderá ficar, segue abaixo o conteúdo do arquivo &lt;code&gt;bot.py&lt;/code&gt; do projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DesktopBot&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Implement here your logic...
&lt;/span&gt;    &lt;span class="c1"&gt;# Caminho onde está o executável SiCalc
&lt;/span&gt;    &lt;span class="n"&gt;path_sicalc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C:\Program Files (x86)\Programas RFB\Sicalc Auto Atendimento\SicalcAA.exe&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Abre o aplicativo do SiCalc
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_sicalc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;popup-esclarecimento&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;popup-esclarecimento&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;195&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;211&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;funcoes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;funcoes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preenchimento-darf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;preenchimento-darf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;codigo-receita&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;codigo-receita&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Inserindo no campo um código fictício
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5629&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Tecla "tab" avança para o próximo formulário
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tab&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;periodo-apuracao&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;periodo-apuracao&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Inserindo PA
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;310120&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;valor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;valor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Inserindo valor
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;10000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calcular&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;calcular&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;botao-darf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;botao-darf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nome&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Inserindo nome
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Petrobras&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;telefone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;telefone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Inserindo telefone
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1199991234&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cnpj&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cnpj&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Inserindo CNPJ
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;33000167000101&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;referencia&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;referencia&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;121&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Inserindo referência
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;imprimir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;imprimir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;janela-salvar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;janela-salvar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Inserindo path do arquivo
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;C:\Users\username\Documents\DARF.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Aguarda 2 segundos
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Fechando janela do formulário
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;alt_f4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Fechando app do SiCalc
&lt;/span&gt;    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;alt_f4&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Element not found: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Para explorar mais comandos do framework desktop
&lt;/h2&gt;

&lt;p&gt;Tem vários outros comandos que você pode explorar e utilizar para construir suas automações desktop. Acompanhe pelo link da &lt;a href="https://documentation.botcity.dev/pt/frameworks/desktop/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compartilhe com a comunidade o seu projeto
&lt;/h2&gt;

&lt;p&gt;Após construir a sua automação, que tal compartilhar com a comunidade o que aprendeu e o robô que você construiu? Basta compartilhar com o &lt;a href="https://repository.botcity.dev/" rel="noopener noreferrer"&gt;repositório de robôs da comunidade&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>rpa</category>
      <category>python</category>
      <category>botcity</category>
    </item>
    <item>
      <title>Hello World challenges: creating my first bot with Python RPA using BotCity</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Tue, 20 Jun 2023 20:04:48 +0000</pubDate>
      <link>https://dev.to/botcitydev/hello-world-challenges-creating-my-first-bot-with-python-rpa-using-botcity-4ab1</link>
      <guid>https://dev.to/botcitydev/hello-world-challenges-creating-my-first-bot-with-python-rpa-using-botcity-4ab1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;pt-br: &lt;a href="https://dev.to/botcitydev/os-desafios-do-hello-world-criando-meu-primeiro-bot-com-python-rpa-utilizando-botcity-1a0p"&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We should value our "Hello World" tries more when learning new technologies. It is from there that we begin a journey of exploration and learning. And even because it's a learning process, we can go through some mistakes, and that's ok. It's part of the process too.&lt;/p&gt;

&lt;p&gt;Here are some tips on errors you may face in your first steps when building a bot with Python RPA. And if you have experienced an error that is not here in this article, please, feel free to contribute in the comments, especially commenting on the solution you applied to solve the problem.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpsq7wf3ea4tislm5qku.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffpsq7wf3ea4tislm5qku.gif" alt="Gif of a cat using sunglasses and the phrase " width="400" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  First of all... Hello World
&lt;/h2&gt;

&lt;p&gt;Hello World is a joke we play in the technology area, mainly in the software development part, which would be the first thing to do when learning something new to avoid bad luck while using that technology. For example, if you are learning Python, you should show the message "Hello World" on the screen using Python commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to build my first Hello World with Python RPA using BotCity
&lt;/h2&gt;

&lt;p&gt;You can take your first steps into this world with BotCity's Open Source frameworks. Also, explore the &lt;a href="https://documentation.botcity.dev/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;, start coding, and the &lt;a href="https://community.botcity.dev/" rel="noopener noreferrer"&gt;forum&lt;/a&gt; to clear your doubts with the community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Mistakes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  '&lt;code&gt;ModuleNotFoundError&lt;/code&gt;' error when trying to run my project
&lt;/h3&gt;

&lt;p&gt;This error also happens with the message: No module named 'botcity'.&lt;/p&gt;

&lt;p&gt;It means you skipped the bot installation step or did that step in a different IDE than the one you are using now.&lt;/p&gt;

&lt;p&gt;To resolve the problem, run the following command in the terminal: &lt;code&gt;pip install --upgrade -r requirements.txt&lt;/code&gt;. We need to do this because the requirements.txt file has all external dependencies for your robot.&lt;/p&gt;

&lt;p&gt;You must run the command above for both BotCity Framework Desktop and BotCity Framework Web. You can have more details in the &lt;a href="https://documentation.botcity.dev/en/tutorials/python-automations/web/#installing-the-project" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; if you use virtual environments to run your project, such as &lt;code&gt;venv&lt;/code&gt;, review that you are using the same version of Python to install the dependencies mentioned and run the code. Checking these versions and ensuring they are the same will also avoid some errors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Error '&lt;code&gt;OSError: [WinError 216]&lt;/code&gt;'
&lt;/h3&gt;

&lt;p&gt;In this error, the complete message can be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OSError: [WinError 216] This version of %1 is not compatible with the version of Windows you're running. Check your computer's system information and then contact the software publisher
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the scenario is usually this: you are trying to perform the configuration part of a web driver in your code for your web bot, and, in this case, you have chosen the Firefox browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Changing the default Browser to Firefox
bot.browser = Browser.FIREFOX

# Setting the path of the Firefox WebDriver
bot.driver_path = "&amp;lt;path to your WebDriver binary&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To configure this web driver, we usually download it from this &lt;a href="https://github.com/mozilla/geckodriver/releases" rel="noopener noreferrer"&gt;link&lt;/a&gt;, where the geckodriver releases are. And then, we identify the correct web driver for our operating system, choosing one of the items in the download assets part:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sqp76skhoa00izoa1u0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sqp76skhoa00izoa1u0.png" alt="Screenshot of the assets area from the link mentioned above showing the different driver versions for each system." width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is essential to choose carefully because confusion is common when using, for example, the Windows 64-bit operating system and trying to configure &lt;code&gt;geckodriver-vX.YY.Z-win-aarch64.zip&lt;/code&gt;. The correct one would be &lt;code&gt;geckodriver-vX.YY.Z-win64.zip&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;By making this correction of using the geckodriver with the correct version, we corrected the error, and you can open the browser through your code automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Driver incompatibility with browser error
&lt;/h3&gt;

&lt;p&gt;It is also important to confirm the browser version you will use and validate that the web driver is compatible with that version. Using Firefox again as an example, you can check the version by looking at Menu &amp;gt; Help &amp;gt; About Firefox.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55gsxpkjyph6iek5i8du.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F55gsxpkjyph6iek5i8du.png" alt="Firefox screenshot" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When validating the version of your browser or the browser that you will use in your automation, check the release information of the selected web driver to verify if it is compatible with the version you will use.&lt;/p&gt;

&lt;p&gt;In the example we use, we observe that the Firefox version that I will use in the automation is 114.0.2, and the release contains information that the minimum required version is 113.0:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aybzbmacx4unu2v5xzf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0aybzbmacx4unu2v5xzf.png" alt="Screenshot with the text " width="467" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this case, I can use that geckodriver version in my automation since it is compatible with my browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the mistakes when we started
&lt;/h3&gt;

&lt;p&gt;It is essential to understand that some mistakes can happen. And this is necessary for your learning. Understanding the error, reading the message calmly, researching, clarifying doubts with the community, and solving this problem will bring you knowledge.&lt;/p&gt;

&lt;p&gt;So relax, enjoy this trip, and explore the RPA universe with a lot of Python and Open Source.&lt;/p&gt;




&lt;p&gt;How about doing your own Hello World and telling us what challenges it brought to you? Let's share our experiences and knowledge with the community.&lt;/p&gt;

&lt;p&gt;And if you want some inspiration on what to build to continue learning, look at our &lt;a href="https://repository.botcity.dev/" rel="noopener noreferrer"&gt;bot repository&lt;/a&gt;, where community members share their Open Source projects to exchange knowledge and experiences.&lt;/p&gt;

</description>
      <category>python</category>
      <category>rpa</category>
      <category>beginners</category>
      <category>botcity</category>
    </item>
    <item>
      <title>Os desafios do Hello World: criando meu primeiro bot com Python RPA utilizando BotCity</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Tue, 20 Jun 2023 18:03:59 +0000</pubDate>
      <link>https://dev.to/botcitydev/os-desafios-do-hello-world-criando-meu-primeiro-bot-com-python-rpa-utilizando-botcity-1a0p</link>
      <guid>https://dev.to/botcitydev/os-desafios-do-hello-world-criando-meu-primeiro-bot-com-python-rpa-utilizando-botcity-1a0p</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;en-us: &lt;a href="https://dev.to/botcitydev/hello-world-challenges-creating-my-first-bot-with-python-rpa-using-botcity-4ab1"&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Particularmente, eu acredito que deveríamos dar mais valor ao Hello World de qualquer tecnologia nova que estivermos aprendendo. É a partir dele que damos início a uma jornada de exploração e aprendizado. E até mesmo por ser um processo de aprendizado, podemos passar por alguns erros e está tudo bem, faz parte do processo também.&lt;/p&gt;

&lt;p&gt;Quero deixar aqui algumas dicas sobre alguns erros que você pode enfrentar nos seus primeiros passos durante a construção de um bot com Python RPA. E caso você tenha passado por algum erro que não está aqui neste artigo, fique à vontade para contribuir nos comentários, principalmente comentando a solução que você aplicou para resolver o problema, combinado?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrrmlygpp8fpgbpc4y2i.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrrmlygpp8fpgbpc4y2i.gif" alt="Gif de uma cena do desenho animado Pica Pau em que uma bruxa tenta subir numa vassoura falando " width="498" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes de tudo... o Hello World
&lt;/h2&gt;

&lt;p&gt;Hello World é uma brincadeira que fazemos na área de tecnologia, e talvez principalmente na parte de desenvolvimento, que seria a primeira coisa a se fazer ao aprender algo novo, para evitar o azar durante o uso dessa tal tecnologia. Por exemplo, se você estiver aprendendo Python, o "Hello World" seria mostrar essa mensagem mesmo na tela, utilizando comandos do Python. Você pode até dar uma olhada nesse meu outro artigo: &lt;a href="https://dev.to/feministech/deixando-seu-ola-mundo-com-o-python-1dga"&gt;Deixando seu 'Olá, mundo' com o Python&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como fazer meu primeiro Hello World com Python RPA utilizando BotCity
&lt;/h2&gt;

&lt;p&gt;Você pode dar seus primeiros passos nesse mundo com os frameworks Open Source da BotCity. Inclusive fique à vontade para explorar a &lt;a href="https://documentation.botcity.dev/pt/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt; e começar a codar, além do &lt;a href="https://community.botcity.dev/" rel="noopener noreferrer"&gt;fórum&lt;/a&gt; para tirar suas dúvidas com a comunidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Erros comuns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Erro '&lt;code&gt;ModuleNotFoundError&lt;/code&gt;' ao tentar executar meu projeto
&lt;/h3&gt;

&lt;p&gt;Esse erro costuma acontecer também com a mensagem: &lt;code&gt;No module named 'botcity'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Isso significa que você acabou pulando a etapa de instalação do bot ou então você fez essa etapa, mas possivelmente em ambiente diferente da que está utilizando agora.&lt;/p&gt;

&lt;p&gt;Para solucionar, execute o seguinte comando no terminal: &lt;code&gt;pip install --upgrade -r requirements.txt&lt;/code&gt;. Isso é necessário porque nesse arquivo estão todas dependências externas para seu robô. &lt;/p&gt;

&lt;p&gt;Essa etapa deve ser feita tanto para o BotCity Framework Desktop quanto para o BotCity Framework Web. Você pode ter mais detalhes na &lt;a href="https://documentation.botcity.dev/pt/tutorials/python-automations/web/#instalando-as-dependencias-do-projeto" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Importante:&lt;/strong&gt; se você utiliza ambientes virtuais para executar o seu projeto, como o &lt;code&gt;venv&lt;/code&gt;, por exemplo, verifique que está utilizando a mesma versão do Python tanto para instalar as dependências que citamos, quanto para rodar o código. Isso também evitará alguns erros.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Erro &lt;code&gt;No such file or directory: 'requirements.txt'&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Esse erro pode acontecer caso você esteja tentando corrigir o anterior. É possível que você tenha executado o comando &lt;code&gt;pip install --upgrade -r requirements.txt&lt;/code&gt; dentro da pasta errada do projeto. Verifique em seu terminal a pasta em que você está.&lt;/p&gt;

&lt;h3&gt;
  
  
  Erro '&lt;code&gt;OSError: [WinError 216]&lt;/code&gt;'
&lt;/h3&gt;

&lt;p&gt;Neste erro, a mensagem completa pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OSError: [WinError 216] This version of %1 is not compatible with the version of Windows you're running. Check your computer's system information and then contact the software publisher
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o cenário, normalmente é o seguinte: você está tentando realizar a parte de configuração de um webdriver em seu código para o seu bot web e, no caso, escolheu o browser Firefox.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Setando navegador padrão para o Firefox
bot.browser = Browser.FIREFOX

# Setando o caminho do Geckodriver
bot.driver_path = "&amp;lt;caminho para o WebDriver&amp;gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para fazer a configuração desse webdriver, costumamos fazer o download por este &lt;a href="https://github.com/mozilla/geckodriver/releases" rel="noopener noreferrer"&gt;link&lt;/a&gt;, onde estão as releases do geckodriver. E então, identificamos o webdriver correto para o nosso sistema operacional, escolhendo um dos itens na parte de assets para download:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvd7u9e4zjxwnom0decmd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvd7u9e4zjxwnom0decmd.png" alt="Print da área de assets do link mencionado acima mostrando as diferentes versões do driver para cada sistema." width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É importante escolher com atenção, porque é comum haver confusão quando usamos, por exemplo, o sistema operacional Windows 64 bits e acabamos tentando configurar o &lt;code&gt;geckodriver-vX.YY.Z-win-aarch64.zip&lt;/code&gt;. O correto seria o &lt;code&gt;geckodriver-vX.YY.Z-win64.zip&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ao fazer essa correção de utilizar o geckodriver com a versão correta, corrigimos o erro e você consegue abrir o navegador através do seu código, automaticamente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Erro de incompatibilidade do driver com o navegador
&lt;/h3&gt;

&lt;p&gt;É importante também confirmar a versão do navegador que você vai utilizar e validar que o webdriver é compatível com essa versão. Utilizando novamente o Firefox como exemplo, você pode entender observando a versão ao clicar no Menu &amp;gt; Ajuda &amp;gt; Sobre o Firefox.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdgvgsfd5erlnegjrzvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsdgvgsfd5erlnegjrzvr.png" alt="Print da janela " width="723" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao validar a versão do seu navegador ou do navegador que será utilizado na sua automação, verifique nas informações de release do webdriver selecionado se ele é compatível com essa versão que você vai utilizar.&lt;/p&gt;

&lt;p&gt;No exemplo que utilizamos, observamos que a versão do Firefox que eu vou utilizar na automação é 114.0.2 e na release consta a informação que a versão mínima requerida é a 113.0:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblzkwo53owiaylamey16.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fblzkwo53owiaylamey16.png" alt="Print do texto " width="467" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ou seja, nesse caso, eu conseguiria utilizar normalmente esse mesmo geckodriver na minha automação, visto que é compatível.&lt;/p&gt;

&lt;h3&gt;
  
  
  Erros quando os sistemas barram a utilização por identificar um robô
&lt;/h3&gt;

&lt;p&gt;Em casos assim, pode ser possível tentar humanizar o processo. O que isso significa? Você pode tentar fazer movimentações com o mouse na tela, como uma pessoa poderia fazer. Ou ainda ajustar a digitação para que não seja um conteúdo diretamente colado no campo a ser preenchido.&lt;/p&gt;

&lt;p&gt;Esse tipo de problema costuma acontecer mais em projetos de automações Web. Mas para "humanizar" a execução, você pode recorrer a alguns recursos do framework desktop da BotCity, essa pode ser uma boa alternativa. Abaixo, seguem os exemplos dos comandos que você pode utilizar:&lt;/p&gt;

&lt;p&gt;Sobre a digitação, você pode usar o seguinte comando do framework BotCity (veja mais exemplos em nossa &lt;a href="https://documentation.botcity.dev/frameworks/desktop/keyboard/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;kb_type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Coloque seu texto aqui.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sobre a movimentação do cursor do mouse, você pode usar os seguintes comandos do framework BotCity (veja mais exemplos em nossa &lt;a href="https://documentation.botcity.dev/frameworks/desktop/mouse/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mouse_move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# x e y são coordenadas
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Erros quando a execução do robô é muito mais rápida que os sistemas que está acessando
&lt;/h3&gt;

&lt;p&gt;Como estamos criando automações para serem executadas com código, esse tempo de execução pode ser muito mais rápido que o esperado ou que os sistemas que estamos interagindo conseguem lidar.&lt;/p&gt;

&lt;p&gt;E por causa disso, erros de execução podem acontecer, porque determinada etapa na tela ainda não finalizou para que o próximo passo aconteça dentro do processo.&lt;/p&gt;

&lt;p&gt;Em ocasiões assim, talvez faça sentido avaliar a possibilidade de colocar pausas entre algumas dessas etapas.&lt;/p&gt;

&lt;p&gt;Uma forma de fazer isso com o nosso framework da BotCity seria (veja outros exemplos na &lt;a href="https://documentation.botcity.dev/frameworks/desktop/waits/" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Aguardar por cinco segundos.
&lt;/span&gt;&lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além disso, você também pode criar lógicas ou regras em seu código para garantir que o robô está na tela certa antes de executar determinado comando. Uma das formas de fazer isso, seria utilizar a visão computacional e buscar por alguma âncora na tela que deveria estar aberta e em uso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Erro na precisão de encontrar elementos na tela
&lt;/h3&gt;

&lt;p&gt;Esse problema pode acontecer por alguns motivos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Você desenvolveu o robô em um ambiente diferente do que será executado em produção;&lt;/li&gt;
&lt;li&gt;A resolução da tela alterou.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para amenizar ou evitar que esse problema continue acontecendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tente possibilitar que você faça o desenvolvimento da automação em ambiente e resolução o mais próximo possível de como será executado em produção;&lt;/li&gt;
&lt;li&gt;Outra saída é fazer um ajuste em relação a acurácia do algoritmo de visão computacional no código gerado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Veja no exemplo do código a seguir gerado pela visão computacional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;window&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;waiting_time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;not_found&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;window&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;click_relative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;221&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;206&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O parâmetro &lt;code&gt;matching&lt;/code&gt; costuma estar com o valor máximo 0.97. Esse valor poderia ser ajustado a, no mínimo, 0.90. Isso pode ajudar nas questões levantadas neste tópico. Mas cuidado para não diminuir muito mais que isso, a ponto do algoritmo perder a sua eficiência para encontrar o elemento que precisa ser identificado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Erro &lt;code&gt;unable to find valid certification path to requested target&lt;/code&gt; ao tentar executar o BotCity Studio
&lt;/h3&gt;

&lt;p&gt;Este erro pode acontecer em seu ambiente caso existam bloqueios configurados de certificados. Uma das saídas é fazer o seguinte passo-a-passo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Abra a pasta do SDK. No wizard isso pode ser feito clicando em "Open SDK folder";&lt;/li&gt;
&lt;li&gt;Acesse a pasta conf e abra o arquivo conf.bcf em modo de edição (você pode fazer isso, abrindo com o bloco de notas, por exemplo);&lt;/li&gt;
&lt;li&gt;Adicione a linha ignoreSSL=true e não esqueça de salvar essa alteração no arquivo conf.bcf;&lt;/li&gt;
&lt;li&gt;Reinicie o BotCity Studio e o problema deve estar resolvido.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sobre os erros quando começamos
&lt;/h2&gt;

&lt;p&gt;É importante entender que alguns erros podem, de fato, acontecer. E isso não é um impedimento para o seu aprendizado, pelo contrário. Entender o erro, ler a mensagem com calma, pesquisar, tirar dúvidas com a comunidade e resolver esse problema é o que vai te trazer ainda mais conhecimento.&lt;/p&gt;

&lt;p&gt;Então relaxe, aproveite essa viagem e desbrave o universo RPA com muito Python e Open Source.&lt;/p&gt;




&lt;p&gt;Que tal você fazer o seu Hello World e nos contar quais foram os desafios que isso lhe trouxe? Vamos compartilhar nossas experiências e conhecimento com a comunidade.&lt;/p&gt;

&lt;p&gt;E se quiser uma inspiração sobre o que construir para continuar seus aprendizados, dá uma olhada em nosso &lt;a href="https://repository.botcity.dev/" rel="noopener noreferrer"&gt;repositório de bots&lt;/a&gt;, onde a galera da comunidade compartilha seus projetos Open Source para troca de conhecimento e experiências.&lt;/p&gt;

</description>
      <category>python</category>
      <category>rpa</category>
      <category>braziliandevs</category>
      <category>botcity</category>
    </item>
    <item>
      <title>How to use GitHub Actions to keep your Python RPA project updated</title>
      <dc:creator>Morganna</dc:creator>
      <pubDate>Tue, 13 Jun 2023 18:56:48 +0000</pubDate>
      <link>https://dev.to/botcitydev/how-to-use-github-actions-to-keep-your-python-rpa-project-updated-gia</link>
      <guid>https://dev.to/botcitydev/how-to-use-github-actions-to-keep-your-python-rpa-project-updated-gia</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;pt-br: &lt;a href="https://dev.to/botcitydev/como-utilizar-o-github-actions-para-manter-seu-projeto-python-rpa-atualizado-o0i"&gt;link&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You’ve heard about GitHub Actions, right? If you haven’t, take advantage and explore the documentation about it at this &lt;a href="https://docs.github.com/en/actions" rel="noopener noreferrer"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And to take advantage of the practicality of performing different actions in projects from this functionality, we created a GitHub Actions function to automate the bot’s update, called BotCity Actions, and you can find it available in this &lt;a href="https://github.com/botcity-dev/botcity-action-bots" rel="noopener noreferrer"&gt;repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use BotCity Actions?
&lt;/h2&gt;

&lt;p&gt;Whenever we can automate a process to make our day-to-day life easier, it makes sense to learn how to do it and understand if it makes sense in our context and need. So, suppose you have a continuous development process for your bots. Why not make your day-to-day life more manageable and automate beyond the business and product processes? Like the deployment and update of your releases as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does BotCity Actions work?
&lt;/h2&gt;

&lt;p&gt;Our function performs updates, deploys, and releases automatically to our orchestrator, BotCity Maestro, without manual implementations. Also, if you need to become familiar with the BotCity Maestro API for better use, please consult our documentation at this &lt;a href="https://documentation.botcity.dev/en/maestro/" rel="noopener noreferrer"&gt;link&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Applying BotCity Actions in your project
&lt;/h2&gt;

&lt;p&gt;Follow the step-by-step below. In the example, we are considering projects built with the Python language. However, feel free to use other languages. Our &lt;a href="https://documentation.botcity.dev/en/how-to/github-action-bot/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; contains examples for configuring projects in Java, JavaScript, and TypeScript.&lt;/p&gt;

&lt;h3&gt;
  
  
  [0] Configure your project
&lt;/h3&gt;

&lt;p&gt;As a first step, you need to add a folder structure to your project. Create a folder with the exact name &lt;code&gt;.github&lt;/code&gt; at the root of your project. Inside that folder, create another one with the specific name &lt;code&gt;workflows&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This specification comes directly from GitHub, and this is how it will interpret where the functions are. For further clarification, remember to consult the &lt;a href="https://docs.github.com/en/actions/quickstart" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  [1] Creating the first workflow
&lt;/h3&gt;

&lt;p&gt;At this point, we’re assuming you already have bots developed. But if you want help, look at this &lt;a href="https://documentation.botcity.dev/en/tutorials/python-automations/web/" rel="noopener noreferrer"&gt;link&lt;/a&gt; in our documentation. We have a very interesting tutorial on how to create a bot with our Open Source frameworks.&lt;/p&gt;

&lt;p&gt;Still, we point out that you can use bots built with other technologies in our orchestrator, for example, Java, JavaScript, Selenium, and bash scripts, among many others.&lt;/p&gt;

&lt;p&gt;One of the events that we can consider in our action would be the push on the &lt;code&gt;main&lt;/code&gt; branch. It means that whenever there is a change in the &lt;code&gt;main&lt;/code&gt; branch, you want a new deployment to BotCity Maestro to update the bot. It works like this if you are considering Git Flow rules and best practices, where the &lt;code&gt;main&lt;/code&gt; branch is the production branch.&lt;/p&gt;

&lt;p&gt;In this step, we will create the &lt;code&gt;update_bot.yml&lt;/code&gt; file inside the workflows folder. And you should add the code below to take into account the changes explained above in the push event on the &lt;code&gt;main&lt;/code&gt; branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Update the latest version bot on BotCity Maestro.

on:
    push:
      branches:
        - main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  [2] Generating the bot by the BotCity Actions function
&lt;/h3&gt;

&lt;p&gt;To know what you need to add to the function, it is also necessary to understand what is required to deploy your bot.&lt;/p&gt;

&lt;p&gt;For example, considering that you developed your automation with our Open Source framework, we need to complete the following prerequisite: generate a zipped file with the bot’s code and dependencies, which we can create by executing the script: &lt;code&gt;./build.sh&lt;/code&gt; or &lt;code&gt;./build.bat&lt;/code&gt;, depending on the operating system. This script is at the project’s root, constructed from our &lt;a href="https://documentation.botcity.dev/en/frameworks/desktop/" rel="noopener noreferrer"&gt;desktop&lt;/a&gt; or &lt;a href="https://documentation.botcity.dev/en/frameworks/web/" rel="noopener noreferrer"&gt;web&lt;/a&gt; framework template.&lt;/p&gt;

&lt;p&gt;So, we need to add the following actions to our function:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run in an environment (which, in this case, we chose Ubuntu due to its ease and speed, however, you can analyze your specific circumstance and understand if there are essential dependencies to consider and, if necessary, run in a Windows or MacOS environment, for example);&lt;/li&gt;
&lt;li&gt;Permit the execution of the &lt;code&gt;build.sh&lt;/code&gt; file;&lt;/li&gt;
&lt;li&gt;Run the &lt;code&gt;./build.sh&lt;/code&gt; command.
With these new actions, our &lt;code&gt;update_bot.yml&lt;/code&gt; file will look like this:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Update the latest version bot on BotCity Maestro.

on:
    push:
      branches:
        - main
jobs:
  update-latest:
    name: Update the latest version bot on BotCity Maestro.
    #  Running the latest version of Ubuntu.
    runs-on: ubuntu-latest
    steps:
      # Checking out the project.
      - uses: actions/checkout@v3
      # Implemented executable permission to `.sh`
      - name: Get permission to build.
        run: chmod +x build.sh
      # Execute to build.
      - name: Execute to build.
        run: ./build.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  [3] Using the function
&lt;/h3&gt;

&lt;p&gt;The sequence of steps we’ve added to the &lt;code&gt;update_bot.yml&lt;/code&gt; file so far has been to define an environment to build in and create the zipped file we’ll upload in Maestro. However, now we need to configure the steps for the function to be used.&lt;/p&gt;

&lt;p&gt;In this case, we add some important data for successful deployment. They are botId, technology (where you must inform the language used in your bot and, in our example, we consider Python), and botPath (location at the project’s root where the zipped file will be uploaded to our orchestrator’s platform).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Update the latest version bot on BotCity Maestro.

on:
  push:
    branches:
      - main
jobs:
  update-latest:
    name: Update the latest version bot on BotCity Maestro.
    #  Running the latest version of Ubuntu.
    runs-on: ubuntu-latest
    steps:
      # Checking out the project.
      - uses: actions/checkout@v3
      # Implemented executable permission to `.sh`
      - name: Get permission to build.
        run: chmod +x build.sh
      # Execute to build.
      - name: Execute to build.
        run: ./build.sh
      - name: Using a Botcity action.
        # Using the v1.0.0 version of botcity-action-bots
        uses: botcity-dev/botcity-action-bots@v1.0.0
        with:
          # Use the update function.
          update: true
          # Bot Id in Maestro.
          botId: 'example'
          # Technology utilized in bot
          technology: 'python'
          # Path from the root of the project where the generated .zip/.jar will be.
          botPath: './bot.zip'
        env:
          # These secrets must be configured in your repository.
          LOGIN: ${{ secrets.LOGIN }}
          SERVER: ${{ secrets.SERVER }}
          KEY: ${{ secrets.KEY }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that we added some environment variables like LOGIN, SERVER, and KEY. These are essential secrets for you to be able to use BotCity Maestro. So remember to set these keys securely in your repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where can I find more tips?
&lt;/h2&gt;

&lt;p&gt;You can access the guide we created in our &lt;a href="https://documentation.botcity.dev/en/how-to/github-action-bot/``" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; with many more tips and guidance on using BotCity Actions, including creating releases and much more.&lt;/p&gt;

&lt;p&gt;Also, remember to join our &lt;a href="http://communitybotcitydev.slack.com/" rel="noopener noreferrer"&gt;community&lt;/a&gt; to share your Open Source projects and get your questions answered with others. It will be exciting to learn from your experience.&lt;/p&gt;

</description>
      <category>rpa</category>
      <category>python</category>
      <category>githubactions</category>
      <category>botcity</category>
    </item>
  </channel>
</rss>
