Ir para o conteúdo

Lab 1.3: Desenvolvendo automação Desktop

Automações Desktop permitem que você controle qualquer tipo de aplicativo instalado em seu computador, incluindo páginas da Web, emuladores de Android, sistemas remotos acessados via Remote Desktop e Citrix e muito mais.

Existem duas formas para a localização e interação com componentes em automações Desktop:

  • Visão Computacional.
  • Identificador Único de componentes Win32/UIA.

Neste primeiro momento, desenvolveremos um processo de automação utilizando visão computacional.

Criando um projeto usando o template

A BotCity oferece templates de projeto que podem ser criados e customizados através do cookiecutter.

Para instalarmos o pacote do cookiecutter, vamos executar o seguinte comando:

python -m pip install --upgrade cookiecutter

Para criarmos um projeto usando o modelo, vamos invocar o cookiecutter e fornecer como argumento a URL do repositório onde os templates da BotCity estão localizados:

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

O sistema solicitará algumas respostas para criar seu projeto:

  • project_type: 1 | Tipo de projeto Desktop.
  • bot_id: BotSicalc | Nome do projeto.

Após o término do processo acima, uma nova pasta chamada BotSicalc estará disponível.

Sucesso

Parabéns, você agora tem um projeto com o framework Python da BotCity. 🏆

Vamos agora inspecionar os detalhes deste projeto.

Explorando o projeto

Dentro da nossa pasta do projeto BotSicalc você deverá ter a seguinte estrutura:

BotSicalc
├── bot.py       <- Arquivo onde iremos trabalhar e desenvolver nosso robô.
├── resources    <- Pasta contendo os arquivos auxiliares para o robô.
├── build.bat        <- Script em Batch para gerar o pacote.
├── build.ps1        <- Script em PowerShell para gerar o pacote.
├── build.sh         <- Shell script para gerar o pacote.
├── requirements.txt <- Arquivo descrevendo todas as dependências externas para seu robô.
└── BotSicalc.botproj <- Arquivo utilizado para carregar o projeto no BotStudio.

Nota

O template de projeto é composto por vários arquivos e pastas, porém aqui estão os mais importantes:

  • bot.py: Altere este arquivo e adicione aqui seu código.
  • resources: Adicione nesta pasta os arquivos a serem utilizados por seu robô como imagens, planilhas e etc.
  • requirements.txt: Altere este arquivo e adicione todas as dependências externas que serão utilizadas no código.

Sucesso

Toda essa informação é bem legal, mas é hora de vermos alguma ação.

Vamos testar nosso robô localmente. 🦾🤖

Testando seu projeto localmente

Para testar seu projeto localmente, vamos instalar as dependências do Python que estão sendo utilizadas no projeto.

Criando ambiente isolado

Como boa prática, criaremos um ambiente virtual isolado para essa automação, evitando problemas como diferentes versões de dependências. Para isso abra o terminal na pasta do projeto e use os seguintes comandos:

Cria o ambiente:

python -m venv venv

Ativa o ambuente:

venv\Scripts\activate

Cria o ambiente:

python -m venv venv

Ativa o ambuente:

source venv/bin/activate

Instalando as dependências do projeto

Utilizando a linha de comando, acesse a pasta BotSicalc que criamos nas etapas anteriores e a partir desta pasta rode o comando abaixo para instalar as dependências definidas no arquivo requirements.txt:

pip install --upgrade -r requirements.txt

Este comando vai produzir uma saída grande, referente à instalação de todas as dependências como o botcity-framework-core e outras.

Assim que este processo terminar, seu projeto está pronto para ser executado.

Rodando seu robô

Nosso projeto de template roda um código de exemplo bem simples, que apenas abre seu navegador padrão e carrega a página da BotCity.

Ainda utilizando o terminal aberto dentro da pasta do projeto, você pode executar sua automação BotSicalc com o seguinte comando:

python bot.py

Dica

Você também pode utilizar sua IDE favorita para executar seu projeto localmente.

Aqui está uma captura de tela do resultado esperado:

Python Desktop Result

🌟 Excelente 🌟

Nessa etapa já temos nosso projeto devidamente criado e configurado. Agora, vamos começar a construir nosso processo de automação.

Gerando arquivos de DARF através do aplicativo SiCalc

O aplicativo SiCalc é um programa da Receita Federal que permite a geração de DARF (Documento de Arrecadação de Receitas Federais) de forma simplificada. Você pode fazer o download do aplicativo aqui.

Para este tutorial vamos construir uma automação com o objetivo de acessar o aplicativo do SiCalc e preencher corretamente alguns dados para gerar uma nova DARF, ao final salvar o arquivo em um diretório.

Carregando o projeto no BotCity Studio

Para começar o desenvolvimento da automação vamos carregar o projeto no BotCity Studio, após iniciá-lo e logar usando as suas credenciais, é só acessar a opção File -> Load Project:

Load Project

Feito isso, basta selecionar o arquivo .botproj que está na pasta raiz do projeto criado:

Launch

Ao clicar em Launch o projeto será carregado e você poderá acessar os arquivos pelo BotCity Studio.

Executando o aplicativo SiCalc

Com o projeto carregado, o próximo passo é abrir o aplicativo do SiCalc utilizando o caminho do executável que está instalado na máquina.

