Ferramenta de Automação de Testes Web: Selenium

PhantomJS é um navegador headless que suporta JavaScript – ele possui mecanismo JS e componentes de renedrização, mas sem interface gráfica. Selenium é uma ferramenta de automação de testes para aplicações web que executa comandos diretamente nos navegadores. Cada navegador oferece interfaces diferentes e o Selenium as abstrai por meio do WebDriver, seu objeto central, que permite controlar o navegador, capturar screenshots, acessar HTTP e analisar respostas.

Exemplo 1: Lidando com requisições assíncronas

Ao buscar dados no Bing, o resultado vem via AJAX. Acessar a página diretamnete não traz os dados carrregados. Usamos Selenium com PhantomJS para esperar o conteúdo dinâmico.

from selenium import webdriver
import datetime
import time
import random

# Cria o driver (PhantomJS precisa do caminho do executável)
navegador = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')
navegador.set_window_size(1280, 2400)

url = 'https://cn.bing.com/search?q=gato'
navegador.get(url)

def tirar_foto():
    pasta = 'screenshots/'
    nome = '{}{:%Y%m%d%H%M%S}{}.png'.format(pasta, datetime.datetime.now(), random.randint(1,100))
    navegador.save_screenshot(nome)

# Método 1: espera fixa
# time.sleep(5)
# tirar_foto()

# Método 2: tentativas até encontrar o elemento
MAX_TENTATIVAS = 5
tentativa = 0
while tentativa < MAX_TENTATIVAS:
    try:
        elemento = navegador.find_element_by_class_name('b_caption')
        print('Encontrado na tentativa', tentativa+1)
        tirar_foto()
        break
    except Exception as e:
        print('Erro:', type(e).__name__)
    time.sleep(1)
    tentativa += 1

navegador.close()

Exemplo 2: Manipulando dropdown (select)

from selenium import webdriver
import datetime
import random
from selenium.webdriver.support.ui import Select

navegador = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')
navegador.set_window_size(1280, 2400)

def captura():
    pasta = 'screenshots/'
    nome = '{}{:%Y%m%d%H%M%S}{}.png'.format(pasta, datetime.datetime.now(), random.randint(1,100))
    navegador.save_screenshot(nome)

url = "https://www.oschina.net/search?scope=project&q=python"
navegador.get(url)

elemento = navegador.find_element_by_class_name('tag1')
print('Tag:', elemento.tag_name)
print('URL atual:', navegador.current_url)
captura()

seletor = Select(elemento)
seletor.select_by_index(1)  # seleciona primeira opção
time.sleep(2)
print('URL após seleção:', navegador.current_url)
captura()

navegador.close()

Exemplo 3: Simulação de teclado para login

from selenium import webdriver
import datetime
import time
import random
from selenium.webdriver.common.keys import Keys

navegador = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')
navegador.set_window_size(1280, 2400)

def captura():
    pasta = 'screenshots/'
    nome = '{}{:%Y%m%d%H%M%S}{}.png'.format(pasta, datetime.datetime.now(), random.randint(1,100))
    navegador.save_screenshot(nome)

url = 'https://www.oschina.net/home/login'
navegador.get(url)
print('URL inicial:', navegador.current_url)
captura()

email = navegador.find_element_by_id('userMail')
senha = navegador.find_element_by_id('userPassword')

usuario = '18390900259'
senha_texto = '123456'
email.send_keys(usuario)
senha.send_keys(senha_texto)
captura()

senha.send_keys(Keys.ENTER)  # tecla Enter
time.sleep(1)
print('URL após login:', navegador.current_url)
captura()

while True:
    time.sleep(1)
    print('URL:', navegador.current_url)
    try:
        info = navegador.find_element_by_class_name('user-info')
        print('Texto do usuário:', info.text)
        captura()
        break
    except Exception as e:
        print(e)

cookies = navegador.get_cookies()
print('Cookies:', cookies)
navegador.close()

Exemplo 4: Espera de página (implicita e explícita)

Páginas com AJAX exigem espera para que os elementos estejam disponíveis. Duas abordagens comuns:

  • Espera implícita: define um tempo fixo que o WebDriver esperará ao procurar um elemento.
  • Espera explícita: aguarda até que uma condição específica seja atendida (por exemplo, elemento presente no DOM).

Espera implícita

from selenium import webdriver

navegador = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')
navegador.implicitly_wait(10)  # espera até 10s

url = "https://movie.douban.com/"
navegador.get(url)
try:
    print('Início...')
    elemento = navegador.find_element_by_id('abcde')  # elemento inexistente
except Exception as e:
    print(type(e).__name__, ':', e)
finally:
    navegador.quit()

Espera explícita

from selenium import webdriver
import datetime
import random
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

navegador = webdriver.PhantomJS(r'phantomjs-2.1.1-macosx/bin/phantomjs')
navegador.set_window_size(1280, 2400)

url = 'https://movie.douban.com/'
navegador.get(url)

def captura():
    pasta = 'screenshots/'
    nome = '{}{:%Y%m%d%H%M%S}{:03}.png'.format(pasta, datetime.datetime.now(), random.randint(1,100))
    navegador.save_screenshot(nome)

try:
    # Espera explícita: até que o elemento com id 'inp-query' esteja presente
    elemento = WebDriverWait(navegador, 20).until(
        EC.presence_of_element_located((By.ID, 'inp-query'))
    )
    elemento.send_keys('TRON')
    captura()
    elemento.send_keys(Keys.ENTER)
    print('URL após busca:', navegador.current_url)
    captura()
finally:
    navegador.quit()

O WebDriver é o núcleo do Selenium e oferece: abrir URLs, rastrear redirecionamentos, obter URL e título atuais, gerenciar cookies, controlar navegação (voltar, avançar, atualizar, fechar), executar JavaScript, localizar elementos no DOM, interagir com elementos (clique, digitação, seleção em dropdown), obter texto ou atributos, etc.

Tags: Selenium WebDriver phantomjs Python Automação de Testes

Publicado em 6-14 04:49 por Thomas