[Python] Python + Selenium Web Driver, HTTPConnectionPool(host='localhost', port='NNNNN'):...

Discussão em 'Python' iniciado por Stack, Maio 4, 2025.

  1. Stack

    Stack Membro Participativo

    Python Selenium Web Driver


    Este erro não ocorre sempre que o código é executado, mas acontece aleatoriamente.

    O problema é ao usar CDP quando o código tenta limpar todo o armazenamento de um site.

    Antes de executar o comando CDP, estou executando um comando javascript no contexto 'top' do site para que todas as solicitações sejam bloqueadas a fim de interromper a geração de novos cookies ou outros dados.

    Escolhi fazer dessa forma em vez de executar o comando CDP para desabilitar a rede porque, quando desabilitada pelo CDP antes de acessar uma nova página, você precisa habilitar a REDE novamente e no meu teste desabilitar a rede pelo CDP não foi tão eficiente para o meu propósito.

    Depois disso, é feita uma tentativa de excluir todo o armazenamento do site.

    driver.execute_cdp_cmd("Storage.clearDataForOrigin", {
    "origin": "https://example.com", # Especifique o domínio do site
    "storageTypes": "all"
    })


    Na maioria das vezes ele consegue fazer essa limpeza, mas às vezes ele dá esse erro


    urllib3.exceptions.ReadTimeoutError


    HTTPConnectionPool(host='localhost', port=62196): Read timed out. (read timeout=120)
    ​

    driver = webdriver.Chrome()

    Depois de gerar o erro 'Read timed out', o programa fica muito lento e não consegue executar as funções basicas de driver como driver.get("https://example.com/")

    E demora muito tempo para tentar executar driver.get ou outros comandos driver, sempre resultando em uma excessão.

    Depois do erro, por exemplo, quando é executado o commando driver.get(site), eu notei que o meu script pode levar até 10 minutos para tentar acessar o site no qual sempre acaba gerando uma excessão. Em outras palavras o script fica bugado depois do erro 'Read timed out'

    O script\programa somente retorna ao normal se eu for no Chrome inicializado pelo webdriver e recarregar o site manualmente clicando no botão de recarregar.

    Script Reproduzível:


    from selenium import webdriver
    from urllib3.exceptions import ReadTimeoutError

    driver = webdriver.Chrome()
    driver.execute_cdp_cmd("Network.enable", {})

    def acessar_site():
    while True:
    try:
    driver.get("https://x.com/")
    print("Site acessado com Sucesso!")
    break
    except Exception:
    print("Não consegui acessar o site, tentando novamente")
    driver.stop_client()

    def limpeza_completa_offline():
    try:
    acessar_site()
    # Define o código JavaScript que bloqueia todas as requisições
    block_requests_script = """
    window.blockAllRequests = () => {
    // Substituir fetch
    const originalFetch = window.fetch;
    window.fetch = (...args) => {
    console.log('Requisição fetch bloqueada:', args);
    return new Promise(() => {}); // Retorna uma Promise que nunca será resolvida
    };

    // Substituir XMLHttpRequest
    const originalXhrOpen = window.XMLHttpRequest.prototype.open;
    const originalXhrSend = window.XMLHttpRequest.prototype.send;

    window.XMLHttpRequest.prototype.open = function(method, url, ...rest) {
    this._url = url;
    originalXhrOpen.call(this, method, url, ...rest);
    };

    window.XMLHttpRequest.prototype.send = function(...args) {
    if (this._url) {
    console.log('Requisição XMLHttpRequest bloqueada:', this._url);
    }
    };

    // Substituir EventSource (SSE)
    const originalEventSource = window.EventSource;
    window.EventSource = function(url, config) {
    console.log('Requisição EventSource bloqueada:', url);
    };

    // Substituir WebSocket
    const originalWebSocket = window.WebSocket;
    window.WebSocket = function(url, protocols) {
    console.log('Requisição WebSocket bloqueada:', url);
    throw new Error("WebSocket bloqueado!");
    };
    };

    window.blockAllRequests();
    """

    print("Injetando java no contexto da página: bloquear requisições")
    # Executa o código JavaScript para bloquear as requisições
    driver.execute_script(block_requests_script)

    print("Comando CMD: Limpando Local Storage, IndexedDB, Cache Storage, Interrompendo e Desregistrando os Services Workers.")
    # Limpa Local Storage, IndexedDB, Cache Storage, Interrompe e Desrigistra os Services Workers.
    driver.execute_cdp_cmd("Storage.clearDataForOrigin", {
    "origin": "https://x.com", # Especifique o domínio do site
    "storageTypes": "all"
    })
    except ReadTimeoutError as RTE:
    print(F"Excessão: {RTE}")
    print("Breakpoint; Primeiro tente executar a def no pdb e depois tente continuar a execução do script >> acessar_site()")
    breakpoint()
    acessar_site()


    while True:
    # Algum momento o erro aparece
    limpeza_completa_offline()


    Perguntei para o suporte do próprio selenium webdriver e recebi uma resposta:


    O Selenium atua como um servidor HTTP que aceita solicitações e fornece respostas de forma síncrona.

    Um erro de tempo limite de leitura significa que o cliente http enviou um comando ao driver e nunca obteve resposta. Na maioria das vezes, isso significa que não é possível interagir com o driver novamente.

    O ponto principal é que normalmente não é possível se recuperar de tempos limite de leitura, e não é necessariamente surpreendente que execute_cdp_cmd() resulte em um tempo limite de leitura. Dependendo de quanto tempo normalmente leva, pode fazer sentido aumentar o tempo limite de leitura.
    ​

    Gostaria de saber ao menos como aumentar o tempo limite de leitura.

    Continue reading...

Compartilhe esta Página