Fundamentos de PyAutoGUI para Automação com Python

0/20 aulas0%
projeto

Projeto Guiado: Automação de Preenchimento de Formulário Web

Aprenda sobre projeto guiado: automação de preenchimento de formulário web

45 min
Aula 1 de 4

🤖 Projeto Guiado: Automação de Preenchimento de Formulário Web com PyAutoGUI

Bem-vindos à nossa aula prática! Hoje, vamos mergulhar no mundo da automação de formulários web usando PyAutoGUI. Este projeto guiado irá capacitá-lo a criar scripts que interagem com navegadores, preenchendo campos e clicando em botões, assim como um humano faria.

🎯 1. Introdução

No ambiente digital atual, o preenchimento de formulários é uma tarefa comum, mas muitas vezes repetitiva e tediosa. Seja para entrada de dados, testes de software ou simplesmente para agilizar processos, a automação pode ser uma mão na roda.

Nesta aula, vamos construir um script em Python que utiliza a biblioteca PyAutoGUI para:

  • Abrir um navegador web.
  • Navegar até uma página com um formulário simples.
  • Preencher os campos do formulário com dados predefinidos.
  • Clicar no botão de envio.

Este projeto é um excelente ponto de partida para entender como o PyAutoGUI interage com aplicações gráficas, simulando as ações de um usuário.

Pré-requisitos:

  • Python 3.x instalado.
  • PyAutoGUI instalado (pip install pyautogui).
  • Um navegador web (Chrome, Firefox, Edge, etc.).

📖 2. Explicação Detalhada com Exemplos

Vamos seguir um roteiro passo a passo para construir nosso script de automação.

2.1. Preparando o Ambiente e o Formulário de Teste

