ConnectionAbortedError: [WinError 10053] Установленное соединение было прервано программным обеспечением вашей хост-машины

По какой-то причине я получаю следующую ошибку только, когда открываю вложенный экземпляр webdriver. Понятия не имею, что здесь происходит.

Я использую Windows 10, geckodriver 0.21.0 и Python 3.7.

ConnectionAbortedError: [WinError10053]

An established connection was aborted by the software in your host machine

Часть скрипта, которая работает нормально

tab_backers = ff.find_element_by_xpath('//a[@gogo-test="backers_tab"]')

try:
    funding_backers_count = int(''.join(filter(str.isdigit, str(tab_backers.text))))
except ValueError:
    funding_backers_count = 0

if funding_backers_count > 0:
    tab_backers.click()

    see_more_backers = WebDriverWait(ff, 10).until(
        EC.element_to_be_clickable((By.XPATH, '//ui-view//a[text()="See More Backers"]'))
    )
    clicks = 0
    while clicks < 0:
        clicks += 1
        ff.WebDriverWait(ff, 5).until(
            see_more_backers.click()
        )

    for container in ff.find_elements_by_xpath('//ui-view//div[@class="campaignBackers-pledge ng-scope"]'):
        backers_profile = container.find_elements_by_xpath('./*/div[@class="campaignBackers-pledge-backer-details"]/a')
        if len(backers_profile) > 0:
            backers_profile = backers_profile[0].get_attribute('href') 
        else:
            backers_profile = 'Unknown'
        backers_name = safe_encode(container.find_element_by_xpath('(./*/div[@class="campaignBackers-pledge-backer-details"]/*)[1]').text)
        backers_timestamp = container.find_element_by_xpath('./*/div[@class="campaignBackers-pledge-backer-details"]/div[contains(@class, "campaignBackers-pledge-backer-details-note")]').text
        backers_contribution = container.find_element_by_xpath('./*//*[contains(@class, "campaignBackers-pledge-amount-bold")]').text
        if backers_contribution != 'Private':
            backers_contribution = int(''.join(filter(str.isdigit, str(backers_contribution))))
        if backers_profile != 'Unknown':

Часть скриптовой системы, вызывающая разрыв соединения

            _ff = create_webdriver_instance()
            _ff.get(backers_profile)
            _ff.quit()

Traceback

Traceback (most recent call last):
  File "C:\Users\Anthony\Desktop\test.py", line 271, in <module>
    backers_profile = container.find_elements_by_xpath('./*/div[@class="campaignBackers-pledge-backer-details"]/a')
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 381, in find_elements_by_xpath
    return self.find_elements(by=By.XPATH, value=xpath)
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 680, in find_elements
    {"using": by, "value": value})['value']
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 318, in execute
    response = self.command_executor.execute(driver_command, params)
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 472, in execute
    return self._request(command_info[0], url, body=data)
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 495, in _request
    self._conn.request(method, parsed_url.path, body, headers)
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 1229, in request
    self._send_request(method, url, body, headers, encode_chunked)
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 1275, in _send_request
    self.endheaders(body, encode_chunked=encode_chunked)
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 1224, in endheaders
    self._send_output(message_body, encode_chunked=encode_chunked)
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 1055, in _send_output
    self.send(chunk)
  File "C:\Users\Anthony\AppData\Local\Programs\Python\Python37\lib\http\client.py", line 977, in send
    self.sock.sendall(data)
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

geckodriver.log

Вот он в коде,, потому что он слишком длинный!

Функция create_webdriver_instance

def create_webdriver_instance():
    options = Options()
    options.add_argument('-headless')
    try:
        ua_string = random.choice(ua_strings)
        profile = webdriver.FirefoxProfile()
        profile.set_preference('general.useragent.override', ua_string)
        return webdriver.Firefox(profile) # profile, firefox_options=options
    except IndexError as error:
        print('\nSection: Function to Create Instances of WebDriver\nCulprit: random.choice(ua_strings)\nIndexError: {}\n'.format(error))
        return webdriver.Firefox() # firefox_options=options


Кто-нибудь знает, что может быть причиной прерывания соединения?


Ответ 1

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

ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

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


Установленное соединение было прервано программным обеспечением вашей главной машины

В соответствии с вашей попыткой кода ошибка явно выходит из функции create_webdriver_instance() которая содержит:

