Guia

Automação com Selenium e Python: Guia

Aprenda a automatizar navegadores com Selenium e Python. Instalação, seletores, interação com páginas, waits e testes automatizados

5 min de leitura

Introdução

Selenium é a ferramenta mais popular para automatizar navegadores web com Python. Com ele, você pode simular ações de um usuário real: clicar em botões, preencher formulários, navegar entre páginas e extrair dados de sites que dependem de JavaScript para carregar conteúdo.

Neste guia, vamos instalar o Selenium, aprender a interagir com páginas web e criar automações úteis para o dia a dia.

Casos de uso

O Selenium é usado para:

  • Testes automatizados: testar aplicações web simulando interações do usuário
  • Web scraping de sites dinâmicos: coletar dados de páginas que usam JavaScript
  • Automação de tarefas repetitivas: preencher formulários, gerar relatórios, baixar arquivos
  • Monitoramento: verificar se um site está funcionando corretamente

Instalação

pip install selenium

O Selenium 4 gerencia os drivers automaticamente via Selenium Manager, então não é mais necessário baixar o ChromeDriver manualmente como nas versões anteriores.

Para garantir que o Chrome está instalado:

# Verificar no Linux
google-chrome --version

# Verificar no macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version

Primeiro script de automação

Crie automacao.py:

from selenium import webdriver
from selenium.webdriver.common.by import By

# Iniciar o navegador
driver = webdriver.Chrome()

# Acessar um site
driver.get("https://www.python.org")

# Extrair informacoes
titulo = driver.title
print(f"Titulo da pagina: {titulo}")

# Encontrar um elemento
barra_busca = driver.find_element(By.ID, "id-search-field")
barra_busca.send_keys("tutorial")
barra_busca.submit()

# Aguardar e extrair resultados
resultados = driver.find_elements(By.CSS_SELECTOR, "ul.list-recent-events li")
for resultado in resultados:
    print(resultado.text)

# Fechar o navegador
driver.quit()

Execute:

python automacao.py

O Chrome abrirá automaticamente, fará a busca e exibirá os resultados no terminal.

Modo headless (sem interface)

Para rodar sem abrir o navegador (útil em servidores e CI/CD):

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

opcoes = Options()
opcoes.add_argument("--headless=new")
opcoes.add_argument("--no-sandbox")
opcoes.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome(options=opcoes)
driver.get("https://www.python.org")
print(driver.title)
driver.quit()

Encontrando elementos

O Selenium oferece vários métodos para localizar elementos na página:

from selenium.webdriver.common.by import By

# Por ID
elemento = driver.find_element(By.ID, "meu-id")

# Por nome
campo = driver.find_element(By.NAME, "email")

# Por classe CSS
botao = driver.find_element(By.CLASS_NAME, "btn-enviar")

# Por seletor CSS
item = driver.find_element(By.CSS_SELECTOR, "div.container > p.destaque")

# Por XPath
titulo = driver.find_element(By.XPATH, "//h1[@class='titulo']")

# Por texto do link
link = driver.find_element(By.LINK_TEXT, "Saiba mais")

# Por texto parcial do link
link = driver.find_element(By.PARTIAL_LINK_TEXT, "Saiba")

# Encontrar multiplos elementos
itens = driver.find_elements(By.CSS_SELECTOR, "li.item")

Interagindo com elementos

from selenium.webdriver.common.keys import Keys

# Clicar
botao = driver.find_element(By.ID, "enviar")
botao.click()

# Digitar texto
campo = driver.find_element(By.NAME, "usuario")
campo.clear()  # Limpar o campo primeiro
campo.send_keys("meu_usuario")

# Teclas especiais
campo.send_keys(Keys.ENTER)
campo.send_keys(Keys.TAB)
campo.send_keys(Keys.CONTROL, "a")  # Ctrl+A (selecionar tudo)

# Selecionar opcoes em dropdown
from selenium.webdriver.support.ui import Select

