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.