Não categorizado

Logs em Python para automação RPA [+exemplo]

Logs são cruciais, pois ajudam no gerenciamento da aplicação, nos permitindo ter insights sobre o comportamento da aplicação, os erros, as exceções e quais foram as tarefas realizadas. No contexto de automação RPA, a integração de logs é essencial para ajudar na transparência e proporcionar suporte para solucionar problemas de forma eficiente. Neste artigo, exploraremos o uso de logs em automações RPA, destacando a importância de sua implementação e exemplos de como fazer isso com Python, uma linguagem de programação de grande importância nessa área de desenvolvimento.

Logs em Python

Logs em Python pode ser um importante apoio na hora de desenvolver a sua automação RPA, visto que a linguagem Python pode ser uma escolha inteligente, devido a popularidade e simplicidade da linguagem, além do vasto suporte e disponibilidade de bibliotecas e frameworks que podem facilitar o processo de desenvolvimento.

Saiba mais sobre as vantagens do Python para RPA: comparação de Python RPA vs Low-code.

Log pode ser um registro cronológico de ações e eventos que podem acontecer dentro da sua automação. Esse mesmo log pode ser de diversos tipos e até mesmo retornar informações que sejam necessárias para a compreensão do que estava acontecendo naquele determinado momento e o motivo.

Tipos de Logs em RPA

Logs em RPA podem variar, de acordo com a realidade do negócio. Por isso é importante entender quais são os tipos de logs que seu time precisa considerar para a automação:

  • Logs de execução: Esses logs referem-se ao que está sendo executado no código desenvolvido para seu projeto RPA. Podem ser, por exemplo, as “exceptions”, que são os erros técnicos que aconteceram;
  • Logs de segurança: Esses logs têm contexto mais específico sobre a segurança da sua automação, pois ela também é um projeto de software e é importante considerar a qualidade e segurança do código e das informações trafegadas em cada etapa de execução;
  • Logs relacionados ao negócio: Esses logs têm contexto do processo que está sendo executado pelo robô, contendo informações como qual tarefa foi executada, em qual etapa o robô está em determinado momento, quais são os dados etc.;
  • Entre outros.

Estrutura de logs em Python para automação RPA

A estrutura desses logs podem variar de acordo com a necessidade e os requisitos do negócio a ser atendido. Porém é importante ter pelo menos a data e horário do ocorrido, a mensagem correspondente ao evento, alguma identificação que tenha relação com o contexto, entre outros.

Como desenvolver e consultar os logs em RPA?

Agora vamos para a parte prática. Nos próximos tópicos, vamos acompanhar um exemplo de como desenvolver seus logs utilizando o framework Python da BotCity e como disponibilizar seus logs para serem acompanhados pelo seu time e sua gestão, utilizando o BotCity Orquestrador.

No Orquestrador você pode criar logs independentemente das outras entidades da arquitetura das automações. E para conectá-la ao nosso robô, podemos utilizar o BotCity Maestro SDK.

Exemplo de robô para desenvolver os logs

Como exemplo, vamos utilizar um robô desenvolvido em Selenium e Python que realiza login na página Practice Test Automation. O robô deverá abrir a página, fazer o login, confirmar que o login aconteceu e, em seguida, fazer o logout e confirmar que funcionou. Caso queira seguir o mesmo exemplo, crie uma pasta no seu computador e, dentro dela, adicione:

  • um arquivo chamado requirements.txt;
  • um arquivo chamado bot.py;
  • o webdriver de acordo com o seu navegador.

Arquivo requirements.txt com as dependências e bibliotecas:

selenium==4.10.0 
webdriver-manager==3.8.5

Arquivo bot.py com o código principal:

from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service


# using as constants for example only 
# in a real scenario, this should be passed as parameters or using credentials feature
USERNAME = "student"
PASSWORD = "Password123"

def main():
    try:
        # set WebDriver path
        service = Service(executable_path=r"geckodriver.exe")

        # create a bot instance
        bot = webdriver.Firefox(service=service)

        # access the page Practice Test Automation
        bot.get("https://practicetestautomation.com/practice-test-login/")

        # search for the element input to add username
        input_username = bot.find_element(By.ID, "username")

        # add the username
        input_username.send_keys(USERNAME)

        # search for the password element
        input_password = bot.find_element(By.ID, "password")

        # add the password
        input_password.send_keys(PASSWORD)

        # search for the button element
        input_button = bot.find_element(By.ID, "submit")

        # click on the button
        input_button.click()

        # wait 3 seconds to ensure that the page opened
        sleep(3)

        # search for the login confirmation
        logged = bot.find_element(By.CSS_SELECTOR, ".post-title")

        # print confirmation text
        print(logged.text)        

        # search for the logout button element
        logout = bot.find_element(By.CSS_SELECTOR, ".wp-block-button__link")

        # click on the button
        logout.click()

        # search for the login title to ensure that the logout finished
        bot.find_element(By.CSS_SELECTOR, "#login > h2:nth-child(1)")

    except Exception as ex:
        # search for the element with the error message
        error_alert = bot.find_element(By.ID, "error")

        # print the error message and stacktrace
        print(error_alert.text)
        print(ex)

    finally:
        # close the browser
        bot.quit()

        # print the message
        print("Finally")