dropdown = Select(driver.find_element(By.ID, "estado"))
dropdown.select_by_visible_text("Sao Paulo")
dropdown.select_by_value("SP")
dropdown.select_by_index(0)

# Checkbox e radio buttons
checkbox = driver.find_element(By.ID, "aceito-termos")
if not checkbox.is_selected():
    checkbox.click()

Waits: esperando elementos carregarem

Sites modernos carregam conteúdo dinamicamente. Usar time.sleep() é ineficiente. O Selenium oferece waits inteligentes:

Explicit Waits (recomendado)

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Esperar ate 10 segundos pelo elemento aparecer
wait = WebDriverWait(driver, 10)
elemento = wait.until(
    EC.presence_of_element_located((By.ID, "resultado"))
)

# Esperar elemento ficar clicavel
botao = wait.until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "button.enviar"))
)
botao.click()

# Esperar texto 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, "loading"))
)

Implicit Waits

Define um tempo de espera padrão para todos os find_element:

driver.implicitly_wait(10)  # Espera ate 10 segundos

Exemplo prático: preenchendo formulário

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


def preencher_formulario():
    driver = webdriver.Chrome()
    wait = WebDriverWait(driver, 10)

    try:
        driver.get("https://exemplo.com/cadastro")

        # Preencher campos
        wait.until(EC.presence_of_element_located((By.NAME, "nome")))
        driver.find_element(By.NAME, "nome").send_keys("Maria Silva")
        driver.find_element(By.NAME, "email").send_keys("[email protected]")
        driver.find_element(By.NAME, "telefone").send_keys("11999998888")

        # Selecionar estado
        from selenium.webdriver.support.ui import Select
        estado = Select(driver.find_element(By.NAME, "estado"))
        estado.select_by_visible_text("Sao Paulo")

        # Aceitar termos
        termos = driver.find_element(By.ID, "aceito-termos")
        if not termos.is_selected():
            termos.click()

        # Enviar formulario
        driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()

        # Verificar sucesso
        mensagem = wait.until(
            EC.presence_of_element_located((By.CLASS_NAME, "sucesso"))
        )
        print(f"Resultado: {mensagem.text}")

    finally:
        driver.quit()


preencher_formulario()

Capturando screenshots

# 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")

Executando JavaScript

# Scroll ate o final da pagina
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# Scroll ate um elemento
elemento = driver.find_element(By.ID, "rodape")
driver.execute_script("arguments[0].scrollIntoView();", elemento)

# Alterar valor de um campo oculto
driver.execute_script("document.getElementById('campo-oculto').value = 'valor';")

Gerenciando múltiplas abas e janelas

# Abrir nova aba
driver.execute_script("window.open('https://exemplo.com', '_blank');")

# Trocar para a nova aba
driver.switch_to.window(driver.window_handles[1])

# Voltar para a aba original
driver.switch_to.window(driver.window_handles[0])

# Fechar aba atual
driver.close()

Alternativas ao Selenium

  • Playwright: mais moderno, suporte nativo a async e múltiplos navegadores
  • Scrapy: framework completo para web scraping em escala
  • Pyppeteer: port do Puppeteer para Python

Boas práticas

  • Use waits explícitos em vez de time.sleep()
  • Sempre use driver.quit() em um bloco finally para fechar o navegador
  • Prefira seletores CSS a XPath quando possível (mais legíveis e rápidos)
  • Use modo headless em ambientes de CI/CD
  • Respeite os termos de uso dos sites que você automatiza
  • Adicione delays razoáveis entre ações para não sobrecarregar servidores

Conclusão

Selenium é uma ferramenta versátil para automação de navegadores com Python. Seja para testes automatizados, web scraping de sites dinâmicos ou automação de tarefas repetitivas, o Selenium oferece controle total sobre o navegador. Com waits inteligentes e boas práticas, você pode criar automações robustas que funcionam de forma confiável em diferentes cenários.

Se você busca alternativas de automação web com alta performance, explore como Go lida com scraping e automação usando bibliotecas como chromedp, ou descubra como Rust oferece ferramentas de web scraping com performance próxima ao nativo.