Como usar Selenium Python para melhorar os testes web

Selenium Python é uma lib útil para automatizar ações na web, independente de quais delas você objetive. Por exemplo: busca e navegação, web scraping (mapeamento e seleção de conteúdo de sites) e automatização de compra de produtos.

Utilizando um exemplo bem mais simples para entender o funcionamento dessa lib, diremos que usar Selenium Python é equivalente a programar um robô para fazer as ações no navegador que você precise tornar mais rápidas, automáticas.

Nesse artigo, trabalharemos exemplos práticos de como usá-la ao seu favor. Confira o texto abaixo.

Artigos relacionados:

Introdução ao Selenium Python

A automação de testes web é uma prática fundamental para garantir a qualidade de aplicações web, independente do tamanho que elas possuam. 

Por isso, a importância do Selenium é alta e seu uso ainda maior. Ele é uma ferramenta de código aberto que permite automatizar interações com navegadores, isso justifica sua popularidade para esse propósito. 

Uma informação importante, talvez curiosa, é que o Selenium Python também usa JavaScript lá no fundo. O objetivo é conseguir capturar os elementos de um documento HTML.

Como o Selenium funciona manipulando arquivos web via webdriver, ainda que cada navegador possua o seu próprio, a necessidade de “tratar” arquivos HTML é fundamental.

Aplicabilidade e recursos Selenium Python

  • Automatização de testes funcionais: utilizado para automatizar testes funcionais de páginas da web, garantindo o bom funcionamento das funcionalidades do site;
  • Web Scraping: útil para extrair informações de páginas sem API ou com formatos de dados não acessíveis por meio de solicitações HTTP tradicionais;
  • Integração com testes unitários: pode ser integrado com estruturas de testes unitários, como PyTest e Unittest, para executar testes automatizados em diferentes navegadores e ambientes;
  • Monitoramento de sites: permite monitorar sites e verificar sua disponibilidade, a presença de elementos específicos ou possíveis problemas na página;
  • Automação de tarefas web: facilita a automação de tarefas repetitivas, como preenchimento de formulários e envio de relatórios.

Características úteis do Selenium em Python

  • Controle do navegador: permite controlar navegadores populares, como Chrome, Firefox e Safari, assim, utilizando suas bibliotecas específicas;
  • Localização de elementos: facilita a localização de elementos na página através de seletores CSS, XPath, ID, classe, etc;
  • Manipulação de elementos: possibilita interações com elementos da página, como clicar em botões, preencher formulários e selecionar opções de lista suspensa;
  • Esperas explícitas e implícitas: oferece esperas para aguardar até que um elemento esteja disponível ou que uma condição seja satisfeita antes de prosseguir com o código;
  • Manipulação de janelas e frames: permite alternar entre janelas do navegador e frames incorporados em uma página;
  • Captura de tela: possibilita tirar capturas de tela da página durante a execução do teste para análise e depuração.

Instalando Selenium Python

Antes de começarmos, é importante configurar o ambiente Python e instalar o Selenium WebDriver

Para isso, veremos os passos necessários para garantir que tudo esteja funcionando corretamente. Certifique-se de ter o Python instalado em seu sistema e, em seguida, siga os comandos abaixo para instalar o Selenium:

pip install selenium

O comando pip install, um gerenciador de pacotes do Python, é o comando padrão para baixar bibliotecas dentro do repositório da linguagem.

Após a instalação do Selenium, você precisará baixar os drivers adequados para os navegadores com os quais pretende realizar os testes, como Chrome, Firefox, ou Edge.

Usando Selenium para automatizar testes web

Com o ambiente devidamente configurado, vamos começar a criar nossos testes automatizados. Primeiro, importaremos as bibliotecas necessárias:

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

Esses imports são extremamente importantes para garantir que a biblioteca seja executada e as funções alcançadas. Assim, antes de programar as funções, é essencial importar as bibliotecas.

Agora, podemos navegar para uma URL e interagir com os elementos da página. Por exemplo, para preencher um campo de login e clicar no botão de login, podemos fazer o seguinte:

