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.

5 min de leitura Equipe Python Brasil

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 finally ou 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.

E

Equipe Python Brasil

Contribuidor do Python Brasil — Aprenda Python em Português