Capturando os dados HTTP das Páginas (Selenium Python)
Muita das vezes pra entender determinados problemas, precisamos dos dados gerados via HTTP, algumas ferramentas de análise de tráfico Web trabalham com o HAR file e os browsers também.
O formato HTTP Archive ou HAR, é um formato de arquivo JSON formatado para registrar a interação de um navegador com um site. A extensão comum para esses arquivos é .har. O formato HAR é suportado por vários softwares, incluindo:
- Fiddler
- Firebug
- HttpWatch
- Charles Web Proxy (software)
- Firefox
- Google Chrome
No Chrome podemos gravar o .HAR file e exportar também.
Podemos pegar os arquivos de três formas, a primeira solução é usar alguns plugins que exportam o .har file, simplesmente você precisa baixar o plugin e configurar o profile adicionando o plugin e os comandos:
Passo a Passo:
1. Baixar o plugin e colocar numa pasta em nosso projeto;
https://addons.mozilla.org/firefox/downloads/file/449485/har_export_trigger-0.5.0-beta.10-fx.xpi
2. Passar o caminho do Plugin file no nosso código, através da função add_extension, depois habilitar o plugin e o token, em seguida colocamos algumas preferências como mudar o nome do arquivo, qual pasta baixar o .har file, e se ele vem comprimido ou não.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.FirefoxProfile()
browser.add_extension(extension='C:\\temp\\har_export_trigger-0.5.0-beta.10-fx.xpi')
# Configuracoes para habilitar o plugin.
browser.set_preference("extensions.netmonitor.har.enableAutomation", True)
browser.set_preference("extensions.netmonitor.har.contentAPIToken", "test1234")
browser.set_preference("extensions.netmonitor.har.autoConnect", True)
browser.set_preference("devtools.netmonitor.har.enableAutoExportToFile", True)
browser.set_preference("devtools.netmonitor.har.forceExport", True)
# Configuracoes para mudar o nome do arquivo e local, como comprimir o arquivo.
browser.set_preference("devtools.netmonitor.har.compress", False)
browser.set_preference("devtools.netmonitor.har.defaultFileName", "HarOutputExport_%y%m%d_%H%M%S")
browser.set_preference("devtools.netmonitor.har.defaultLogDir", "C:\\temp")
def _waitForAlert(driver):
return WebDriverWait(driver, 5).until(EC.alert_is_present())
browser = webdriver.Firefox(firefox_profile=fp)
browser.get("http://www.w3schools.com/js/tryit.asp?filename=tryjs_confirm")
browser.switch_to.frame("iframeResult")
browser.find_element(by=By.CSS_SELECTOR, value="body > button").click()
alert = _waitForAlert(browser)
alert.accept()
Problema dessa solução, em cada browser terá que baixar um plugin diferente, olhei as reclamações no github, quando o browser atualizar pode deixar de funcionar nas versões novas dos browsers.
2. Temos uma segunda solução melhor usar um servidor de proxy, podemos criar um servidor local e configurar o browser, já vi algumas pessoas usando o fiddler pra isso, mas sei se é um ótima solução usar o fiddler, ele pode interferir nos testes. Eu achei a melhor solução usar uma API do python, existe uma API chamada browsermob-proxy, a solução baseia em cliente servidor, ele inicia o servidor .jar e configuramos o cliente.
Passo a Passo:
1. Baixar o servidor no site abaixo e copiar o mesmo para o c: do sistema;
2. Instale a API no Python, abra o cmd/shell e digite o comando: pip install browsermob-proxy;
3. Passar o caminho do servidor no nosso código, sem a extensão:
- “C:\\browsermob-proxy-2.1.2\\bin\\browsermob-proxy”
Código Fonte:
# Importa as APIs necessaria.
from browsermobproxy import Server
from selenium import webdriver
# Passa o caminho do servidor browsermob-proxy, nao adicione extensao.
server = Server("C:\\browsermob-proxy-2.1.2\\bin\\browsermob-proxy")
# Comando pra Iniciar o servidor
server.start()
# Cria o proxy, e retorna o objeto client com todas as funcoes.
proxy = server.create_proxy()
# Configura o Selenium com o proxy.
profile = webdriver.FirefoxProfile()
profile.set_proxy(proxy.selenium_proxy())
driver = webdriver.Firefox(firefox_profile=profile)
# Ativa o HAR file para ser gravado.
proxy.new_har("google")
driver.get("http://www.google.com")
# Retorna o HAR file em formato json.
print(proxy.har)
# Para o servidor.
server.stop()
driver.quit()
A vantagem da API, que podemos usar outras funções da classe, como limpar o cache clear_dns_cache, você pode usar a função new_har e passar como parâmetro a opção que você deseja. Você pode criar uma função genérica no behave usando o [behave.userdata] para ativar e desativar os logs.
"""
This sets a new HAR to be recorded
:param ref: A reference for the HAR. Defaults to None
:param options: A dictionary that will be passed to BrowserMob Proxy \
with specific keywords. Keywords are: \
captureHeaders - Boolean, capture headers \
captureContent - Boolean, capture content bodies \
captureBinaryContent - Boolean, capture binary content
"""
Mais detalhes acesse os links abaixo:
http://www.softwareishard.com/blog/har-export-trigger/