Alterando o arquivo bot.py a partir da linha 45, ficará dessa maneira:

# Abre o aplicativo do SiCalc
bot.execute(r"C:\Program Files (x86)\Programas RFB\Sicalc Auto Atendimento\SicalcAA.exe")

Ao executarmos a automação, o aplicativo do SiCalc será aberto:

Acessando SiCalc

Com o aplicativo aberto, podemos tirar um print da tela para utilizarmos como referência no BotCity Studio. Basta apertar a tecla de "Print Screen" para fazer uma captura da tela.

Identificando pop-up da tela inicial

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.

A estratégia que vamos utilizar é procurar por uma âncora e realizar um clique relativo no botão "Continuar".

Voltando ao BotCity Studio, a seleção do nosso recorte ficará dessa maneira:

Pop-up Sicalc

Ao clicarmos em Submit, o seguinte trecho de código será gerado pelo BotCity Studio:

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

Nota

Certifique-se que o cursor está na linha correta onde o código será gerado automaticamente.

Ao rodarmos novamente esse código, 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.

Selecionando opção do menu

A próxima tafera será selecionar a opção para preencher uma nova DARF. Vamos tirar um novo print para atualizar a referência da tela no Studio.

No aplicativo do SiCalc, precisaremos acessar a seguinte opção: "Funções -> Preenchimento de DARF".

No BotCity Studio, podemos fazer o recorte desses elementos da seguinte maneira:

Menu funções

Vamos setar uma ação de clique após encontrar o elemento "Funções", isso fará com que um sub-menu seja aberto.

Com o sub-menu de opções aberto, vamos tirar um novo print para fazermos a seleção da opção "Preenchimento de DARF":

Menu preenchimento DARF

O código gerado pelo BotCity Studio será algo assim:

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

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

Preenchendo formulário inicial

Após selecionar a opção no sub-menu, será aberto um formulário inicial onde precisaremos preencher somente o código da receita.

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

Nesse caso, vamos encontrar a âncora do input "Cód.Receita" e fazer um clique relativo dentro do campo:

Codigo receita

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

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

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

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

# Espera para os campos carregarem
bot.wait(1000)

Preenchendo os dados da DARF

Ao executarmos esse código, será aberto um segundo formulário onde vamos inserir os demais dados da DARF.

Neste momento, a tela será parecida com essa:

Sicalc formulário 2

Atualizando o print da tela no BotCity Studio, vamos precisar encontrar os elementos referentes ao perído de apuração "PA" e ao valor do documento "Valor em Reais":

Periodo apuração

Valor em reais

Incluindo o comando paste() para inserir os dados, nosso código ficará da seguinte maneira:

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

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

O próximo passo é clicarmos no botão "Calcular", para conseguirmos acessar o formulário final:

Botão calcular

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

Dica

Aqui temos a opção de utilizar visão computacional ou o atalho do teclado para executar a ação. Esse trecho de código poderia ser substituído pelo comando bot.enter(), pois a tecla enter aciona o botão de calcular no Sicalc.

Preenchendo formulário final

Para acessarmos o formulário final, vamos clicar no botão "DARF" após o preenchimento dos dados feito anteriormente:

Botão DARF

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

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

Sicalc formulário 3

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.

Os dados que precisamos preencher nesse último formulário serão:

  • Nome
  • Telefone
  • CNPJ
  • Referência

Com todas as âncoras encontradas, o código gerado será semelhante a esse:

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

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

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

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

Salvando o arquivo

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 "Imprimir":

Imprimir DARF

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

Clicando no botão, será aberto a janela do gerenciador de arquivos do Windows:

Salvar arquivo

Neste caso, vamos encontrar a referência dessa janela e simplesmente dar um clique para que ela fique em foco:

Janela salvar

Após isso, podemos utilizar o paste() para informar qual será o caminho do arquivo e o enter() para salvar.

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

# Inserindo path do arquivo
bot.paste(r"C:\Users\aluno\Documents\DARF.pdf")
bot.enter()

Finalizando o processo

Após salvar o arquivo, nosso processo está finalizado!

Podemos agora utilizar o comando alt_f4() para fecharmos o formulário e a janela do SiCalc.

Ao final, nosso código ficará dessa maneira:

def main():
    bot = DesktopBot()

    bot.execute(r"C:\Program Files (x86)\Programas RFB\Sicalc Auto Atendimento\SicalcAA.exe")

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

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

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

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

    # Inserindo no campo um código fictício
    bot.paste("5629")
    bot.tab()
    # Espera para os campos carregarem
    bot.wait(1000)

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

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

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

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

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

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

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

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

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

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

    # Inserindo path do arquivo
    bot.paste(r"C:\Users\aluno\Documents\DARF.pdf")
    bot.enter()

    bot.wait(2000)

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

    # Fechando app do SiCalc
    bot.alt_f4()


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

if __name__ == '__main__':
    main()

Desafio

Desenvolvemos uma automação para o aplicativo SiCalc, onde conseguimos preencher os dados necessários para gerar uma nova DARF e salvar o arquivo em um diretório.

Como desafio, faça melhorias no código, como:

  • Inserir tratamento de exceções.
  • Ler dados de DARF de um arquivo de entrada.
  • Enviar o arquivo gerado por e-mail.

Explore as opções de plugins disponíveis no BotCity Studio para realizar essas tarefas.