if __name__ == "__main__":
    main()

Antes de executar o código, lembre-se de que você deve instalar as dependências com o seguinte comando no seu terminal, dentro da pasta do projeto:

python -m pip install --upgrade -r requirements.txt

Para que você possa ter usuário e senha protegidos para utilizar na sua automação, conforme indicado nos comentários do código, siga as instruções da documentação sobre credenciais.

Como adicionar o framework da BotCity ao projeto Selenium

Você pode fazer a instalação conforme o comando a seguir:

pip install botcity-maestro-sdk

No arquivo das dependências, o requirements.txt, vamos adicionar a biblioteca: botcity-maestro-sdk. E no código do arquivo bot.py, vamos adicionar a seguinte importação:

from botcity.maestro import *

No código principal, do arquivo bot.py, vamos criar a instância do BotCity Maestro SDK:

def main():
    # instantiating the Maestro SDK
    maestro = BotMaestroSDK.from_sys_args()
    execution = maestro.get_execution()
    …

Como criar um log

Vamos começar essa etapa, criando o log dentro do BotCity Orquestrador. No menu localizado na lateral esquerda da tela, identifique a categoria “Automation Control”. Nela, teremos a opção “Execution Log”.

Tela de início do BotCity Orquestrador, com destaque no menu da lateral esquerda, mostrando a opção "Execution Logs".

Ao entrar na opção “Execution log”, clique em “new log”:

Print com foco na tela Execution Log, apontando no lado direito para o botão "New Log".

Após isso, vamos preencher as informações solicitadas e adicionar as colunas necessárias para nosso projeto e, ao final, clicar no botão “create log”. Neste caso, adicionamos a coluna “username” com o nome “User” e tamanho de 200 caracteres e também a coluna “message” com o nome “Message” e tamanho de 500 caracteres. Ambas as colunas deverão ficar visíveis.

Tela de criação do log solicitando as informações descritas no trecho acima do texto do artigo.

A coluna “Date” é criada automaticamente, não é necessário adicioná-la. E o log já estará disponível para os repositórios que tiverem acesso a ele:

Tela da lista de logs, mostrando que o nosso log "login_control" foi criado.

Saiba mais em: documentação de logs.

Agora que já temos o log criado no Orquestrador, precisamos conectá-lo ao nosso código, para que, de fato, os logs sejam registrados lá. Então em nosso código principal, vamos adicionar o código que faz a criação do log.

Mas antes disso, vamos também configurar a finalização da tarefa para que, quando façamos a execução pelo Orquestrador, ele possa entender que a tarefa finalizou com sucesso ou com erro.

Dentro do trecho de código do try e except, vamos adicionar:

try:
    …
    finish_status = AutomationTaskFinishStatus.SUCCESS
    finish_message = f'Task with username "{USERNAME}" executed with success'

except Exception as ex:
    …
    finish_status = AutomationTaskFinishStatus.FAILED
    finish_message = f'Task with username "{USERNAME}" failed: {error_alert.text}'

No código acima, estamos informando o status da tarefa de acordo com a execução do robô e também uma mensagem para que seja possível entender o que aconteceu.

No código finally, vamos adicionar:

finally:
       …
        # finish the task
        maestro.finish_task(
            task_id=execution.task_id,
            status=finish_status,
            message=finish_message
        )

        # create the log
        maestro.new_log_entry(
            activity_label="login_control",
            values = {
                "username": USERNAME,
                "message": finish_message
            } 
        )

Como acompanhar os logs no BotCity Orquestrador

Caso você queira executar o robô localmente, para que consiga se conectar ao Orquestrador, você precisa adicionar primeiro esse código para fazer login na ferramenta:

maestro.login(
        server="adicione o server aqui", 
        login="adicione o login aqui",
        key="adicione a chave aqui"
    )

Para saber qual é o login e a key para esse login ser feito com sucesso, você deverá acessar a área chamada “Dev Environment” pelo menu da lateral esquerda do seu Orquestrador. Saiba mais em: documentação de Dev Environment.

⚠️Lembre-se de que este trecho de código servirá apenas para executar localmente. Você deve retirar esse código antes de disponibilizar o robô no orquestrador para ser executado automaticamente.

Mas também podemos executar dentro do Orquestrador. Para isso, a primeira etapa será fazer o deploy da sua automação seguindo as orientações do tutorial de orquestração da sua automação.

Após o deploy, crie uma tarefa do tipo teste. Isso porque, caso seja necessário, podemos executar a tarefa novamente sem problemas.

