Reinaldo Mateus Rossetti Junior
3 min readJan 10, 2021

--

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:

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;

https://bmp.lightbody.net/

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/

https://www.youtube.com/watch?v=FmsLJHikRf8

https://browsermob-proxy-py.readthedocs.io/en/stable/

--

--