ConnectionAbortedError: [WinError 10053] 已建立的连接被主机中的软件中止

Posted

技术标签:

【中文标题】ConnectionAbortedError: [WinError 10053] 已建立的连接被主机中的软件中止【英文标题】:ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine 【发布时间】:2019-01-04 19:42:30 【问题描述】:

由于某种原因,当我打开嵌套的 webdriver 实例时,会出现以下错误。不知道这里发生了什么。

我正在使用 Windows 10、 geckodriver 0.21.0、Python 3.7。

ConnectionAbortedError:[WinError 10053]

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 (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

这里是codepen,,因为它太长了!

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

有人知道是什么原因导致连接中断吗?

【问题讨论】:

你能告诉我create_webdriver_instance()是做什么的吗? @AndreiSuvorkov 当然。我马上加进去 geckodriver.log 文件说明了什么? @K.Dackow 明天我醒来的第一件事就是再次运行该部分脚本并发布 geckodriver.log 并发送一条消息通知你 @K.Dackow 好的,我在代码笔中添加了 geckodriver.log,因为它使我超出了字符限制。 tbh 我不知道我在其中或应该在其中寻找什么:/ 【参考方案1】:

正如documentation 所说:

软件导致连接中止。已建立的连接是 被主机中的软件中止,可能是由于数据 传输超时或协议错误。

可能的原因:

    超时或其他网络级错误。 网络连接中断 防火墙关闭了连接,因为它打开的时间过长 连接在进程完成之前关闭 防病毒软件阻止连接

等等

同时尝试将geckodriver 0.21.0 降级为geckodriver 0.20.1。你可以下载它here。 geckodriver 0.21.0https://***.com/a/51236719/8625512好像有问题

PS:

options.add_argument('-headless')

应该是:

options.add_argument('--headless')

【讨论】:

你能看看我刚刚在我的问题中发布到代码笔的geckodriver.log 吗?!?!我不确定要在其中寻找什么?? 您能否提供一个代码来创建嵌套的 webdriver。也请描述过程。您是否在孩子完成之前关闭父网络驱动程序? 我已经提供了创建“嵌套”网络驱动程序的代码。 _ff 是嵌套的网络驱动程序,在我关闭 _ff 之前,我不会关闭父级 (ff)【参考方案2】:

此错误消息...

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() 中,您在哪个函数中遇到此问题并不清楚。

也许仔细查看codepen 中的日志表明错误来自webdriver.Firefox(profile)


原因

此错误背后可能有多种原因:

存在防病毒软件。 防火墙阻止端口。 网络配置。 问题可能是由CORS 引起的。 由于启用了 HTTP keep-alive 连接

解决方案

第一步将查明是否有任何软件阻止了与您计算机中的服务器的连接。除此之外,可能的解决方案是:

禁用杀毒软件。 禁用防火墙

确保您系统上的 /etc/hosts 包含以下条目:

127.0.0.1   localhost.localdomain localhost

根据Connection was aborted by the software in your host machine,您需要允许像http://localhost:8080/reactive-commands这样的本地主机路由

根据Keep-Alive connection to geckodriver 0.21.0 dropped after 5s of inactivity without re-connection using Selenium Python client

AutomatedTester:这个问题不是因为我们在发出请求时没有连接。如果这是问题所在,我们将会抛出一个 httplib.HTTPConnection 异常。相反,当我们建立连接并关闭它并尝试解析响应时,会抛出一个 BadStatusLine。现在这可能是 python stdlib 错误、httplib 错误或 selenium 错误。 WIP.

andreastt:geckodriver 团队正在努力将服务器端超时值扩展为更合理的值。正如我所说,这将有助于缓解这个问题,但不能从根本上解决它。在任何情况下,5 秒都可能太短而无法从持久的 HTTP 连接中获得真正的好处,而将其增加到 60 秒左右会有更好的性能。


结论

Selenium 3.14.0 刚刚发布。如果您受到此问题的影响,请相应升级。


参考资料:

Flask broken pipe with requests Cross-Origin Resource Sharing (CORS) Connection was aborted by the software in your host machine [WinError 10053] with the 0.21.0 Keep-Alive connection to geckodriver 0.21.0 dropped after 5s of inactivity without re-connection using Selenium Python client Support keep alive connections Struct hyper::server::Server Urllib3

【讨论】:

【参考方案3】:

这个问题发生在我身上,由于错误是间歇性的,我最初认为是防火墙或防病毒问题,但它要简单得多。

单击“发送”按钮时,我有一个表单被提交了两次。该按钮被设置为 type="submit",并且当单击此按钮时,一个 javascript 代码提交了此表单。我把按钮改成type="button",问题就解决了。

【讨论】:

【参考方案4】:

Windows 已实现受控文件夹访问,即阻止未经授权的应用程序访问您的重要文件(意味着几乎所有由 Windows 安装的文件)。这是为了防止恶意软件对数据进行加密和勒索。

如果它阻止任何应用程序,Windows 将弹出通知。

您可以通过受控文件夹访问来允许应用/程序访问。

【讨论】:

【参考方案5】:

另一个原因: 当 python 服务的页面正在加载时,用户可以在传输完成之前取消加载,通过按 Esc 或单击“X”(停止加载此页面按钮)。这通常在服务器速度较慢时完成。 例如,如果用户在图像完全加载之前转到1 并按 Esc,则会发生此错误。在这种情况下,您必须处理它

【讨论】:

【参考方案6】:

我通过 Firefox 中的浏览器配置解决了这个问题:转到 设置 -> 常规 并向下滚动到 网络配置。在打开的窗口中,我选择了 DNS PROXY USE SOCKS 并激活了 DNS over HTTPS。我选择了所有三个可用选项。

【讨论】:

【参考方案7】:

浏览器中的另一个原因(不是 webdriver):不经常更新的扩展程序。在我的情况下,当禁用包含一些不推荐使用的代码的扩展时,这个问题得到了解决。尝试使用隐身窗口进行快速检查。

【讨论】:

您的 webdriver 实例中运行了扩展程序?!甚至不知道这是可能的 o: chrome?火狐? 不,很抱歉我没有澄清。我在浏览器的控制台中而不是在网络驱动程序中收到此错误。【参考方案8】:

我遇到了同样的问题。如果同一个请求多次发送到服务器,则会出现此问题。

这个问题发生在我身上,由于错误是间歇性的,我最初认为是防火墙或防病毒问题,但它要简单得多。

单击“发送”按钮时,我有一个表单被提交了两次。该按钮被设置为 type="submit",并且当单击此按钮时,一个 javascript 代码提交了此表单。我把按钮改成type="button",问题就解决了。

【讨论】:

很高兴听到这个消息

以上是关于ConnectionAbortedError: [WinError 10053] 已建立的连接被主机中的软件中止的主要内容,如果未能解决你的问题,请参考以下文章

ConnectionAbortedError: [WinError 10053] 您的主机中的软件中止了一个已建立的连接

ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的

Python 会话 10054 连接中止错误

python dir(__builtins__)

python02-basic-num-str