Para criar a tarefa, clique na opção “New Task” do menu da lateral esquerda do Orquestrador e escolha a sua automação. No nosso exemplo, chamamos de bot-login. Ao identificá-la, clique em “New Task”, o botão localizado ao final da linha.

Tela "New task" com o filtro feito a partir do nome do robô "bot-login" para que ele fique em evidência para criar a tarefa.

Deixe selecionada a checkbox chamada “Test Task” e clique no botão “Create”:

Tela da criação da tarefa com o formulário para preenchimento. Em destaque mostrando o campo "Task Test" selecionado conforme orientado no texto.

OBS: Lembre-se de deixar o runner vinculado durante o processo de deploy disponível para que consiga executar a tarefa. Mais informações no guia sobre como gerenciar a execução das suas automações.

Após a execução da tarefa, você pode ir até a tela de “Execution Log”, identificar o log criado e verificar se ele foi preenchido corretamente. Atenção para o filtro de período para garantir que o log que você está procurando poderá ser visualizado.

Tela do log criado "login-control" mostrando que um log foi registrado e que a execução aconteceu com sucesso.

Como fazer download dos logs

Para fazer o download dos logs, você pode clicar no botão “Export”, localizado acima do log e escolher um dos formatos disponíveis: json, csv ou excel.

 Print da tela com foco no log criado e os botões superiores. Em destaque, o botão Export está com seu menu aberto mostrando as opções json, csv e excel.

Outras ações com os logs

Para fazer edição dos logs, deletá-los ou ainda mudá-los de repositório, basta clicar no botão “Actions” localizado acima do log e escolher uma das opções.

Print da tela com foco no log criado e os botões superiores. Em destaque, o botão Actions está com seu menu aberto mostrando as opções edit, delete, move to repostiory.

⚠️ Se você deletar o log, esta operação apagará todo o histórico de logs e não poderá ser revertido.

Código completo do projeto

from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service

from botcity.maestro import *

# using as constants for example only 
# in a real scenario, this should be passed as parameters or using credentials feature
USERNAME = "student"
PASSWORD = "Password123"

def main():

    # instantiating the Maestro SDK
    maestro = BotMaestroSDK.from_sys_args()
    execution = maestro.get_execution()

    try:
        # set WebDriver path
        service = Service(executable_path=r"geckodriver.exe")

        # create a bot instance
        bot = webdriver.Firefox(service=service)

        # access the page Practice Test Automation
        bot.get("https://practicetestautomation.com/practice-test-login/")

        # search for the element input to add username
        input_username = bot.find_element(By.ID, "username")

        # add the username
        input_username.send_keys(USERNAME)

        # search for the password element
        input_password = bot.find_element(By.ID, "password")

        # add the password
        input_password.send_keys(PASSWORD)

        # search for the button element
        input_button = bot.find_element(By.ID, "submit")

        # click on the button
        input_button.click()

        # wait 3 seconds to ensure that the page opened
        sleep(3)

        # search for the login confirmation
        logged = bot.find_element(By.CSS_SELECTOR, ".post-title")

        # print confirmation text
        print(logged.text)        

        # search for the logout button element
        logout = bot.find_element(By.CSS_SELECTOR, ".wp-block-button__link")

        # click on the button
        logout.click()

        # search for the login title to ensure that the logout finished
        bot.find_element(By.CSS_SELECTOR, "#login > h2:nth-child(1)")

        finish_status = AutomationTaskFinishStatus.SUCCESS
        finish_message = f'Task with username "{USERNAME}" executed with success'

    except Exception as ex:
        # search for the element with the error message
        error_alert = bot.find_element(By.ID, "error")

        # print the error message and stacktrace
        print(error_alert.text)
        print(ex)

        finish_status = AutomationTaskFinishStatus.FAILED
        finish_message = f'Task with username "{USERNAME}" failed: {error_alert.text}'

    finally:
        # close the browser
        bot.quit()

        # print the message
        print("Finally")

        # finish the task
        maestro.finish_task(
            task_id=execution.task_id,
            status=finish_status,
            message=finish_message
        )

        # create the log
        maestro.new_log_entry(
            activity_label="login_control",
            values = {
                "username": USERNAME,
                "message": finish_message
            } 
        )

if __name__ == "__main__":
    main()

Quer começar a gerenciar melhor sua automação com o uso dos logs?

Para ir mais a fundo neste assunto, te convidamos a participar da nossa comunidade global de RPA, é só entrar no nosso Slack ou ainda entrar em contato pelo nosso fórum. Qualquer dúvida, só chamar a gente! E não esqueça de criar a sua conta gratuita para testar as funcionalidades que estamos explorando em nossos conteúdos. Ao criar suas automações para aprender como utilizar a ferramenta, lembre-se de compartilhar com a comunidade pelo Repositório de Bots.

BotCity Cofounder and CEO

Deixe uma resposta

Descubra mais sobre Blog BotCity - Conteúdo para Automação e Governança

Assine agora mesmo para continuar lendo e ter acesso ao arquivo completo.

Continue reading