Ao conduzir testes automatizados de interfaces web com Selenium em Python, é essencial dominar a interação com diversos elementos dinâmicos, como caixas de alerta, diálogos modais e listas suspensas. Este guia aborda técnicas práticas para manipular esses componentes.
Lidando com Alertas JavaScript
Alertas simples do navegador podem ser acessados e manipulados diretamente pelo Selenium. O processo envolve mudar o foco do driver para o contexto do alerta.
from selenium import webdriver
from selenium.webdriver.common.alert import Alert
import time as tempo
navegador = webdriver.Chrome()
navegador.maximize_window()
navegador.get('file:///caminho/para/pagina_com_alerta.html')
# Capturar e imprimir o texto do alerta
caixa_alerta = Alert(navegador)
mensagem_alerta = caixa_alerta.text
print(f"Mensagem do alerta: {mensagem_alerta}")
tempo.sleep(2)
# Confirmar o alerta (clicar em OK)
caixa_alerta.accept()
tempo.sleep(2)
navegador.quit()
Diálogos de Confirmação e Prompt
Para diálogos de confirmação (com botões OK/Cancelar) e prompts (que aceitam entrada de texto), o Selenium oferece métodos específicos para aceitar, dispensar e inserir dados.
from selenium import webdriver
import time as tempo
navegador = webdriver.Chrome()
navegador.get('file:///caminho/para/pagina_com_prompt.html')
# Acionar o diálogo
navegador.find_element('xpath', '//button[@onclick="mostrarPrompt()"]').click()
tempo.sleep(1)
# Interagir com o prompt
prompt = navegador.switch_to.alert
prompt.send_keys('Texto inserido via automação')
tempo.sleep(1)
# Aceitar o prompt
prompt.accept()
tempo.sleep(1)
# Testar o cancelamento em uma confirmação
navegador.find_element('xpath', '//button[@onclick="mostrarConfirmacao()"]').click()
tempo.sleep(1)
confirmacao = navegador.switch_to.alert
confirmacao.dismiss() # Clicar em Cancelar
tempo.sleep(1)
navegador.quit()
Gerenciando iFrames
Quando os elementos estão dentro de um iFrame, é necessário mudar o contexto do driver para o frame correto antes de interagir com eles.
from selenium import webdriver
import time as tempo
navegador = webdriver.Chrome()
navegador.get('file:///caminho/para/pagina_com_iframe.html')
# Mudar para o iFrame pelo ID ou índice
navegador.switch_to.frame('id_do_iframe')
# Interagir com elementos dentro do iFrame
campo_usuario = navegador.find_element('id', 'campo_usuario')
campo_usuario.send_keys('valor_teste')
tempo.sleep(2)
# Voltar ao conteúdo principal
navegador.switch_to.default_content()
navegador.quit()
Manipulação de Menus Suspensos (Select)
Elementos do tipo <select> requerem uma abordagem especial. A classe Select do Selenium fornece métodos para selecionar opções por índice, valor ou texto visível.
from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time as tempo
navegador = webdriver.Chrome()
navegador.get('file:///caminho/para/pagina_com_select.html')
# Localizar o elemento select
elemento_select = navegador.find_element('id', 'lista_opcoes')
dropdown = Select(elemento_select)
# Selecionar por índice (começando em 0)
dropdown.select_by_index(1)
tempo.sleep(1)
# Selecionar pelo atributo 'value'
dropdown.select_by_value('python')
tempo.sleep(1)
# Selecionar pelo texto visível
dropdown.select_by_visible_text('Java')
tempo.sleep(1)
navegador.quit()
Exemplo Prático: Validação de Formulário de Login
A aplicação das técnicas enteriores pode ser demonstrada em um cenário real, como testar a validação de um formulário de login, verificendo mensagens de erro em diferentes cenários.
from selenium import webdriver
from selenium.webdriver.common.by import By
import time as tempo
def testar_login(navegador, usuario, senha):
navegador.get('https://exemplo.com/login')
tempo.sleep(1)
if usuario:
navegador.find_element(By.ID, 'campo_email').send_keys(usuario)
if senha:
navegador.find_element(By.ID, 'campo_senha').send_keys(senha)
navegador.find_element(By.ID, 'botao_login').click()
tempo.sleep(2)
# Verificar a presença de mensagem de erro
try:
msg_erro = navegador.find_element(By.CLASS_NAME, 'erro-login').text
return msg_erro
except:
return None
navegador = webdriver.Chrome()
navegador.maximize_window()
# Cenário 1: Campos vazios
resultado = testar_login(navegador, '', '')
assert resultado == 'Por favor, preencha todos os campos.'
# Cenário 2: Senha incorreta
resultado = testar_login(navegador, 'user@email.com', 'senha_errada')
assert resultado == 'Credenciais inválidas.'
navegador.quit()