1. Finalização da sessão
Como encerrar corretamente a sessão do navegador
Beleza, você tem um script incrível que coleta dados, clica em botões e faz várias mágicas no navegador. Agora é importante finalizar o script da forma certa. Imagine que seu navegador é um elefante calmo: você não pode simplesmente bater a porta e sair. Você precisa encerrá-lo de maneira educada e tranquila. Para isso, use o método quit().
from selenium import webdriver
# Inicialização do driver do navegador
driver = webdriver.Chrome()
# aqui acontece toda a magia com o navegador... 🧙♂️
# Encerramento do navegador
driver.quit()
O método quit() fecha todas as janelas do navegador e finaliza o processo. Se você esquecer de chamá-lo, podem surgir situações estranhas com navegadores abertos em segundo plano e vazamentos de memória. E convenhamos, todo mundo quer uma vida tranquila, né?
Resolvendo problemas com processos do navegador que ficam presos
Às vezes, ao usar o Selenium, os processos do navegador continuam lá no fundo, como unidades indecisas em um jogo de estratégia em tempo real. Isso pode acontecer, por exemplo, se seu script "cair" em algum ponto. Uma das maneiras de lidar com isso é encerrando os processos em massa, como usar o psutil no Python ou outros comandos do sistema.
import psutil
# Fechando todos os processos do Chrome que ficaram presos
for proc in psutil.process_iter():
# Verifica se o processo pertence ao navegador
if 'chrome' in proc.name().lower():
proc.kill()
Não é o método mais elegante, mas às vezes não resta outra alternativa quando os processos ficam descontrolados. Lembre-se que isso vai matar todos os processos do navegador, então use com cautela.
2. Testando o script
Checando se todas as etapas do script estão funcionando
Finalizar o script com sucesso é só metade do trabalho. É importante verificar se cada etapa está funcionando corretamente. Ferramentas de testagem de software, como unittest ou pytest, são ótimas para isso. Você pode criar testes para garantir que o script abre páginas, clica em botões e coleta os dados corretamente.
Vamos ver um exemplo minimalista usando o unittest:
import unittest
from selenium import webdriver
class TestBrowserAutomation(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
def test_open_page(self):
self.driver.get("https://example.com")
self.assertEqual("Example Domain", self.driver.title)
def tearDown(self):
self.driver.quit()
unittest.main()
Este teste verifica que nosso script abre a página https://example.com e que o título da página corresponde à expectativa. Um jeito simples, mas poderoso, de garantir que as partes principais do script estão funcionando.
Debugando e otimizando
Às vezes, mesmo depois de escrever os testes, seu script se comporta como uma criança teimosa, recusando-se a funcionar corretamente. É aqui que entra o debug. Use print() para exibir valores intermediários e descobrir onde algo deu errado. Comentários engraçados no código são bem-vindos, desde que você não perca o foco: entender o que está acontecendo.
Por exemplo, você encontra um problema onde o elemento some_element está ausente na página:
Importante: os exemplos abaixo usam a sintaxe do Selenium 3. No Selenium 4 os métodos find_element_by_* foram removidos (de vez a partir da versão 4.3.0): no lugar deles usa-se o método universal find_element() com uma estratégia da classe By. Por isso, depois de cada exemplo vem a sua versão para Selenium 4.
try:
some_element = driver.find_element_by_id('missing-id')
except Exception as e:
print(f"Opa! Algo deu errado: {e}")
O mesmo no Selenium 4:
try:
some_element = driver.find_element(By.ID, 'missing-id')
except Exception as e:
print(f"Opa! Algo deu errado: {e}")
Além disso, fique de olho no desempenho do seu script. Às vezes, você pode otimizá-lo reduzindo a frequência de solicitações ou aprimorando a lógica para encontrar elementos.
Evitando falhas e erros no futuro
Depois de otimizar e debugar, seu script deve funcionar como um relógio suíço. Mas sempre existe o risco de novos problemas surgirem. Você pode usar sistemas de log, como o logging, para registrar o que está acontecendo no script. Isso ajuda a identificar onde e por que algo deu errado.
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("Início do script")
# registre mais ações aqui...
logger.info("Finalização do script")
Lembre-se de que é sempre bom se preparar para eventos inesperados, especialmente ao lidar com dados ou páginas instáveis. Considere implementar sistemas de retries e timeouts para evitar que o script pare diante de qualquer falha.
GO TO FULL VERSION