# Inicializa o driver do navegador (por exemplo, Chrome)

driver = webdriver.Chrome()

# Navega para a URL de login

import time

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

driver = webdriver.Chrome()

# Navega para a URL de login

driver.get("https://www.facebook.com/?stype=lo&jlou=AfdGFevEqVoKZZFdyl8VJKC7zneQVqarRqXw91wSuLEDLdEgOeCMyjf3GxxAZGsvyk8zIVNq5HErtzSE1kThJnPhzlcvyl0IVtfKmksfrj7p1g&smuh=22627&lh=Ac9tsg5GNcOjUtBPvPw")

#Aqui usamos de exemplo a página de login do Facebook

campo_login = driver.find_element(By.ID, "email")

campo_senha = driver.find_element(By.ID, "pass")

botao_login = driver.find_element(By.NAME, "login")

campo_login.send_keys("usuario123")

campo_senha.send_keys("senha_secreta")

botao_login.click()

time.sleep(20)

driver.close()

A biblioteca time e o seu método sleep servem para forçar o navegador a fechar depois de 20 segundos. Esse tempo pode ser modificado facilmente. 

Usando Python para criar scripts Selenium

Python é uma linguagem versátil e de fácil aprendizado. Combiná-la com o Selenium nos permite criar scripts de teste potentes e legíveis. 

Abaixo, mostramos um exemplo de um script simples que abre o navegador, navega até uma página, e verifica se o título corresponde ao esperado:

import time

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

driver = webdriver.Chrome()

# Navega para a URL desejada

driver.get("https://www.amazon.com.br/ap/signin?openid.pape.max_auth_age=900&openid.return_to=https%3A%2F%2Fwww.amazon.com.br%2Fgp%2Fyourstore%2Fhome%3Fpath%3D%252Fgp%252Fyourstore%252Fhome%26useRedirectOnSuccess%3D1%26signIn%3D1%26action%3Dsign-out%26ref_%3Dnav_AccountFlyout_signout&openid.assoc_handle=brflex&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0")

# Usamos como exemplo a página de login da Amazon
# Verifica se o título da página corresponde ao esperado

titulo_esperado = "Acessar Amazon"

assert titulo_esperado in driver.title, f"Título incorreto. Esperado: {titulo_esperado}, Obtido: {driver.title}"

# Fecha o navegador após o teste

driver.quit()

Melhorando seus scripts Selenium Python

Para tornar nossos testes mais organizados e fáceis de manter, podemos usar o padrão Page Object. 

Esse padrão sugere que criemos classes que representam páginas da web e encapsulam a lógica de interação com os elementos daquela página. Vejamos um exemplo (usando a página de login da Amazon):

class PaginaInicial:

    def __init__(self, driver):

        self.driver = driver

        self.url = “https://www.amazon.com.br/ap/signin?openid.pape.max_auth_age=900&openid.return_to=https%3A%2F%2Fwww.amazon.com.br%2Fgp%2Fyourstore%2Fhome%3Fpath%3D%252Fgp%252Fyourstore%252Fhome%26useRedirectOnSuccess%3D1%26signIn%3D1%26action%3Dsign-out%26ref_%3Dnav_AccountFlyout_signout&openid.assoc_handle=brflex&openid.mode=checkid_setup&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0"

    def visitar(self):

        self.driver.get(self.url)

    def obter_titulo(self):

        return self.driver.title

class PaginaLogin:

    def __init__(self, driver):

        self.driver = driver

        self.url = "https://www.facebook.com/?stype=lo&jlou=AfdGFevEqVoKZZFdyl8VJKC7zneQVqarRqXw91wSuLEDLdEgOeCMyjf3GxxAZGsvyk8zIVNq5HErtzSE1kThJnPhzlcvyl0IVtfKmksfrj7p1g&smuh=22627&lh=Ac9tsg5GNcOjUtBPvPw"

    def visitar(self):

        self.driver.get(self.url)

    def preencher_campo_login(self, usuario,senha):

        campo_login = self.driver.find_element(By.ID, "email")

        campo_senha = driver.find_element(By.ID, "pass")

        botao_loginButton = driver.find_element(By.NAME, "login")

        campo_login.send_keys(usuario)

        campo_senha.send_keys(senha)

        campo_loginButton.click()

    # Métodos para interação com outros elementos da página de login

    # ...

