Automacao Web com Selenium e Python — 2025 | Python Brasil
Aprenda automacao web com Selenium e Python. Tutorial com exemplos de navegacao, formularios, esperas e web scraping dinamico.
Selenium e a ferramenta mais popular para automacao de navegadores web. Com Python e Selenium, voce pode automatizar testes, preencher formularios, extrair dados de sites dinamicos e muito mais. Neste guia, a gente vai aprender desde a configuracao ate tecnicas avancadas de automacao.
Instalacao e Configuracao
Instale o Selenium e o gerenciador de drivers:
pip install selenium webdriver-manager
O webdriver-manager baixa automaticamente o driver correto para o seu navegador, eliminando a necessidade de configuracao manual.
Primeiro Script de Automacao
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
# Configurar o navegador
options = Options()
# options.add_argument("--headless") # Sem interface grafica
options.add_argument("--no-sandbox")
options.add_argument("--window-size=1920,1080")
# Criar instancia do navegador
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service, options=options)
try:
# Navegar para um site
driver.get("https://www.python.org")
# Obter informacoes da pagina
print(f"Titulo: {driver.title}")
print(f"URL: {driver.current_url}")
finally:
# Sempre feche o navegador
driver.quit()
Localizando Elementos
O Selenium oferece diversas formas de encontrar elementos na pagina:
from selenium.webdriver.common.by import By
# Por ID
elemento = driver.find_element(By.ID, "meu-id")
# Por nome
elemento = driver.find_element(By.NAME, "email")
# Por classe CSS
elementos = driver.find_elements(By.CLASS_NAME, "item")
# Por seletor CSS (mais flexivel)
elemento = driver.find_element(By.CSS_SELECTOR, "div.container > h1")
elemento = driver.find_element(By.CSS_SELECTOR, "input[type='email']")
# Por XPath (mais poderoso)
elemento = driver.find_element(By.XPATH, "//button[@type='submit']")
elementos = driver.find_elements(By.XPATH, "//div[@class='produto']//span[@class='preco']")
# Por texto do link
elemento = driver.find_element(By.LINK_TEXT, "Saiba mais")
elemento = driver.find_element(By.PARTIAL_LINK_TEXT, "Saiba")
# Por tag HTML
elementos = driver.find_elements(By.TAG_NAME, "li")
Interagindo com Formularios
Automatizar formularios e um dos usos mais comuns:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
import time
def preencher_formulario(driver):
"""Exemplo de preenchimento automatico de formulario."""
driver.get("https://exemplo.com/cadastro")
# Preencher campo de texto
campo_nome = driver.find_element(By.NAME, "nome")
campo_nome.clear() # Limpar campo antes de digitar
campo_nome.send_keys("Ana Silva")
# Preencher email
campo_email = driver.find_element(By.NAME, "email")
campo_email.clear()
campo_email.send_keys("ana@email.com")
# Selecionar opcao em dropdown
dropdown = Select(driver.find_element(By.NAME, "estado"))
dropdown.select_by_visible_text("Sao Paulo")
# ou: dropdown.select_by_value("SP")
# ou: dropdown.select_by_index(25)
# Marcar checkbox
checkbox = driver.find_element(By.ID, "aceito-termos")
if not checkbox.is_selected():
checkbox.click()
# Selecionar radio button
radio = driver.find_element(By.CSS_SELECTOR, "input[value='plano-pro']")
radio.click()
# Clicar no botao de enviar
botao = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
botao.click()
Esperas: Explicitas vs Implicitas
Sites dinamicos carregam elementos de forma assincrona. Esperas sao essenciais para evitar erros:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
# Espera implicita (aplica a todos os find_element)
driver.implicitly_wait(10) # Espera ate 10 segundos
# Espera explicita (recomendada - mais precisa)
wait = WebDriverWait(driver, 10)
try:
# Esperar elemento ficar visivel
elemento = wait.until(
EC.visibility_of_element_located((By.ID, "resultado"))
)
print(f"Texto: {elemento.text}")
# Esperar elemento ser clicavel
botao = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, ".btn-continuar"))
)
botao.click()
# Esperar texto especifico aparecer
wait.until(
EC.text_to_be_present_in_element(
(By.ID, "status"), "Concluido"
)
)
# Esperar elemento desaparecer (loading spinner)
wait.until(
EC.invisibility_of_element_located((By.CLASS_NAME, "spinner"))
)
except TimeoutException:
print("Timeout: elemento nao encontrado no tempo limite")
Web Scraping de Sites Dinamicos
Selenium e ideal para extrair dados de sites que usam JavaScript:
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
import json
def extrair_produtos(driver, url):
"""Extrai dados de produtos de uma pagina dinamica."""
driver.get(url)
# Esperar produtos carregarem
wait = WebDriverWait(driver, 15)
wait.until(
EC.presence_of_all_elements_located((By.CLASS_NAME, "produto-card"))
)
# Scroll para carregar mais itens (infinite scroll)
ultimo_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
import time
time.sleep(2)
novo_height = driver.execute_script("return document.body.scrollHeight")
if novo_height == ultimo_height:
break
ultimo_height = novo_height
# Extrair dados
produtos = []
cards = driver.find_elements(By.CLASS_NAME, "produto-card")
for card in cards:
nome = card.find_element(By.CLASS_NAME, "nome").text
preco = card.find_element(By.CLASS_NAME, "preco").text
produtos.append({"nome": nome, "preco": preco})
return produtos
# Salvar dados extraidos
# produtos = extrair_produtos(driver, "https://loja.exemplo.com/produtos")
# with open("produtos.json", "w") as f:
# json.dump(produtos, f, indent=2, ensure_ascii=False)
Executando JavaScript
Voce pode executar JavaScript diretamente no navegador:
# Executar JavaScript simples
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Obter valor de elemento via JavaScript
titulo = driver.execute_script("return document.title;")
# Modificar atributos de elementos
driver.execute_script(
"arguments[0].setAttribute('value', 'novo valor');",
driver.find_element(By.ID, "campo")
)
# Remover overlay ou popup
driver.execute_script("""
var overlay = document.querySelector('.modal-overlay');
if (overlay) overlay.remove();
""")
Capturas de Tela
Util para debug e documentacao:
# Screenshot da pagina inteira
driver.save_screenshot("pagina_completa.png")
# Screenshot de um elemento especifico
elemento = driver.find_element(By.ID, "grafico")
elemento.screenshot("grafico.png")
Gerenciando Abas e Janelas
# Abrir nova aba
driver.execute_script("window.open('https://python.org', '_blank');")
# Alternar entre abas
abas = driver.window_handles
driver.switch_to.window(abas[1]) # Ir para segunda aba
print(f"Aba atual: {driver.title}")
driver.switch_to.window(abas[0]) # Voltar para primeira aba
# Fechar aba atual
driver.close()
Modo Headless para Servidores
Para execucao em servidores sem interface grafica:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-gpu")
options.add_argument("--window-size=1920,1080")
# User agent para evitar deteccao
options.add_argument(
"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
)
driver = webdriver.Chrome(options=options)
Classe de Automacao Reutilizavel
Para projetos maiores, encapsule a logica em uma classe usando o padrao Page Object:
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
class PaginaLogin:
"""Page Object para a pagina de login."""
URL = "https://app.exemplo.com/login"
def __init__(self, driver):
self.driver = driver
self.wait = WebDriverWait(driver, 10)
def abrir(self):
self.driver.get(self.URL)
return self
def preencher_email(self, email):
campo = self.wait.until(
EC.visibility_of_element_located((By.NAME, "email"))
)
campo.clear()
campo.send_keys(email)
return self
def preencher_senha(self, senha):
campo = self.driver.find_element(By.NAME, "senha")
campo.clear()
campo.send_keys(senha)
return self
def clicar_entrar(self):
botao = self.wait.until(
EC.element_to_be_clickable((By.ID, "btn-login"))
)
botao.click()
return self
def login(self, email, senha):
"""Realiza login completo."""
self.abrir()
self.preencher_email(email)
self.preencher_senha(senha)
self.clicar_entrar()
return self
Boas Praticas
Ao usar Selenium com Python, siga estas recomendacoes:
- Sempre use esperas explicitas ao inves de
time.sleep - Feche o navegador em um bloco
finallyou use context managers - Use o padrao Page Object para manter o codigo organizado
- Respeite os termos de servico dos sites que voce acessa
- Adicione delays razoaveis entre acoes para nao sobrecarregar servidores
- Use modo headless para execucao em CI/CD e servidores
- Trate excecoes especificas do Selenium para mensagens de erro claras
Conclusao
Selenium com Python e uma combinacao poderosa para automacao web. Desde testes automatizados ate web scraping de sites dinamicos, as possibilidades sao vastas. Comece com scripts simples, domine as esperas explicitas e evolua para o padrao Page Object conforme seus projetos crescem. Lembre-se de sempre usar a automacao de forma etica e respeitando os termos de uso dos sites.
Equipe Python Brasil
Contribuidor do Python Brasil — Aprenda Python em Português