Skip to main content

Interceptador de requisições http não oficial do selenium 4

Project description

Atualização 1.0.2

Trazendo novidades, agora é possível em vez de pesquisar diretamente pela rota desejada, você buscar todas requisições já realizadas pelo navegador, podendo ser verificado no repositório oficial utilizando o arquivo example3.py.

Agora tem a possibilida de além de somente fazer uma busca assim:

request = intercept_http(driver,'/route')

É possível utilizar também desta forma:

request = intercept_http(driver,only_request=True)

Que trará um objeto que terá dois atributos importantes para esta funcionalidade

  • requests
  • responses

Estes atributos trarão a possibilidade de você mesmo validar todas as requisições que foram feitas desde o momento da abertura do navegador, sem preocupar com a implementação interna da biblioteca.

Mas lembre-se que ainda é possível buscar diretamente pela rota desejada


Use

request.requests Para ter acesso a todas requisições realizadas até o momento da chamada da função

Para atualizar essa lista, utilize request.update()

Itere sobre esta lista para fazer a própria varredura e verificar o que desejar por exemplo, buscar pela URL:

for req in request.requests:
    print(req.url)

atributos disponíveis para as requests e as responses

  • type
  • network_method
  • url
  • status_code
  • headers

E especificamente para os tipos “response”

  • body

Ao chamar a função, as vezes pode ter a necessidade de atualizar as requisições já passadas para verificar se a requisição específica que você deseja buscar, finalmente apareceu.

Use

request = intercept_http(driver,only_request=True)
#O resto da sua automação
request.update()

Desta maneira, você poderá atualizar constantemente as requisições e atualizar a lista de requisições realizadas.


A função intercept_http possuí novos parâmetros, alguns desses não sendo necessários envio de nenhum dado, outros, sendo opcionais.

Os adicionados foram:

  • update ❌ Não envie nada neste parâmetro
  • update_object ❌ Não envie nada neste parâmetro
  • static_resource → Enviar como False caso queira que a função valide e retorne requisições para arquivos estáticos como “css,svg,png,jpeg” entre outros.
  • only_request → Enviar como True caso queira receber somente a lista de requisições para utilizar assim como ensinado aqui no 1.0.2, caso envie como False, que é o padrão, será buscado a rota enviada.

Atualização 1.0.1

Com a atualização da biblioteca agora é possível verificar se ao interagir com algum elemento em tela usando o selenium, se foi baixado um arquivo em um diretório específico.

Siga o repositório oficial desta funcionalidade para entendê-la e aplicá-la.

Atualização 1.0.1

Agora é possível recuperar os parâmetros de queries e também é retornado a URL que foi capturado os parâmetros. Altamente recomendado utilizar o arquivo exemplo3.py do repositório oficial para ter entendimento e aplicabilidade ao seu cenário. Em algumas situações não será viável usar essa funcionalidade, somente a busca do objeto com body,status e url terão que satisfazer.

Get Started

  1. Instale o Python a partir do link: https://www.python.org/downloads/ e adicione ao PATH o executável
  2. Faça o clone deste repositório utilizando o git
  3. Vá para a pasta onde foi clonado e abra a pasta “selenium-network-intercept”
  4. No terminal, caso queira (Eu recomendo), use o comando python -m venv .venv para instalar as dependências em um ambiente virtual que poderá ser excluído caso queira
  5. Para ativar o ambiente virtual, para windows use o comando .\.venv\Scripts\activate em Linux source .venv\Scripts\Activate, caso não tenha conseguido, recomendo seguir este vídeo: https://www.youtube.com/watch?v=m1TYpvIYm74&ab_channel=OtávioMiranda
  6. No seu terminal, use o comando pip install -r requirements.txt (Este comando fará a instalação de todas dependências necessárias para rodar seu código)
  7. Pronto para usar o código!

Os arquivos “example.py” no repositório oficial são um bom ponto de partida para o entendimento, a partir dele, é possível você já conseguir implementar em qualquer situação para si.