Para que nosso script tenha um formulário para interagir, vamos criar um arquivo HTML simples. Salve o conteúdo abaixo como form_teste.html em uma pasta de sua escolha (ex: C:\automacao\form_teste.html ou /home/usuario/automacao/form_teste.html).

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Formulário de Teste PyAutoGUI</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; background-color: #f4f4f4; }
        .container { background-color: #fff; padding: 30px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); max-width: 500px; margin: auto; }
        h1 { text-align: center; color: #333; }
        label { display: block; margin-bottom: 8px; font-weight: bold; color: #555; }
        input[type="text"], input[type="email"], textarea {
            width: calc(100% - 20px);
            padding: 10px;
            margin-bottom: 15px;
            border: 1px solid #ddd;
            border-radius: 4px;
            box-sizing: border-box;
        }
        textarea { resize: vertical; min-height: 100px; }
        button {
            background-color: #007bff;
            color: white;
            padding: 12px 20px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            font-size: 16px;
            width: 100%;
        }
        button:hover { background-color: #0056b3; }
        .message { margin-top: 20px; padding: 15px; border-radius: 5px; background-color: #e9f7ef; border: 1px solid #d4edda; color: #155724; display: none; }
    </style>
</head>
<body>
    <div class="container">
        <h1>Preencha o Formulário!</h1>
        <form id="myForm">
            <label for="nome">Nome Completo:</label>
            <input type="text" id="nome" name="nome" required>
 
            <label for="email">Email:</label>
            <input type="email" id="email" name="email" required>
 
            <label for="mensagem">Mensagem:</label>
            <textarea id="mensagem" name="mensagem" required></textarea>
 
            <button type="submit">Enviar Dados</button>
        </form>
        <div id="successMessage" class="message">
            Formulário enviado com sucesso! 🎉
        </div>
    </div>
 
    <script>
        document.getElementById('myForm').addEventListener('submit', function(event) {
            event.preventDefault(); // Impede o envio real do formulário
            document.getElementById('successMessage').style.display = 'block';
            // Você pode adicionar aqui um código para "limpar" o formulário ou fazer algo mais
            console.log('Formulário simulado enviado!');
        });
    </script>
</body>
</html>

2.2. Configurando o PyAutoGUI e Abrindo o Navegador

Vamos começar importando o PyAutoGUI e configurando algumas de suas melhores práticas:

  • pyautogui.PAUSE: Define um atraso em segundos entre cada chamada de função do PyAutoGUI. Isso é crucial para dar tempo para o sistema operacional e as aplicações reagirem.
  • pyautogui.FAILSAFE: Se True, mover o mouse para o canto superior esquerdo da tela irá abortar o programa imediatamente. Essencial para evitar que seu script saia do controle!
import pyautogui
import time
import subprocess
import os
 
# --- Configurações de Segurança e Estabilidade ---
pyautogui.PAUSE = 0.5  # Pausa de 0.5 segundos entre cada ação do pyautogui
pyautogui.FAILSAFE = True # Ativa o failsafe: mova o mouse para o canto superior esquerdo para parar
 
# --- Caminho para o seu arquivo HTML ---
# Adapte este caminho para onde você salvou o 'form_teste.html'
HTML_FILE_PATH = os.path.abspath("form_teste.html") # Assume que está na mesma pasta do script
FORM_URL = f"file:///{HTML_FILE_PATH.replace('\\', '/')}" # URL local do arquivo
 
print(f"URL do formulário: {FORM_URL}")
 
def abrir_navegador(url):
    """Abre o navegador padrão e navega para a URL especificada."""
    try:
        # Tenta abrir com o navegador padrão do sistema
        print(f"Abrindo navegador para: {url}")
        if os.name == 'nt': # Windows
            os.startfile(url)
        elif os.uname().sysname == 'Darwin': # macOS
            subprocess.Popen(['open', url])
        else: # Linux
            subprocess.Popen(['xdg-open', url])
        time.sleep(5) # Dá um tempo para o navegador abrir e carregar a página
        print("Navegador aberto com sucesso!")
    except Exception as e:
        print(f"Erro ao abrir o navegador: {e}")
        print("Por favor, abra o navegador manualmente e navegue para a URL:")
        print(url)
        input("Pressione Enter quando o navegador estiver pronto...")
 
# --- Execução ---
# abrir_navegador(FORM_URL)

Explicação:

  • A função abrir_navegador tenta abrir o arquivo HTML diretamente no navegador padrão do seu sistema.
  • time.sleep(5) é um atraso inicial para garantir que o navegador tenha tempo de carregar a página. Ajuste se necessário.
  • os.path.abspath garante que o caminho do arquivo seja absoluto, o que é importante para URLs locais.
  • replace('\\', '/') é necessário para Windows, pois URLs usam barras /.

2.3. Preenchendo os Campos do Formulário

Agora, vamos interagir com os campos do formulário. Podemos fazer isso de duas maneiras principais:

  1. Navegação por Tab: Clicar no primeiro campo e depois usar a tecla Tab para mover entre os campos. É simples, mas depende da ordem dos elementos na página.
  2. locateOnScreen(): Localizar campos ou elementos por imagem. Mais robusto, mas requer imagens dos elementos e pode ser sensível a mudanças na interface.

Para este projeto guiado, vamos usar uma combinação, focando na simplicidade com Tab e introduzindo locateOnScreen para o botão de enviar como uma melhor prática.

2.3.1. Preenchendo com Navegação por Tab

Assumindo que você abriu a página e ela está em foco:

# ... (código anterior) ...
 
def preencher_formulario_tab():
    """Preenche o formulário usando navegação por tabulação."""
    print("Iniciando preenchimento do formulário via TAB...")
 
    # Clica em uma área aproximada do primeiro campo (Nome Completo)
    # Você pode precisar ajustar estas coordenadas!
    # Uma forma de descobrir as coordenadas é usar:
    # print(pyautogui.position()) # execute este comando no terminal e mova o mouse para o campo
    # Ou use o locateOnScreen para encontrar o label "Nome Completo" e clicar perto dele.
    
    # Para simplicidade, vamos tentar clicar no centro da tela e depois usar TAB
    # ou, melhor, tentar localizar o label "Nome Completo"
    try:
        nome_label_location = pyautogui.locateOnScreen('nome_completo_label.png', confidence=0.8)
        if nome_label_location:
            pyautogui.click(nome_label_location.left + 100, nome_label_location.top + 15) # Clica próximo ao label
            print("Clicou no campo 'Nome Completo' usando locateOnScreen.")
        else:
            print("Label 'Nome Completo' não encontrado. Tentando clicar em uma posição genérica.")
            # Se não encontrar o label, tenta clicar em uma posição central ou conhecida
            # Isso é menos robusto, mas serve para demonstração se a imagem falhar.
            pyautogui.click(pyautogui.size().width / 2, pyautogui.size().height / 2 - 100) # Exemplo de clique central
            print("Clicou em uma posição genérica. Pressione Tab para focar no primeiro campo.")
            pyautogui.press('tab') # Garante que o primeiro campo está focado
    except pyautogui.ImageNotFoundException:
        print("Imagem 'nome_completo_label.png' não encontrada. Tentando clicar em uma posição genérica.")
        pyautogui.click(pyautogui.size().width / 2, pyautogui.size().height / 2 - 100)
        pyautogui.press('tab') # Garante que o primeiro campo está focado
    except Exception as e:
        print(f"Erro ao tentar clicar no campo 'Nome Completo': {e}")
        print("Por favor, certifique-se de que o navegador está visível e o formulário carregado.")
        return
 
    pyautogui.write('Seu Nome Automatizado')
    pyautogui.press('tab') # Move para o campo Email
    pyautogui.write('automacao@example.com')
    pyautogui.press('tab') # Move para o campo Mensagem
    pyautogui.write('Esta é uma mensagem automatizada do PyAutoGUI.')
    print("Campos preenchidos via TAB.")
 
# --- Para usar locateOnScreen, você precisaria de uma imagem do label "Nome Completo". ---
# Crie um screenshot pequeno apenas do texto "Nome Completo:" e salve como 'nome_completo_label.png'
# Exemplo de como fazer um screenshot de uma área:
# pyautogui.screenshot('nome_completo_label.png', region=(x, y, width, height))
# Ou use a ferramenta de captura de tela do seu sistema operacional.

Dica para locateOnScreen: Para usar locateOnScreen, você precisa de uma imagem (.png) do elemento que deseja encontrar.

  1. Abra o form_teste.html no seu navegador.
  2. Use uma ferramenta de captura de tela (ex: Snipping Tool no Windows, Cmd+Shift+4 no macOS, Spectacle no Linux) para tirar um pequeno print apenas do texto "Nome Completo:" e salve como nome_completo_label.png na mesma pasta do seu script Python.
  3. Faça o mesmo para o botão "Enviar Dados", salvando como botao_enviar.png.

2.3.2. Clicando no Botão de Enviar com locateOnScreen()

Após preencher os campos, precisamos clicar no botão de envio. locateOnScreen() é ideal aqui para encontrar o botão de forma robusta.

# ... (código anterior) ...
 
def clicar_botao_enviar():
    """Localiza e clica no botão de enviar."""
    print("Tentando localizar e clicar no botão 'Enviar Dados'...")
    try:
        # Tente localizar o botão "Enviar Dados" usando uma imagem
        # Certifique-se de ter uma imagem 'botao_enviar.png' do botão
        # com um bom nível de confiança (confidence)
        submit_button_location = pyautogui.locateOnScreen('botao_enviar.png', confidence=0.9)
        
        if submit_button_location:
            pyautogui.click(submit_button_location)
            print("Botão 'Enviar Dados' clicado com sucesso!")
            time.sleep(2) # Dá um tempo para a mensagem de sucesso aparecer
            print("Verificando mensagem de sucesso...")
            # Opcional: tentar localizar a mensagem de sucesso
            # success_message_location = pyautogui.locateOnScreen('success_message.png', confidence=0.9)
            # if success_message_location:
            #     print("Mensagem de sucesso encontrada! Formulário enviado.")
            # else:
            #     print("Mensagem de sucesso não encontrada.")
        else:
            print("Botão 'Enviar Dados' não encontrado na tela. Tentando via TAB/Enter.")
            # Se não encontrar a imagem, tenta ir para o botão via TAB e pressionar ENTER
            pyautogui.press('tab') # Garante que o foco está no próximo elemento após a mensagem
            pyautogui.press('enter') # Pressiona Enter para submeter (se o botão estiver focado)
            print("Tentativa de envio via TAB/Enter.")
 
    except pyautogui.ImageNotFoundException:
        print("Imagem 'botao_enviar.png' não encontrada. Tentando via TAB/Enter.")
        pyautogui.press('tab')
        pyautogui.press('enter')
    except Exception as e:
        print(f"Erro ao clicar no botão de enviar: {e}")
        print("Por favor, verifique se o botão está visível e a imagem 'botao_enviar.png' está correta.")
 

2.4. Integrando Tudo: O Script Completo

Vamos juntar todas as partes em um único script Python.

import pyautogui
import time
import subprocess
import os
 
# --- Configurações de Segurança e Estabilidade ---
pyautogui.PAUSE = 0.5  # Pausa de 0.5 segundos entre cada ação do pyautogui
pyautogui.FAILSAFE = True # Ativa o failsafe: mova o mouse para o canto superior esquerdo para parar
 
# --- Caminho para o seu arquivo HTML ---
# Adapte este caminho para onde você salvou o 'form_teste.html'
# Certifique-se de que o arquivo 'form_teste.html' está na mesma pasta do seu script Python
HTML_FILE_PATH = os.path.abspath("form_teste.html")
FORM_URL = f"file:///{HTML_FILE_PATH.replace('\\', '/')}" # URL local do arquivo
 
print(f"URL do formulário: {FORM_URL}")
 
def abrir_navegador(url):
    """Abre o navegador padrão e navega para a URL especificada."""
    try:
        print(f"Abrindo navegador para: {url}")
        if os.name == 'nt': # Windows
            os.startfile(url)
        elif os.uname().sysname == 'Darwin': # macOS
            subprocess.Popen(['open', url])
        else: # Linux
            subprocess.Popen(['xdg-open', url])
        time.sleep(5) # Dá um tempo para o navegador abrir e carregar a página
        print("Navegador aberto com sucesso!")
    except Exception as e:
        print(f"Erro ao abrir o navegador: {e}")
        print("Por favor, abra o navegador manualmente e navegue para a URL:")
        print(url)
        input("Pressione Enter quando o navegador estiver pronto...")
 
def preencher_formulario():
    """Preenche o formulário usando locateOnScreen para o primeiro campo e depois TABs."""
    print("Iniciando preenchimento do formulário...")
 
    # Tenta encontrar o label "Nome Completo" e clicar no campo de texto associado
    try:
        # Você precisará de uma imagem 'nome_completo_label.png'
        # que contenha o texto "Nome Completo:" do seu formulário.
        # Ajuste a confiança se necessário.
        nome_label_location = pyautogui.locateOnScreen('nome_completo_label.png', confidence=0.8)
        
        if nome_label_location:
            # Clica um pouco à direita do label para acertar o campo de input
            pyautogui.click(nome_label_location.left + nome_label_location.width + 10, nome_label_location.top + nome_label_location.height / 2)
            print("Clicou no campo 'Nome Completo' usando locateOnScreen.")
        else:
            print("Label 'Nome Completo' não encontrado. Tentando focar no primeiro campo com TAB.")
            # Se não encontrar o label, pode ser necessário clicar em uma posição genérica
            # e depois usar TAB para focar no primeiro campo.
            # pyautogui.click(x, y) # Coordenadas aproximadas do primeiro campo
            pyautogui.press('tab') # Tenta focar no primeiro campo
            print("Focado no primeiro campo com TAB.")
 
    except pyautogui.ImageNotFoundException:
        print("Imagem 'nome_completo_label.png' não encontrada. Tentando focar no primeiro campo com TAB.")
        pyautogui.press('tab') # Tenta focar no primeiro campo
        print("Focado no primeiro campo com TAB.")
    except Exception as e:
        print(f"Erro ao tentar focar no campo 'Nome Completo': {e}")
        print("Por favor, certifique-se de que o navegador está visível e o formulário carregado.")
        return
 
    # Preenche os campos
    pyautogui.write('Seu Nome Automatizado')
    pyautogui.press('tab') # Move para o campo Email
    pyautogui.write('automacao@example.com')
    pyautogui.press('tab') # Move para o campo Mensagem
    pyautogui.write('Esta é uma mensagem automatizada do PyAutoGUI. Que legal!')
    print("Campos de texto preenchidos.")
 
def clicar_botao_enviar():
    """Localiza e clica no botão de enviar."""
    print("Tentando localizar e clicar no botão 'Enviar Dados'...")
    try:
        # Você precisará de uma imagem 'botao_enviar.png'
        # que contenha o texto "Enviar Dados" do seu formulário.
        submit_button_location = pyautogui.locateOnScreen('botao_enviar.png', confidence=0.9)
        
        if submit_button_location:
            pyautogui.click(submit_button_location)
            print("Botão 'Enviar Dados' clicado com sucesso!")
            time.sleep(2) # Dá um tempo para a mensagem de sucesso aparecer
        else:
            print("Botão 'Enviar Dados' não encontrado na tela (via imagem). Tentando via TAB/Enter.")
            pyautogui.press('tab') # Garante que o foco está no botão (se já não estiver)
            pyautogui.press('enter') # Pressiona Enter para submeter
            print("Tentativa de envio via TAB/Enter.")
 
    except pyautogui.ImageNotFoundException:
        print("Imagem 'botao_enviar.png' não encontrada. Tentando via TAB/Enter.")
        pyautogui.press('tab')
        pyautogui.press('enter')
    except Exception as e:
        print(f"Erro ao clicar no botão de enviar: {e}")
        print("Por favor, verifique se o botão está visível e a imagem 'botao_enviar.png' está correta.")
 
# --- Função Principal de Automação ---
def main():
    print("Iniciando o projeto de automação de formulário web...")
    abrir_navegador(FORM_URL)
    
    # É crucial que o navegador esteja em foco e o formulário visível.
    # Se o navegador abrir em segundo plano ou minimizado, o PyAutoGUI não funcionará.
    # Você pode usar pyautogui.hotkey('alt', 'tab') ou similar para focar se necessário.
    print("Aguardando 3 segundos antes de preencher o formulário para garantir o foco...")
    time.sleep(3) 
 
    preencher_formulario()
    clicar_botao_enviar()
    
    print("Automação de formulário concluída!")
 
if __name__ == "__main__":
    main()

🚨 Dicas Importantes para Execução:

  • Foco da Janela: O PyAutoGUI interage com a janela que está em foco. Certifique-se de que o navegador com o formulário esteja na frente e não minimizado quando o script tentar interagir.
  • Resolução da Tela: locateOnScreen() é sensível à resolução da tela e ao zoom do navegador. Mantenha-os consistentes.
  • Imagens de Referência: As imagens nome_completo_label.png e botao_enviar.png devem ser capturas exatas dos elementos na tela. Pequenas variações (cor, tamanho da fonte, etc.) podem fazer com que locateOnScreen falhe. Use a ferramenta de captura de tela do seu sistema para criá-las.
  • confidence: O parâmetro confidence em locateOnScreen (requer pip install opencv-python) ajuda a encontrar correspondências "quase perfeitas". Ajuste-o entre 0 e 1 (onde 1 é uma correspondência exata).

🚀 3. Código de Exemplo Oficial (Melhores Práticas)

Embora não exista um "código oficial" para este projeto específico na documentação do PyAutoGUI, o script acima incorpora as melhores práticas recomendadas pela biblioteca:

  • pyautogui.PAUSE: Essencial para a estabilidade.
  • pyautogui.FAILSAFE: Uma rede de segurança vital.
  • Uso de locateOnScreen(): Preferível a coordenadas fixas, que são frágeis a mudanças de resolução ou layout.
  • Tratamento de Exceções: Capturar ImageNotFoundException para lidar com cenários onde um elemento não é encontrado.
  • time.sleep(): Usado estrategicamente para dar tempo às aplicações para carregar ou reagir.

🤝 4. Integração de Múltiplas Tecnologias

Neste projeto, estamos integrando Python com PyAutoGUI para controlar um Navegador Web. A beleza do PyAutoGUI é que ele atua no nível da interface gráfica do usuário (GUI), o que significa que ele não se importa com a tecnologia subjacente do aplicativo (se é HTML, WPF, Java Swing, etc.). Ele simula as ações de um usuário humano:

  1. Python como orquestrador: O script Python é o cérebro que decide quais ações tomar e em que ordem.
  2. PyAutoGUI como braço e mão: Traduz os comandos Python em movimentos de mouse, cliques e digitação de teclado.
  3. Navegador Web como interface: Recebe as interações do PyAutoGUI e exibe o resultado, como se um humano estivesse interagindo.

Essa abordagem "caixa preta" torna o PyAutoGUI extremamente versátil para automação de qualquer aplicativo GUI.

🏋️‍♀️ 5. Exercícios/Desafios

Para solidificar seu aprendizado, tente os seguintes desafios:

✅ Tarefas Essenciais:

  • Crie o arquivo form_teste.html e salve-o em uma pasta.
  • Crie os arquivos de imagem nome_completo_label.png e botao_enviar.png a partir do seu navegador.
  • Execute o script Python completo e observe a automação.
  • Ajuste o pyautogui.PAUSE e observe como isso afeta a velocidade e a estabilidade.
  • Teste o pyautogui.FAILSAFE movendo o mouse para o canto superior esquerdo durante a execução.

💡 Desafios Adicionais:

  • Adicionar mais campos: Modifique o form_teste.html para incluir um campo de checkbox (ex: "Aceito os termos") e um select (dropdown, ex: "País").
    • Atualize o script Python para interagir com esses novos campos. Para o checkbox, use pyautogui.press('space') quando focado. Para o dropdown, você pode usar pyautogui.press('down') várias vezes e pyautogui.press('enter').
  • Automação orientada a dados: Crie um arquivo dados.csv com várias linhas de dados (Nome, Email, Mensagem).
    • Modifique o script para ler cada linha do CSV e preencher o formulário para cada conjunto de dados.
    • Adicione um time.sleep() após cada envio para simular um pequeno intervalo entre os envios.
  • Verificação de sucesso: Após clicar no botão "Enviar Dados", tente usar pyautogui.locateOnScreen() para encontrar a mensagem "Formulário enviado com sucesso! 🎉" que aparece no form_teste.html.
    • Se a mensagem for encontrada, imprima "Sucesso na automação!"
    • Se não for encontrada, imprima "Falha na automação ou mensagem de sucesso não detectada."
  • Tratamento de erros aprimorado: Implemente mais blocos try-except para lidar com situações onde um elemento não é encontrado (ex: se o navegador não abrir, ou se a página não carregar corretamente).
  • Fechar o navegador: Adicione código para fechar o navegador após a automação. Isso pode ser feito com pyautogui.hotkey('alt', 'f4') (Windows/Linux) ou pyautogui.hotkey('command', 'w') (macOS) se o navegador estiver em foco.

📝 6. Resumo e Próximos Passos

Parabéns! Você completou um projeto guiado de automação de formulários web com PyAutoGUI. Nesta aula, você aprendeu a:

  • Configurar o ambiente para automação com PyAutoGUI.
  • Utilizar pyautogui.PAUSE e pyautogui.FAILSAFE para segurança e estabilidade.
  • Abrir aplicações externas (navegadores) via Python.
  • Interagir com campos de texto e botões usando pyautogui.write(), pyautogui.press(), pyautogui.click(), e pyautogui.locateOnScreen().
  • Entender a integração do PyAutoGUI com outras tecnologias no nível da GUI.

Próximos Passos:

  • Explore mais o PyAutoGUI: Consulte a documentação oficial do PyAutoGUI para descobrir outras funções, como hotkey(), scroll(), e mais opções de locateOnScreen().
  • Projetos mais complexos: Tente automatizar outras tarefas repetitivas no seu dia a dia, como login em sites, download de relatórios, ou interação com softwares desktop.
  • Combinar com outras bibliotecas: Para automação web mais robusta (onde você precisa interagir com o DOM da página), considere aprender bibliotecas como Selenium ou Playwright. PyAutoGUI é excelente para automação de GUI, mas para web-specific, ferramentas como Selenium oferecem mais controle e estabilidade.

Continue praticando e explorando! A automação é uma habilidade poderosa que pode economizar muito tempo e esforço. 🚀✨

© 2025 Escola All Dev. Todos os direitos reservados.

Projeto Guiado: Automação de Preenchimento de Formulário Web - Fundamentos de PyAutoGUI para Automação com Python | escola.all.dev.br