1. Cenário de ações e sua sequência
Quando começamos a planejar um script de automação, é importante entender que, como nos contos de fadas, precisamos ir do simples ao complexo. Imagine que seu script seja um herói que embarca em uma jornada pelas páginas de um site. Cada passo é cuidadosamente planejado para não sair do caminho.
Criando um roteiro passo a passo de automação
O início é sempre o plano. O que você quer alcançar? Carregar uma página, preencher um formulário, clicar num botão? Como dizem: "Quem não planeja está planejando falhar". A gente não quer falhar, então vamos listar os passos previstos.
from selenium import webdriver
from selenium.webdriver.common.by import By
# Criando uma instância do driver. Use o driver compatível com seu navegador.
driver = webdriver.Chrome()
# Abrindo a página
driver.get('https://example.com/login')
# Preenchendo o login
driver.find_element(By.NAME, 'username').send_keys('meu_usuario')
# Preenchendo a senha
driver.find_element(By.NAME, 'password').send_keys('minha_senha_secreta')
# Clicando no botão de login
driver.find_element(By.ID, 'login-button').click()
E assim ajustamos o ritmo do nosso "baile". Cada passo no roteiro é executado sequencialmente para que o script se movimente com facilidade pelo site.
Log de execução dos passos
Como todo herói que se preza, nosso script deve deixar rastros para sabermos onde ele foi e o que fez. Logging é como o diário do seu script. Ele ajuda a rastrear os passos executados e identificar erros caso algo dê errado.
import logging
# Configurando logging
logging.basicConfig(level=logging.INFO)
# Exemplo de logging de uma ação
logging.info("Abrindo a página de login")
driver.get('https://example.com/login')
O logging não ajuda apenas na depuração, mas também proporciona tranquilidade ao saber que o script está executando cada passo conforme planejado. Se algo der errado, você poderá voltar e verificar em qual ponto houve o problema.
2. Organização do código para leitura e modificação
Quando o roteiro fica mais complexo, é importante manter o código organizado. Imagine uma celebração com muitos convidados e pratos: se tudo não estiver no lugar, vira um caos. No nosso caso, é o caos no código.
Configurando a estrutura do código
Para fazer alterações no código de forma mais fácil, ele precisa estar bem organizado. Como separar meias em pares, precisamos categorizar tudo. Use funções para separar ações repetitivas em blocos independentes.
def login_to_site(driver, username, password):
logging.info("Inserindo o login")
driver.find_element(By.NAME, 'username').send_keys(username)
logging.info("Inserindo a senha")
driver.find_element(By.NAME, 'password').send_keys(password)
logging.info("Clicando no botão de login")
driver.find_element(By.ID, 'login-button').click()
# Usando a função para fazer login
login_to_site(driver, 'meu_usuario', 'minha_senha_secreta')
Usar funções deixa o código mais organizado e facilita as alterações, como no
caso de mudar o ID
do botão de login – você só precisará alterar em uma
função, em vez de mudar em todo o código.
3. Exemplo: Automatização do processo de compra em um site
Vamos imaginar que precisamos configurar a automação do processo de compra em um site, incluindo os seguintes passos:
- Abrir o site e fazer login.
- Acessar o catálogo de produtos e adicionar um produto ao carrinho.
- Acessar o carrinho e finalizar a compra.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Inicializando o driver com configurações
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10) # Espera implícita
return driver
# Função para login na conta
def login(driver, username, password):
driver.get("https://example.com")
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("login_button").click()
# Função para acessar o catálogo e adicionar produto ao carrinho
def add_product_to_cart(driver):
driver.get("https://example.com/catalog")
product = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "product_item"))
)
product.click()
add_to_cart_button = driver.find_element_by_id("add_to_cart")
add_to_cart_button.click()
# Função para acessar o carrinho e finalizar compra
def checkout(driver):
driver.get("https://example.com/cart")
checkout_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "checkout"))
)
checkout_button.click()
# Função para encerrar o driver
def close_driver(driver):
driver.quit()
# Script principal para executar a sequência de ações
def main():
# Configuração dos dados
username = "meu_usuario"
password = "minha_senha"
# Inicialização do driver
driver = initialize_driver()
try:
# Fazendo login no site
login(driver, username, password)
# Acessando catálogo e adicionando produto ao carrinho
add_product_to_cart(driver)
# Acessando carrinho e finalizando compra
checkout(driver)
finally:
# Fechando o driver
close_driver(driver)
# Rodando o script principal
main()
Explicação das funções
-
initialize_driver()
— função para inicializar o web driver. Ela configura uma espera implícita para todos os elementos e retorna o objeto do driver. -
login()
— função para realizar login no site. Ela recebe os parâmetrosusername
epassword
, que são usados para preencher o formulário de login e clicar no botão de login. -
add_product_to_cart()
— função para acessar o catálogo, selecionar um produto e adicioná-lo ao carrinho. -
checkout()
— função para acessar o carrinho e finalizar a compra. -
close_driver()
— função para encerrar o uso do driver. -
main()
— função principal, que gerencia a sequência de ações. Nela ocorre a chamada de todas as etapas, além da configuração dos dados de login.
Benefícios desse approach
-
Clareza
— cada etapa está organizada em funções separadas, o que torna o código mais fácil de entender. -
Reutilização
— funções individuais podem ser usadas independentemente do script principal, para realizar ações específicas no site. -
Facilidade de teste
— cada etapa pode ser testada separadamente, garantindo que tudo funciona corretamente. -
Flexibilidade
— caso necessário, é possível adicionar outras funções ou mudar a ordem das chamadas nomain()
.
GO TO FULL VERSION