# Exemplo de uso dos Page Objects

driver = webdriver.Chrome()

pagina_inicial = PaginaInicial(driver)

pagina_inicial.visitar()

assert "Página de Exemplo" in pagina_inicial.obter_titulo()

#Assert é um método de comparação entre duas saídas, ou seja, é comumente usado em testes unitários

pagina_login = PaginaLogin(driver)

pagina_login.visitar()

pagina_login.preencher_campo_login("usuario123",”senha_secreta”)

Alternativa ao Selenium em Python: utilizando o `requests-html`

Se você precisa extrair informações estáticas de páginas web de forma mais simples e direta, uma alternativa ao Selenium em Python é o módulo `requests-html`

Enquanto o Selenium é amplamente usado para automatizar interações com navegadores e simular ações de um usuário real, o `requests-html` oferece uma abordagem mais direta para solicitar páginas web e extrair informações estáticas sem a necessidade de um navegador.

Exemplo de uso do `requests-html`: Obtendo o título de uma página

Aqui está um exemplo de código em que utilizamos o `requests-html` para obter o título de uma página:

from requests_html import HTMLSession

# Cria uma sessão HTML

session = HTMLSession()

# Faz a solicitação GET para a página

url = "https://www.exemplo.com"

response = session.get(url)

# Verifica se a solicitação foi bem-sucedida (código 200)

if response.status_code == 200:

    # Extrai o título da página

    titulo = response.html.find('title', first=True).text

    # Imprime o título

    print(f"O título da página {url} é: {titulo}")

else:

    print(f"A solicitação para a página {url} falhou.")

Neste exemplo, criamos uma sessão HTML usando o `HTMLSession()` e realizamos uma solicitação GET para uma página específica. 

Em seguida, verificamos se a solicitação foi bem-sucedida (código 200) e, se sim, extraímos o título da página usando o método `find()` e imprimimos o resultado.

Lembre-se de que o `requests-html` é adequado para tarefas de extração de informações estáticas, mas não oferece suporte a interações complexas com JavaScript e aplicativos web dinâmicos. 

Se você precisa automatizar testes em uma aplicação web interativa, o Selenium ainda é a melhor opção.

Para a criação de aplicações com poucos recursos, considere o uso do Flask Python.

Comparativo entre Selenium e WebScraping

Selenium em Python

Embora o Selenium seja principalmente usado para automação de testes, ele também pode ser utilizado para tarefas de web scraping, especialmente quando a extração de dados requer interações complexas com a página, como páginas geradas dinamicamente por JavaScript. 

No entanto, o Selenium pode ser mais lento para o web scraping em comparação com outras bibliotecas dedicadas exclusivamente a essa finalidade.

Web scraping em Python

O web scraping é uma técnica de coleta de dados em que você extrai informações de páginas web diretamente da sua estrutura HTML, sem a necessidade de simular interações em um navegador. Existem várias bibliotecas em Python que são especialmente projetadas para o web scraping, tornando o processo mais eficiente e direto.

Algumas das bibliotecas de web scraping populares em Python incluem:

  • BeautifulSoup: é uma biblioteca que analisa o HTML e XML para extrair os dados necessários.
  • Requests: biblioteca simples para fazer solicitações HTTP e obter o conteúdo HTML das páginas.
  • Scrapy: framework de web scraping completo e poderoso que permite navegar, extrair e salvar dados de forma estruturada.

Essas bibliotecas são mais rápidas e eficientes para a coleta de dados, especialmente quando você precisa apenas extrair informações de páginas estáticas, onde não há muitas interações complexas.

Quando usar Selenium ou Web Scraping em Python?

A escolha entre o Selenium e o web scraping depende das necessidades do projeto. Use o Selenium quando:

  • Você precisa interagir com elementos da página como faria manualmente;
  • A página possui conteúdo dinâmico carregado por JavaScript, e você precisa esperar que os elementos sejam renderizados;
  • Seu objetivo principal é a automação de testes.