try:
    ua_string = random.choice(ua_strings)
    profile = webdriver.FirefoxProfile()
    profile.set_preference('general.useragent.override', ua_string)
    return webdriver.Firefox(profile)

А также:

except IndexError as error:
    print('\nSection: Function to Create Instances of WebDriver\nCulprit: random.choice(ua_strings)\nIndexError: {}\n'.format(error))
    return webdriver.Firefox()

Таким образом, неясно, из какой функции вы столкнулись с этой проблемой среди return webdriver.Firefox(profile) или webdriver.Firefox().

Возможно, более пристальный взгляд на журналы в кодедеве предполагает ошибку, исходящую из webdriver.Firefox(profile).


Причины

За этой ошибкой может быть много причин:

  • Наличие антивирусных программ.
  • Брандмауэр блокирует порты.
  • Конфигурация сети.
  • Проблема может быть вызвана CORS.
  • Из-за включения соединений HTTP keep-alive

Решение

На начальном этапе будет выяснено, блокирует ли какое-либо программное обеспечение соединение с сервером на вашем компьютере. Кроме того, вероятными решениями являются:

  • Отключить антивирусные программы.
  • Отключите брандмауэр.
  • Убедитесь, что /etc/hosts в вашей системе содержит следующую запись:

    127.0.0.1   localhost.localdomain localhost
    
  • Поскольку соединение было прервано программным обеспечением вашей хост-машины, вам необходимо разрешить маршруты localhost, такие как http://localhost:8080/reactive-commands

  • В соответствии с подключением Keep-Alive к geckodriver 0.21.0, упавшим после 5s бездействия без повторного подключения с использованием Selenium Python client

    • AutomatedTester: Эта проблема не связана с тем, что мы не подключены во время выполнения запроса. Если это проблема, мы будем получать исключение httplib.HTTPConnection. Вместо этого BadStatusLine бросается, когда мы делаем соединение, закрываем его и пытаемся разобрать ответ. Теперь это может быть ошибка python stdlib, ошибка httplib или ошибка селена. Клиент Python для замены urllib с чем-то другим, который не обнаруживает такого же дефекта с Keep-Alive соединениями, это WIP.

    • andreastt: Команда geckodriver работает над расширением значения тайм-аута на стороне сервера до более разумного. Как я уже сказал, это поможет смягчить эту проблему, но не в корне ее не исправить. В любом случае верно, что пять секунд, вероятно, слишком низки, чтобы получить реальную выгоду от постоянных HTTP-соединений, и что увеличение его до примерно 60 секунд будет иметь большую производительность.


Вывод

Selenium 3.14.0 только что был выпущен. Если вы затронуты этой проблемой, обновите ее соответствующим образом.


Рекомендации:

Ответ 2

Как говорится в документации:

Программное обеспечение вызвало прерывание соединения. Установленное соединение было прервано программным обеспечением вашего хост-компьютера, возможно, из-за тайм-аута передачи данных или ошибки протокола.

Возможные причины:

  1. Тайм-аут или другая ошибка сетевого уровня.
  2. Сбой сети
  3. Брандмауэр закрыл соединение, потому что он был слишком длинным
  4. Соединение было закрыто до завершения процесса
  5. Антивирус блокирует соединение

и так далее.

Также попробуйте понизить geckodriver 0.21.0 до geckodriver 0.20.1. Вы можете скачать его здесь. Кажется, что проблема geckodriver 0.21.0 с geckodriver 0.21.0 fooobar.com/questions/7366017/...

PS:

options.add_argument('-headless')

должно быть:

options.add_argument('--headless')

Ответ 3

Эта проблема произошла со мной, и, поскольку ошибка была периодической, я изначально полагал, что это была проблема с брандмауэром или антивирусом, но это было намного проще.

У меня была форма, которая была отправлена дважды при нажатии кнопки ОТПРАВИТЬ. Для кнопки было задано значение type = "submit", и при нажатии этой кнопки код javascript отправлял эту форму. Я изменил кнопку на type = "button", и проблема была решена.

Ответ 4

В Windows реализован доступ к контролируемым папкам, который блокирует неавторизованное приложение для доступа к вашим важным файлам (означает практически все, что установлено Windows). Это сделано для предотвращения шифрования и выкупа вредоносными программами.

В Windows появится всплывающее уведомление, если оно заблокирует любое приложение.

Вы можете разрешить доступ к приложениям/программам через доступ к контролируемой папке.