O que é Selenium e pra que serve o selenio na prática
Selenium é uma biblioteca open source para automação de navegadores web. O nome completo do pacote que você instala via pip é simplesmente selenium, mas o framework em si é composto por três partes principais: o WebDriver, o Selenium Grid e as bindings para várias linguagens como Python, Java, Ce JavaScript. Pra que serve o selenio? Basicamente, ele controla um navegador real — Chrome, Firefox, Edge, Safari — programaticamente. Você escreve um script que diz "abra esta URL, clique neste botão, preencha este campo, aguarde". O navegador faz tudo isso do jeito que um humano faria, mas mil vezes mais rápido e sem se distrair.
O caso de uso mais comum é teste automatizado. Você tem uma aplicação web, escreve scripts que verificam se cada funcionalidade está funcionando, e roda esses testes toda vez que faz deploy. Mas ele também serve para web scraping quando o site é dinâmico e APIs não estão disponíveis ou são limitadas.
Pra que serve o selenio quando APIs e requests simples não bastam
Aqui vai algo que iniciantes ignoram e que custa caro em tempo de debugging. Selenium lida com JavaScript renderizado, cookies, sessões autenticadas e até mesmo bloqueios anti-bot básicos. Requests do tipo HTTP direto não conseguem executar o JS do lado do cliente, então você vê dados que não existem na resposta bruta. O Selenium resolve isso porque o navegador executa o JavaScript como qualquer usuário real. Um exemplo concreto. Eu precisava extrair preços de um e-commerce que carregava os dados via chamadas AJAX após o DOM principal ser montado. Tentei com requests + BeautifulSoup e o preço vinha como null. Troquei para Selenium com Chrome headless, esperei o element containing the price aparecer, e li o innerText. Funcionou. O custo foi maior uso de memória — cada instância do Chrome gasta entre 200 e 500 MB dependendo da página — mas a informação estava lá.
Instalação e configuração básica
Para começar no Python: pip install selenium
Depois você precisa do driver do navegador correspondente. Para Chrome, use o chromedriver. A versão do driver precisa corresponder à versão do Chrome instalado no seu sistema. Se seu Chrome está na versão 114, você precisa do chromedriver 114. O selenium 4.x tem uma melhoria que busca o driver automaticamente via o módulo webdriver-manager: pip install webdriver-manager
Com isso, o Selenium baixa e atualiza o driver sozinho na primeira execução. Poupa dor de cabeça com versionamento. O código mínimo para abrir uma página:
```python
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://exemplo.com")
print(driver.title)
driver.quit()
```
Encontrando elementos e interagindo com a página
O Selenium oferece vários métodos de localização. Os mais usados são por id, name, class name, tag name, link text, partial link text, css selector e XPath. Na prática, css selectors são os mais confiáveis e rápidos. XPath é útil quando a estrutura do HTML é complexa e você precisa navegar para cima na árvore do DOM, mas xpath lento em páginas grandes e pode quebrar com qualquer mudança no layout.
```python
from selenium.webdriver.common.by import By
encontrar por css selector
elemento = driver.find_element(By.CSS_SELECTOR, ".botao-comprar")
encontrar por xpath
elemento = driver.find_element(By.XPATH, "//button[contains(@class, 'comprar')]")
interagir
elemento.click()
elemento.send_keys("texto para preencher")
``` Um detalhe importante que todo mundo erra na primeira vez: Selenium executa comandos de forma síncrona. Se você clicar em um botão que carrega conteúdo dinâmico e tentar ler o novo conteúdo imediatamente, vai pegar um elemento que ainda não existe. A solução é usar waits explícitos.
```python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".preco-atualizado"))
)
``` Isso espera até 10 segundos pelo elemento aparecer. Sem isso, seus scripts falham 30% das vezes em produção por timing issues.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Limitações e cenários onde Selenium não é a melhor escolha
Vou ser direto sobre os pontos fracos, porque muita gente recomenda Selenium como solução universal e depois se decepciona. Primeiro: velocidade. Cada ação no navegador é lenta comparada a uma requisição HTTP. Um script que leva 2 segundos com requests pode levar 30 segundos a 2 minutos com Selenium, dependendo da complexidade da página. Se você precisa raspar milhares de páginas, Selenium não escala bem.
Segundo: manutenção. Seltores CSS e XPath precisam ser atualizados sempre que o site muda o layout. Sites que fazem deploy semanal com redesigns frequentes vão quebrar seus testes com frequência. Você acaba gastando mais tempo ajustando seletores do que escrevendo lógica nova. Terceiro: recursos do sistema. Rodar Selenium em paralelo exige múltiplas instâncias de navegador. Cada instância consome CPU e RAM significativos. Testar com 10 threads pode facilmente consumir 5 GB de RAM apenas nos navegadores.
Alternativa para scraping leve: se o site não exige autenticação complexa ou JavaScript pesado, use requests + BeautifulSoup ou httpx com async. Éorders de magnitude mais rápido e usa uma fração dos recursos. Só recorra ao Selenium quando realmente precisar do navegador completo.
Boas práticas que eu aprendi no campo
Aqui vão algumas coisas que economizaram meu tempo e evitaram horas de debugging frustrante. Use sempre waits explícitos, nunca time.sleep(). Sleep é uma gambiarra que deixa seu script lento e ainda assim não garante que o elemento estará pronto. Waits explícitos verificam condições reais.
Mantenha o Chrome rodando em headless mode em produção. Sem a interface gráfica visível, o navegador gasta menos recursos e roda mais rápido. Adicione a flag --headless=new nas opções do Chrome. Configure timeouts razoáveis. O padrão do Selenium é 0 segundos para alguns comportamentos, o que causa exceptions difíceis de rastrear. Defina explicitamente:
```python
driver.implicitly_wait(5) wait up to 5 seconds for elements
WebDriverWait(driver, 10) explicit waits for conditions
``` Um problema específico que encontrei e demorei para resolver: sites com anti-bot detection. Alguns detectam Selenium pelo comando navigator.webdriver que fica como true quando o navegador é controlado pelo WebDriver. A solução simples é passar a flag --disable-blink-features=AutomationControlled nas opções do Chrome:
```python
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--headless=new")
driver = webdriver.Chrome(options=options)
``` Isso esconde o fato de que o navegador está sendo controlado automaticamente. Funciona contra detecções básicas. Detecções avançadas podem ainda identificar padrões de mouse move e clique irreais, aí o problema é outro.
Outro insight menos óbvio: use Selenium Grid se você precisa rodar testes em múltiplos navegadores ou máquinas simultaneamente. Ele permite centralizar a execução e escalar horizontalmente. Configurar um hub e nodes leva cerca de uma hora inicial, mas paga o esforço rapidamente se você roda centenas de testes por dia.
Conclusão
Selenium é a ferramenta padrão do setor para automação de navegador e testes end-to-end de aplicações web. Ele é robusto, tem suporte a todas as linguagens principais e uma comunidade ativa. Não é a solução mais rápida nem a mais leve, mas quando você precisa de um navegador real rodando seu script, dificilmente haverá alternativa melhor. O segredo não é usar Selenium para tudo. Use requests para o que dá. Reserve o Selenium para quando o JavaScript, sessões autenticadas ou interações complexas forem inevitáveis. Com waits explícitos, headless mode e configurações adequadas de anti-deteção, seus scripts vão rodar de forma consistente na maioria dos cenários.
Documentação oficial: https://www.selenium.dev/documentation/