Use o web scraping quando:

  • As informações que você precisa estão disponíveis diretamente no HTML da página;
  • Não há necessidade de interações complexas com a página;
  • Você deseja coletar dados de várias páginas de forma mais rápida e direta.

Em resumo, o Selenium é mais adequado para casos em que a automação de testes e a interação com a página são necessárias, enquanto o web scraping é a melhor opção para coletar dados estáticos e mais simples de páginas web.

Como usar o Selenium para Web Scraping

Embora existam bibliotecas especializadas em web scraping em Python, o Selenium é uma opção útil quando o site utiliza JavaScript e possui elementos dinâmicos que outras bibliotecas podem não conseguir lidar adequadamente.

Exemplo de como realizar o Web Scraping com o Selenium

Vamos considerar um exemplo prático de como extrair informações de uma página usando o Selenium:

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.options import Options

# Configura as opções do Chrome para execução sem interface gráfica

chrome_options = Options()

chrome_options.add_argument("--headless")

# Inicializa o driver do navegador Chrome

driver = webdriver.Chrome(options=chrome_options)

# URL da página que será extraída

url = "https://www.exemplo.com/pagina-de-dados"

# Faz a solicitação GET para a página

driver.get(url)

# Localiza os elementos da página que contêm as informações que desejamos extrair

elementos_dados = driver.find_elements(By.CSS_SELECTOR, ".classe-dados")

# Itera sobre os elementos para obter os dados

for elemento in elementos_dados:

    informacao = elemento.text

    print(informacao)

# Fecha o navegador após a extração dos dados

driver.quit()

Neste exemplo, estamos utilizando o Chrome em modo “headless” (sem interface gráfica) para executar o web scraping. Isso permite a execução em segundo plano, sem abrir uma janela visível do navegador.

Desafios da automação de testes web

Embora a automação de testes web traga inúmeros benefícios, também enfrenta desafios. Elementos dinâmicos e identificadores mutáveis podem causar instabilidade nos testes

Além disso, a necessidade de lidar com autenticação e segurança adiciona complexidade. Testar a responsividade em dispositivos móveis é outro desafio significativo. 

A otimização do desempenho dos testes também é uma preocupação, especialmente ao executá-los em larga escala.

Por isso, usar o Selenium e os métodos alternativos é necessário. Além de necessário, também justificado.

O futuro da automação de testes web

Tecnologias avançadas, como o Selenium em Python, estão aprimorando os testes web constantemente. Ainda mais com a integração da inteligência artificial e aprendizado de máquina (machine learning), o que possibilita testes mais inteligentes e adaptativos. 

Profissionais de teste automatizado devem acompanhar essas mudanças para se manterem relevantes e aproveitarem as oportunidades do futuro que acompanha a automação de testes web. 

O Selenium em Python, dessa forma, torna os testes mais eficientes e inteligentes, tornando-se, portanto, essencial para os profissionais da área.

Conclusão

O Selenium em Python, em suma, é uma lib bastante útil para reduzir trabalho desnecessário e pode ser muito versátil no uso.

Conforme visto nos códigos de exemplo, a sintaxe é clara e bastante objetiva, assim, reduz em muito as possibilidades de erro. Após essa leitura, é possível deduzir quais os melhores usos para esse método e também quais alternativas a ele estão disponíveis.

Dessa forma, recomendamos a leitura de outro artigo interessante, se você quiser se aprofundar nessa linguagem: O que é Python? Entenda tudo sobre esta linguagem.

Este artigo foi útil?

Obrigado pela resposta!
Daiana S

Daiana S

Graduada em Letras pelo Instituto Federal da Paraíba e especializada em redação geral. Gosto de escrever sobre tudo e me dedico em vários níveis de expressividade. No geral, todos os meus hobbies giram em torno de escrever alguma coisa e fazer isso bem.

Contato: daiana.blog@homehost.com.br

Ganhe 30% OFF

Indique seu nome e e-mail,e ganhe um cupom de desconto de 30% para sempre na Homehost!