http.client.RemoteDisconnected: удаленное закрытое соединение без ошибки ответа с использованием driver.quit () из Selenium Python - PullRequest
1 голос
/ 04 августа 2020

Я использую:

  • Python 3.8
  • Selenium 3.141.0
  • Windows 10 (за прокси)
  • Chrome: 84.0.4147.105
  • Chromedriver: 84.0.4147.30
  • Ma c 10.15.6 (не имеет прокси)

Здесь это мой код:

from selenium import webdriver

driver = webdriver.Chrome("D:/webdriver/chromedriver.exe")
driver.get("https://github.com")
driver.quit()

При выполнении driver.quit() возникает исключение:

Traceback (most recent call last):
  File "C:/Users/taiping/Desktop/data_test/selenium_test.py", line 5, in <module>
    driver.quit()
  File "D:\python3.8\lib\site-packages\selenium\webdriver\chrome\webdriver.py", line 158, in quit
    self.service.stop()
  File "D:\python3.8\lib\site-packages\selenium\webdriver\common\service.py", line 151, in stop
    self.send_remote_shutdown_command()
  File "D:\python3.8\lib\site-packages\selenium\webdriver\common\service.py", line 127, in send_remote_shutdown_command
    url_request.urlopen("%s/shutdown" % self.service_url)
  File "D:\python3.8\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "D:\python3.8\lib\urllib\request.py", line 525, in open
    response = self._open(req, data)
  File "D:\python3.8\lib\urllib\request.py", line 542, in _open
    result = self._call_chain(self.handle_open, protocol, protocol +
  File "D:\python3.8\lib\urllib\request.py", line 502, in _call_chain
    result = func(*args)
  File "D:\python3.8\lib\urllib\request.py", line 1379, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "D:\python3.8\lib\urllib\request.py", line 1354, in do_open
    r = h.getresponse()
  File "D:\python3.8\lib\http\client.py", line 1332, in getresponse
    response.begin()
  File "D:\python3.8\lib\http\client.py", line 303, in begin
    version, status, reason = self._read_status()
  File "D:\python3.8\lib\http\client.py", line 272, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

Но этот код не содержит ошибок на моем Macbook. В чем проблема?

Обновлено: 2020-08-05

Я открываю отладчик и обнаруживаю, что для каждого объекта HTTPConnection установлен общесистемный http-прокси. Но я не устанавливал никаких параметров в своем коде. И метод driver.quit отправит http://localhost: 59717 / shutdown на chrome для выполнения выхода. Поэтому я предполагаю, что URL-адрес выключения фактически отправляется на прокси-сервер, а не в локальный браузер.

И я пытаюсь использовать скрипач для проверки информации о запросе. Есть еще одна проблема, что я не могу декодировать запросы https из-за некоторых конфигураций сертификатов. Поэтому я меняю аргумент driver.get() на внутренний веб-адрес моей компании. Результат: Если я закрою скрипач, снова возникнет ошибка RemoteDisconnected. А если открыть скрипач, все работает.

Что случилось? Я знаю, что скрипач установил прокси-сервер на 127.0.0.1:8888, поэтому я думаю, что что-то не так с настройками прокси. Но исправить не могу. Я предполагаю, что chrome использует системный прокси, чтобы домашняя страница github могла открываться правильно, но при отправке URL-адреса выключения на chrome объект запроса не должен использовать системный прокси, но это так.

Am Я прав? И как исправить эту проблему?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

Я открыл проблему с репозиторием селена

Мое решение - отправить запрос, не имеющий прокси. Вот мой код:

from selenium import webdriver
import http.client

driver = webdriver.Chrome("D:/webdriver/chromedriver.exe")
driver.get("https://github.com")
# driver.quit()
# use below to quit and clean.
conn = http.client.HTTPConnection(driver.service.service_url.split("//")[1])
conn.request("GET", "/shutdown")
conn.close()
del driver

Это хорошо работает. Без исключений и chromedriver.exe закрыт. Но я считаю, что это не лучшее решение.

0 голосов
/ 04 августа 2020

Это сообщение об ошибке ...

    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

... подразумевает, что не было ответа от удаленного конца и соединение с удаленным концом было закрыто.

Синтаксически, там в вашем блоке кода ошибок нет. Однако Домашняя страница GitHub содержит элементы AJAX.

Этот вариант использования

Скорее всего, когда веб-страница достигает document.readyState равно "complete", вызовы AJAX все еще активны, что подразумевает подключение к удаленный конец еще не был установлен полностью. В таком сценарии при вызове driver.quit() возникает указанная выше ошибка.

Repro

Когда я выполнил ваш вариант использования, я получил аналогичную ошибку на моем localhost следующим образом:

  • Код Блок:

    from selenium import webdriver
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://github.com")
    driver.quit()
    
  • Вывод в консоль:

    DevTools listening on ws://127.0.0.1:61488/devtools/browser/62c450cf-7ed5-4205-bb9c-d7e50cd13173
    [2780:12796:0804/183946.157:ERROR:broker_win.cc(55)] Error reading broker pipe: The pipe has been ended. (0x6D)
    

Решение

Для более чистого выполнения driver.quit() вам необходимо вызвать WebDriverWait для некоторых элементов только для Javascript и AJAX для завершения, а затем вызовите driver.quit() следующим образом:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.get("https://github.com")
WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//h1[text()='Built for developers']")))
driver.quit()

Ссылки

Вы можете найти пару подробных обсуждений в:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...