Mas, caso não queira utilizá-lo, explicarei abaixo.


Instanciando Driver

Faça a importação do seu driver como de costume, porém, dessa vez, adicione nas Options, a seguinte capability: 'goog:loggingPrefs', {'performance': 'ALL'}

from selenium import webdriver
from selenium.webdriver import ChromeOptions

options = ChromeOptions()
#Considere as opções abaixo para otimizar o tempo da execução do código no geral
options.add_argument('--headless') #Alerto que em algumas situações, pode não ser encontrado a requisição por conta de rodar em modo headless, faça o teste e verifique isso.
options.page_load_strategy = 'eager'
########################################

options.set_capability('goog:loggingPrefs', {'performance': 'ALL'})

driver = webdriver.Chrome(options=options)

A partir desta configuração, é possível receber os LOGS que trarão todas requisições feitas durante a execução do navegador pela instância driver.


Após realizada a instância, importe a função intercept_http do pacote network, e módulo intercept.

from selenium_network_intercept import intercept_http

Feito isso, você já tem todas funcionalidades do pacote em uma chamada, apenas sendo necessários alterar parâmetros, vamos as explicações de como usá-la.


Buscando as requisições

A função intercept_http pede dois argumentos como parâmetros obrigatórios, e um opcional, sendo estes respectivamente:

driver → Instância que você realizou do seu webdriver

route → Rota que vai ser buscada na lista dos responses

delay → Delay utilizado em situações que a requisição pode estar demorando e a função não está sendo efetiva.

⚠️⚠️⚠️Para usar a função corretamente, atente-se aos detalhes ⚠️⚠️⚠️

No parâmetro route, você deve enviar ou uma parte da rota, ou ela inteira (sem considerar parâmetros de query).

Por exemplo, use:

intercept_http(
		driver = driver,
		route = '/conteudos/publicos'
)

Não use:

intercept_http(
		driver = driver,
		route = '/conteudos/publicos?id=50&nome="teste"'
)

O motivo desta diferença é simples, a função é feita para retornar dados que podem fazer o usuário que está testando monitorar se a requisição foi feita com sucesso, não sendo necessário qualquer dado referente a query que foi feita, ou algum tipo de payload de request.

Também é possível usar:

intercept_http(
		driver = driver,
		route = 'https://www.meuendereco.com.br/conteudos/publicos'
)

É possível, mas, o ideal é usar uma parte da rota que corresponda exatamente a requisição que você busca validar.


Ao chamar a função, ela retornará um objeto do tipo ObjectedIntercepted, que possui como atributos principais:

  • body → Corpo da resposta que a requisição obteve (Quando ter, quando não ter, não retornará erro, mas retornará um dicionário com informações que auxiliam a dar manutenção em caso de necessidade)
  • status_code → Status da requisição (200,404,500)
  • url → URL completa da requisição, então por exemplo, se você fez como o exemplo acima '/conteudos/publicos', ele retornará algo como 'https://www.meuendereco.com.br/conteudos/publicos'
  • method → Método utilizado na requisição (GET,POST,DELETE,PUT)
  • list_of_responses → Lista das responses que o navegador obteve até o momento da chamada da função
  • list_of_requests → Lista das requests que o navegador obteve até o momento da chamada da função (Essa tende a ser uma lista bem maior, recomendo utilizar pprint para exibir caso deseje)

Exemplo de retorno da função

Abaixo é um exemplo do objeto retornado com as informações necessárias para realizarmos validações

ObjectIntercepted(_body={'channelNumber': 33,
                         'code': 'BH',
                         'name': 'GLOBO MINAS',
                         'serviceIDHD': '23104',
                         'serviceIDOneSeg': '23128'},
                  _status_code=200,
                  _url='https://affiliates.video.globo.com/affiliates/info',
                  _method='GET')

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

selenium_network_intercept-1.0.2.tar.gz (9.0 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page