selenium-network-intercept


Nameselenium-network-intercept JSON
Version 1.0.2 PyPI version JSON
download
home_pageNone
SummaryInterceptador de requisições http não oficial do selenium 4
upload_time2024-04-26 22:12:43
maintainerNone
docs_urlNone
authorAlexandre Mariano
requires_pythonNone
licenseMIT License
keywords selenium network intercept http requests selenium network intercept selenium intercept search download selenium
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ## 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](https://github.com/alexandremariano4/selenium_network_intercept/tree/main) utilizando o arquivo `example3.py`.

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

```powershell
request = intercept_http(driver,'/route')
```

**É possível utilizar também desta forma:**

```python
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:

```python
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**

```python
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](https://github.com/alexandremariano4/selenium_network_intercept/tree/main/selenium_search_file) 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](https://github.com/alexandremariano4/selenium_network_intercept/tree/main) 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](https://www.youtube.com/watch?v=m1TYpvIYm74&ab_channel=Ot%C3%A1vioMiranda)
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](https://github.com/alexandremariano4/selenium_network_intercept/tree/main) 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'}`

```python
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.

```python
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:

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

Não use:

```python
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:

```python
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

```python
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')
```

---

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "selenium-network-intercept",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "selenium, network, intercept, http, requests, selenium network intercept, selenium intercept, search download selenium",
    "author": "Alexandre Mariano",
    "author_email": "alexandre_mariano@hotmail.com.br",
    "download_url": "https://files.pythonhosted.org/packages/db/4e/2ea535bd790e8457aa7e6d4e16042c4f716150016b634fdbcf7fe902f5d7/selenium_network_intercept-1.0.2.tar.gz",
    "platform": null,
    "description": "## Atualiza\u00e7\u00e3o 1.0.2\r\n\r\nTrazendo novidades, agora \u00e9 poss\u00edvel em vez de pesquisar diretamente pela rota desejada, voc\u00ea buscar todas requisi\u00e7\u00f5es j\u00e1 realizadas pelo navegador, podendo ser verificado no [reposit\u00f3rio oficial](https://github.com/alexandremariano4/selenium_network_intercept/tree/main) utilizando o arquivo `example3.py`.\r\n\r\n**Agora tem a possibilida de al\u00e9m de somente fazer uma busca assim:**\r\n\r\n```powershell\r\nrequest = intercept_http(driver,'/route')\r\n```\r\n\r\n**\u00c9 poss\u00edvel utilizar tamb\u00e9m desta forma:**\r\n\r\n```python\r\nrequest = intercept_http(driver,only_request=True)\r\n```\r\n\r\nQue trar\u00e1 um objeto que ter\u00e1 dois atributos importantes para esta funcionalidade \r\n\r\n- requests\r\n- responses\r\n\r\nEstes atributos trar\u00e3o a possibilidade de voc\u00ea mesmo validar todas as requisi\u00e7\u00f5es que foram feitas desde o momento da abertura do navegador, sem preocupar com a implementa\u00e7\u00e3o interna da biblioteca.\r\n\r\n***Mas lembre-se que ainda \u00e9 poss\u00edvel buscar diretamente pela rota desejada***\r\n\r\n---\r\n\r\n**Use** \r\n\r\n`request.requests`  Para ter acesso a todas requisi\u00e7\u00f5es realizadas at\u00e9 o momento da chamada da fun\u00e7\u00e3o\r\n\r\nPara atualizar essa lista, utilize `request.update()`\r\n\r\nItere sobre esta lista para fazer a pr\u00f3pria varredura e verificar o que desejar por exemplo, buscar pela URL:\r\n\r\n```python\r\nfor req in request.requests:\r\n    print(req.url)\r\n```\r\n\r\natributos dispon\u00edveis para as `requests` e as `responses` \r\n\r\n- type\r\n- network_method\r\n- url\r\n- status_code\r\n- headers\r\n\r\nE especificamente para os tipos \u201cresponse\u201d\r\n\r\n- body\r\n\r\n---\r\n\r\n**Ao chamar a fun\u00e7\u00e3o, as vezes pode ter a necessidade de atualizar as requisi\u00e7\u00f5es j\u00e1 passadas para verificar se a requisi\u00e7\u00e3o espec\u00edfica que voc\u00ea deseja buscar, finalmente apareceu.**\r\n\r\n**Use**\r\n\r\n```python\r\nrequest = intercept_http(driver,only_request=True)\r\n#O resto da sua automa\u00e7\u00e3o\r\nrequest.update()\r\n```\r\n\r\nDesta maneira, voc\u00ea poder\u00e1 atualizar constantemente as requisi\u00e7\u00f5es e atualizar a lista de requisi\u00e7\u00f5es realizadas.\r\n\r\n---\r\n\r\nA fun\u00e7\u00e3o `intercept_http` possu\u00ed novos par\u00e2metros, alguns desses n\u00e3o sendo necess\u00e1rios envio de nenhum dado, outros, sendo opcionais.\r\n\r\nOs adicionados foram:\r\n\r\n- update \u274c *N\u00e3o envie nada neste par\u00e2metro*\r\n- update_object \u274c *N\u00e3o envie nada neste par\u00e2metro*\r\n- static_resource \u2192 Enviar como False caso queira que a fun\u00e7\u00e3o valide e retorne requisi\u00e7\u00f5es para arquivos est\u00e1ticos como \u201ccss,svg,png,jpeg\u201d entre outros.\r\n- only_request  \u2192 Enviar como True caso queira receber somente a lista de requisi\u00e7\u00f5es para utilizar assim como ensinado aqui no 1.0.2, caso envie como False, que \u00e9 o padr\u00e3o, ser\u00e1 buscado a rota enviada.\r\n\r\n\r\n## Atualiza\u00e7\u00e3o 1.0.1\r\n\r\nCom a atualiza\u00e7\u00e3o da biblioteca agora \u00e9 poss\u00edvel verificar se ao interagir com algum elemento em tela usando o selenium, se foi baixado um arquivo em um diret\u00f3rio espec\u00edfico.\r\n\r\nSiga o [reposit\u00f3rio oficial](https://github.com/alexandremariano4/selenium_network_intercept/tree/main/selenium_search_file) desta funcionalidade para entend\u00ea-la e aplic\u00e1-la.\r\n\r\n\r\n\r\n## Atualiza\u00e7\u00e3o 1.0.1\r\n\r\nAgora \u00e9 poss\u00edvel recuperar os par\u00e2metros de queries e tamb\u00e9m \u00e9 retornado a URL que foi capturado os par\u00e2metros.\r\nAltamente recomendado utilizar o arquivo exemplo3.py do [reposit\u00f3rio oficial](https://github.com/alexandremariano4/selenium_network_intercept/tree/main) para ter entendimento e aplicabilidade ao seu cen\u00e1rio.\r\nEm algumas situa\u00e7\u00f5es n\u00e3o ser\u00e1 vi\u00e1vel usar essa funcionalidade, somente a busca do objeto com body,status e url ter\u00e3o que satisfazer.\r\n\r\n\r\n## Get Started\r\n\r\n1. Instale o Python a partir do link: https://www.python.org/downloads/ e adicione ao PATH o execut\u00e1vel\r\n2. Fa\u00e7a o clone deste reposit\u00f3rio utilizando o git\r\n3. V\u00e1 para a pasta onde foi clonado e abra a pasta \u201cselenium-network-intercept\u201d\r\n4. No terminal, caso queira (Eu recomendo), use o comando `python -m venv .venv` para instalar as depend\u00eancias em um ambiente virtual que poder\u00e1 ser exclu\u00eddo caso queira\r\n5. Para ativar o ambiente virtual, para windows use o comando `.\\.venv\\Scripts\\activate` em Linux `source .venv\\Scripts\\Activate`, caso n\u00e3o tenha conseguido, recomendo seguir este v\u00eddeo: [https://www.youtube.com/watch?v=m1TYpvIYm74&ab_channel=Ot\u00e1vioMiranda](https://www.youtube.com/watch?v=m1TYpvIYm74&ab_channel=Ot%C3%A1vioMiranda)\r\n6. No seu terminal, use o comando `pip install -r requirements.txt` (Este comando far\u00e1 a instala\u00e7\u00e3o de todas depend\u00eancias necess\u00e1rias para rodar seu c\u00f3digo)\r\n7. Pronto para usar o c\u00f3digo!\r\n\r\nOs arquivos \u201cexample.py\u201d no [reposit\u00f3rio oficial](https://github.com/alexandremariano4/selenium_network_intercept/tree/main) s\u00e3o um bom ponto de partida para o entendimento, a partir dele, \u00e9 poss\u00edvel voc\u00ea j\u00e1 conseguir implementar em qualquer situa\u00e7\u00e3o para si.\r\n\r\nMas, caso n\u00e3o queira utiliz\u00e1-lo, explicarei abaixo.\r\n\r\n---\r\n\r\n### Instanciando Driver\r\n\r\nFa\u00e7a a importa\u00e7\u00e3o do seu driver como de costume, por\u00e9m, dessa vez, adicione nas Options, a seguinte capability:  `'goog:loggingPrefs', {'performance': 'ALL'}`\r\n\r\n```python\r\nfrom selenium import webdriver\r\nfrom selenium.webdriver import ChromeOptions\r\n\r\noptions = ChromeOptions()\r\n#Considere as op\u00e7\u00f5es abaixo para otimizar o tempo da execu\u00e7\u00e3o do c\u00f3digo no geral\r\noptions.add_argument('--headless') #Alerto que em algumas situa\u00e7\u00f5es, pode n\u00e3o ser encontrado a requisi\u00e7\u00e3o por conta de rodar em modo headless, fa\u00e7a o teste e verifique isso.\r\noptions.page_load_strategy = 'eager'\r\n########################################\r\n\r\noptions.set_capability('goog:loggingPrefs', {'performance': 'ALL'})\r\n\r\ndriver = webdriver.Chrome(options=options)\r\n```\r\n\r\nA partir desta configura\u00e7\u00e3o, \u00e9 poss\u00edvel receber os LOGS que trar\u00e3o todas requisi\u00e7\u00f5es feitas durante a execu\u00e7\u00e3o do navegador pela inst\u00e2ncia `driver`.\r\n\r\n---\r\n\r\nAp\u00f3s realizada a inst\u00e2ncia, importe a fun\u00e7\u00e3o `intercept_http` do pacote network, e m\u00f3dulo intercept.\r\n\r\n```python\r\nfrom selenium_network_intercept import intercept_http\r\n```\r\n\r\nFeito isso, voc\u00ea j\u00e1 tem todas funcionalidades do pacote em uma chamada, apenas sendo necess\u00e1rios alterar par\u00e2metros, vamos as explica\u00e7\u00f5es de como us\u00e1-la.\r\n\r\n---\r\n\r\n### Buscando as requisi\u00e7\u00f5es\r\n\r\nA fun\u00e7\u00e3o `intercept_http` pede dois argumentos como par\u00e2metros obrigat\u00f3rios, e um opcional, sendo estes respectivamente:\r\n\r\n**driver** \u2192 Inst\u00e2ncia que voc\u00ea realizou do seu webdriver\r\n\r\n**route** \u2192 Rota que vai ser buscada na lista dos responses\r\n\r\n**delay** \u2192 Delay utilizado em situa\u00e7\u00f5es que a requisi\u00e7\u00e3o pode estar demorando e a fun\u00e7\u00e3o n\u00e3o est\u00e1 sendo efetiva.\r\n\r\n**\u26a0\ufe0f\u26a0\ufe0f\u26a0\ufe0fPara usar a fun\u00e7\u00e3o corretamente, atente-se aos detalhes \u26a0\ufe0f\u26a0\ufe0f\u26a0\ufe0f**\r\n\r\nNo par\u00e2metro route, voc\u00ea deve enviar ou uma parte da rota, ou ela inteira (sem considerar par\u00e2metros de query).\r\n\r\nPor exemplo, use:\r\n\r\n```python\r\nintercept_http(\r\n\t\tdriver = driver,\r\n\t\troute = '/conteudos/publicos'\r\n)\r\n```\r\n\r\nN\u00e3o use:\r\n\r\n```python\r\nintercept_http(\r\n\t\tdriver = driver,\r\n\t\troute = '/conteudos/publicos?id=50&nome=\"teste\"'\r\n)\r\n```\r\n\r\nO motivo desta diferen\u00e7a \u00e9 simples, a fun\u00e7\u00e3o \u00e9 feita para retornar dados que podem fazer o usu\u00e1rio que est\u00e1 testando monitorar se a requisi\u00e7\u00e3o foi feita com sucesso, n\u00e3o sendo necess\u00e1rio qualquer dado referente a query que foi feita, ou algum tipo de payload de request.\r\n\r\nTamb\u00e9m \u00e9 poss\u00edvel usar:\r\n\r\n```python\r\nintercept_http(\r\n\t\tdriver = driver,\r\n\t\troute = 'https://www.meuendereco.com.br/conteudos/publicos'\r\n)\r\n```\r\n\r\n\u00c9 poss\u00edvel, mas, o ideal \u00e9 usar uma parte da rota que corresponda exatamente a requisi\u00e7\u00e3o que voc\u00ea busca validar.\r\n\r\n---\r\n\r\nAo chamar a fun\u00e7\u00e3o, ela retornar\u00e1 um objeto do tipo **ObjectedIntercepted**, que possui como atributos principais: \r\n\r\n- body \u2192 Corpo da resposta que a requisi\u00e7\u00e3o obteve (Quando ter, quando n\u00e3o ter, n\u00e3o retornar\u00e1 erro, mas retornar\u00e1 um dicion\u00e1rio com informa\u00e7\u00f5es que auxiliam a dar manuten\u00e7\u00e3o em caso de necessidade)\r\n- status_code \u2192 Status da requisi\u00e7\u00e3o (200,404,500)\r\n- url \u2192 URL completa da requisi\u00e7\u00e3o, ent\u00e3o por exemplo, se voc\u00ea fez como o exemplo acima `'/conteudos/publicos'`, ele retornar\u00e1 algo como `'https://www.meuendereco.com.br/conteudos/publicos'`\r\n- method \u2192 M\u00e9todo utilizado na requisi\u00e7\u00e3o (GET,POST,DELETE,PUT)\r\n- list_of_responses \u2192 Lista das responses que o navegador obteve at\u00e9 o momento da chamada da fun\u00e7\u00e3o\r\n- list_of_requests  \u2192  Lista das requests que o navegador obteve at\u00e9 o momento da chamada da fun\u00e7\u00e3o (Essa tende a ser uma lista bem maior, recomendo utilizar pprint para exibir caso deseje)\r\n\r\n### Exemplo de retorno da fun\u00e7\u00e3o\r\n\r\nAbaixo \u00e9 um exemplo do objeto retornado com as informa\u00e7\u00f5es necess\u00e1rias para realizarmos valida\u00e7\u00f5es\r\n\r\n```python\r\nObjectIntercepted(_body={'channelNumber': 33,\r\n                         'code': 'BH',\r\n                         'name': 'GLOBO MINAS',\r\n                         'serviceIDHD': '23104',\r\n                         'serviceIDOneSeg': '23128'},\r\n                  _status_code=200,\r\n                  _url='https://affiliates.video.globo.com/affiliates/info',\r\n                  _method='GET')\r\n```\r\n\r\n---\r\n",
    "bugtrack_url": null,
    "license": "MIT License",
    "summary": "Interceptador de requisi\u00e7\u00f5es http n\u00e3o oficial do selenium 4",
    "version": "1.0.2",
    "project_urls": null,
    "split_keywords": [
        "selenium",
        " network",
        " intercept",
        " http",
        " requests",
        " selenium network intercept",
        " selenium intercept",
        " search download selenium"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "db4e2ea535bd790e8457aa7e6d4e16042c4f716150016b634fdbcf7fe902f5d7",
                "md5": "ead4363c6d8e72ee8a43f01128dc8141",
                "sha256": "e0382535c1b7fc6b1d9e5adebab77126f78df0634d58f2871242865793220b70"
            },
            "downloads": -1,
            "filename": "selenium_network_intercept-1.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "ead4363c6d8e72ee8a43f01128dc8141",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 8977,
            "upload_time": "2024-04-26T22:12:43",
            "upload_time_iso_8601": "2024-04-26T22:12:43.290191Z",
            "url": "https://files.pythonhosted.org/packages/db/4e/2ea535bd790e8457aa7e6d4e16042c4f716150016b634fdbcf7fe902f5d7/selenium_network_intercept-1.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-26 22:12:43",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "selenium-network-intercept"
}
        
Elapsed time: 0.25602s