Fundamentos de PyAutoGUI para Automação com Python
Projeto Guiado: Automação de Preenchimento de Formulário Web
Aprenda sobre projeto guiado: automação de preenchimento de formulário web
🤖 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: SeTrue, 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_navegadortenta 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.abspathgarante 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:
- Navegação por
Tab: Clicar no primeiro campo e depois usar a teclaTabpara mover entre os campos. É simples, mas depende da ordem dos elementos na página. 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.
- Abra o
form_teste.htmlno seu navegador. - 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.pngna mesma pasta do seu script Python. - 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.pngebotao_enviar.pngdevem ser capturas exatas dos elementos na tela. Pequenas variações (cor, tamanho da fonte, etc.) podem fazer com quelocateOnScreenfalhe. Use a ferramenta de captura de tela do seu sistema para criá-las. confidence: O parâmetroconfidenceemlocateOnScreen(requerpip 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
ImageNotFoundExceptionpara 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:
- Python como orquestrador: O script Python é o cérebro que decide quais ações tomar e em que ordem.
- PyAutoGUI como braço e mão: Traduz os comandos Python em movimentos de mouse, cliques e digitação de teclado.
- 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.htmle salve-o em uma pasta. - Crie os arquivos de imagem
nome_completo_label.pngebotao_enviar.pnga partir do seu navegador. - Execute o script Python completo e observe a automação.
- Ajuste o
pyautogui.PAUSEe observe como isso afeta a velocidade e a estabilidade. - Teste o
pyautogui.FAILSAFEmovendo o mouse para o canto superior esquerdo durante a execução.
💡 Desafios Adicionais:
- Adicionar mais campos: Modifique o
form_teste.htmlpara incluir um campo decheckbox(ex: "Aceito os termos") e umselect(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 usarpyautogui.press('down')várias vezes epyautogui.press('enter').
- Atualize o script Python para interagir com esses novos campos. Para o checkbox, use
- Automação orientada a dados: Crie um arquivo
dados.csvcom 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 noform_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-exceptpara 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) oupyautogui.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.PAUSEepyautogui.FAILSAFEpara 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(), epyautogui.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 delocateOnScreen(). - 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. 🚀✨