Selenium em Python: Manipulando Alertas, Pop-ups e Menus Suspensos

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()

Tags: Selenium WebDriver Python Web Automation JavaScript Alerts Select Dropdowns

Publicado em 7-6 03:50